我有一个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)
编辑:Kinect 1提供了一个Stream本身... :-(我应该使用一个Thread来泵入MultiStream吗?
有没有人有这种MultiStream类?
谢谢
我不确定这是否是最好的方法,或者它比以前的答案更好,并且我不能保证这段代码是完美的,但我编写的代码实际上正是您所要求的,因为它很有趣- 一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将关闭所有相关和克隆流(如果这不是您想要的行为,您可以更改此行为)。尝试写入克隆流将引发不支持的异常。