我有一个WebM编写器实例,它将视频帧作为VP8编码器示例中的字节数组(媒体缓冲区),并将它们连续写入MemoryStream
,同时将它们打包到WebM容器r中。
我还得到了一个HttpListener
,它异步地等待http请求。当客户端到达时,会创建一个新的HttpListenerContext
,其中包含一个Stream
实例以写入响应流(Context.Response.OutputStream
)。现在我想"多路复用"我的内存流,例如不断从中读取并共享给不同连接的http客户端。因此:
- 从VP8编码器获取帧
- 使用WebM编写器将它们写入内存流
->我被卡住了
- 同时从内存流中读取
- 将数据连续写入连接的http客户端的响应流
整个任务针对的是HTTP实时流媒体服务器。不幸的是,由于专有组件的原因,我无法显示WebM编写器/VP8编码器等的来源,但我希望您能理解。
我已经尝试过使用stream.CopyTo()
,但HttpListenerContext
似乎将复制操作理解为完成,因此只返回应该发送的内容的一块。此外,使用StreamReader
从流中读取会在每次操作时向前设置位置,因此这也是无用的。
就像Jim的回答一样,我写了Nerdbank.FullDuplexStream,听起来可能正是你想要的。
对于#3,您需要一个类似FIFO队列的流。.NET Framework不提供这样的流。然而,我几年前创建了一个,它正是你想要的。它允许一个线程在另一个线程写入时进行读取。您可以在构建新型流中找到完整的源代码、对其工作原理的解释以及示例。
基本上,它只是一个很大的内存缓冲区,我把它当作一个循环队列。如果缓冲区已满,则写入程序将阻塞,直到读取一些数据为止。如果没有要读取的数据,则读取器会阻塞,直到写入一些数据,或者直到流标记为完成(即流结束)。
另一个例子就是这个答案。
解决列表中的第4个问题只是一个循环,它会写入每个响应流。