如何拆分和管道多个NAudio流

Jea*_*sse 6 c# stream naudio

我有一个C#项目,使用来自Kinect 1,Kinect 2,Microphone或其他任何东西的输入音频流.

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

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

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

如何为组件C,D,E复制该流?

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

  • 我正在寻找一个"MultiStream",可以给我一个Stream实例,并将处理这项工作

组件A.

var MultiStream buffer = new MultiStream()
...
SendMyEventWith(buffer)
Run Code Online (Sandbox Code Playgroud)

组分B,C,D,E

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

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

有没有人有这种MultiStream类?

谢谢

cae*_*say 1

我不确定这是否是最好的方法,或者它比以前的答案更好,并且我不能保证这段代码是完美的,但我编写的代码实际上正是您所要求的,因为它很有趣- 一MultiStream类。

您可以在这里找到该类的代码:http ://pastie.org/10289142

使用示例:

MultiStream ms = new MultiStream();

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

Stream copy2 = ms.CloneStream();
ms.Read( ... );
Run Code Online (Sandbox Code Playgroud)

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