c# - 如何拆分和传输多个 NAudio 流

标签 c# stream naudio

我有一个 C# 项目使用来自 Kinect 1、Kinect 2、麦克风或其他任何设备的输入音频流。

waveIn.DataAvailable += (object sender, WaveInEventArgs e) => {
  lock(buffer){
    var pos = buffer.Position;
              buffer.Write(e.Buffer, 0, e.BytesRecorded);
              buffer.Position = pos;
  }
};

缓冲区变量是来自组件 A 的 Stream,它将由处理 Streams 的 SpeechRecognition 组件 B 处理。

我将添加新的组件 C、D、E,在 Streams 上工作以计算音调、检测声音、进行指纹识别或其他任何事情......

如何为组件 C、D、E 复制该 Stream?

  • 组件 A 发送一个事件“我有一个流做你想做的事”我不想通过一个事件“给我你的流”来反转逻辑

  • 我正在寻找一个“MultiStream”,它可以为我提供一个 Stream 实例并将处理该工作

组件 A

var MultiStream buffer = new MultiStream()
...
SendMyEventWith(buffer)

组件 B、C、D、E

public void HandleMyEvent(MultiStream buffer){
  var stream = buffer.GetNewStream();
  var engine = new EngineComponentB()
      engine.SetStream(stream);
}
  • MultiStream 必须是一个 Stream 来包装 Write() 方法(因为 Stream 没有数据可用机制)?
  • 如果一个 Stream 被组件 B Dispose() MultiStream 应该从它的数组中删除它?
  • MultiStream 必须在 Read() 上抛出异常才能要求使用 GetNewStream()

编辑:Kinect 1 本身提供一个 Stream ... :-( 我应该使用 Thread 将其泵入 MultiStream 吗?

有人有那种 MultiStream 类吗?

谢谢

最佳答案

我不确定这是最好的方法还是比以前的答案更好,而且我不保证这段代码是完美的,但我编写的代码确实符合您的要求,因为这很有趣 - MultiStream 类。

您可以在此处找到该类(class)的代码:http://pastie.org/10289142

使用示例:

MultiStream ms = new MultiStream();

Stream copy1 = ms.CloneStream();
ms.Read( ... );

Stream copy2 = ms.CloneStream();
ms.Read( ... );

copy1copy2 将在示例运行后包含相同的数据,并且它们将随着 MultiStream 写入而继续更新.您可以单独读取、更新位置和处理克隆的流。如果处置克隆的流将从 MultiStream 中移除,并且处置 Multistream 将关闭所有相关和克隆的流(如果这不是您想要的行为,您可以更改它)。尝试写入克隆的流将引发不受支持的异常。

关于c# - 如何拆分和传输多个 NAudio 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208770/

相关文章:

c# - 无法插入到远程数据库 C#

c# - 将 C# 类库导入 Visual C++

c# - 不受约束的类型参数转换

c#-4.0 - 如何使用C#.net解码amr文件

c# - 在 .NET 中计算多重相关性的好的统计库是什么?

javascript - 直接在可写流中传递可读流

javascript - 在 JavaScript 中实现 Stream

audio - WP7音频流问题

c# - 使用C#问题进行声音捕获

C# NAudio 在从另一个页面 POST 后生成 Noise WAV 文件而没有错误