多路复用流?(同时读写)

3
我有一个WebM写入器实例,它从VP8编码器实例作为字节数组(媒体缓冲区)获取视频帧,并将其连续地写入到MemoryStream中,同时将它们打包成WebM容器。我还有一个HttpListener,它异步等待http请求。当有客户端到达时,会创建一个新的HttpListenerContext,其中包含一个Stream实例,用于在响应流(Context.Response.OutputStream)中写入数据。现在我想要“多路复用”我的内存流,例如不断从中读取数据并共享给连接的不同HTTP客户端。因此:
1. 从VP8编码器中获取帧 2. 使用WebM writer将它们写入内存流 -> 在这里我卡住了 3. 同时从内存流中读取 4. 连续地将数据写入已连接的HTTP客户端的响应流
整个任务是为了HTTP直播流服务器。不幸的是,由于专有组件,我无法展示WebM writer/VP8编码器等的源代码,但我希望您能理解我的意思。
我已经尝试使用stream.CopyTo(),但似乎HttpListenerContext将复制操作理解为“完成”,因此仅返回应发送的一部分。此外,使用StreamReader从流中读取会使位置随每次操作前进,因此也没有用。
2个回答

3

1
对于#3,您需要一个类似FIFO队列的流。.NET Framework没有提供这样的流。然而,我几年前创建了一个完全符合您要求的流。它允许一个线程读取,而另一个线程写入。您可以在创建新类型的流中找到完整的源代码、工作原理和示例说明。
基本上,它只是一个大的内存缓冲区,我将其视为循环队列。如果缓冲区已满,则写入者会阻塞,直到读取一些数据。如果没有数据可读,则读取者会阻塞,直到写入一些数据或标记流为完成(即流结束)。
另一个例子在此答案中。
解决列表中的#4只是一个循环,将数据写入每个响应流即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接