我有一个 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( ... );
copy1
和 copy2
将在示例运行后包含相同的数据,并且它们将随着 MultiStream
写入而继续更新.您可以单独读取、更新位置和处理克隆的流。如果处置克隆的流将从 MultiStream
中移除,并且处置 Multistream
将关闭所有相关和克隆的流(如果这不是您想要的行为,您可以更改它)。尝试写入克隆的流将引发不受支持的异常。
关于c# - 如何拆分和传输多个 NAudio 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208770/