多路复用流? (同时r / w)

时间:2014-10-22 10:53:25

标签: c# multithreading http stream video-streaming

我有一个 WebM编写器实例,它将视频帧作为来自 VP8编码器实例的字节数组(媒体缓冲区)并连续将它们写入{ {1}}将它们打包成 WebM容器 r。

我还有一个MemoryStream异步等待http请求。当客户端到达时,会创建一个新的HttpListener,其中包含要在响应流(HttpListenerContext)中写入的Stream实例。现在我想要多路复用'我的内存流,例如不断阅读并分享给不同的连接http客户端。所以:

  1. VP8编码器
  2. 中取帧
  3. 使用 WebM编写器
  4. 将它们写入内存流

    - > 我在这里

    1. 同时从内存流中读取
    2. 继续将数据写入已连接的http客户端的响应流
    3. 整个任务是针对HTTP直播服务器。不幸的是,由于专有组件,我无法显示WebM编写器/ VP8编码器等的来源,但我希望您能理解。

      我已经尝试使用Context.Response.OutputStream,但似乎stream.CopyTo()将复制操作理解为整理,因此只返回应发送的一大块内容。此外,使用HttpListenerContext从流中读取设置每个操作的位置,因此这也是无用的。

2 个答案:

答案 0 :(得分:1)

对于#3,您需要一个像FIFO队列一样的流。 .NET Framework不提供此类流。但是,几年前我创建了一个完全符合您要求的产品。它允许一个线程读取而另一个线程正在写入。您可以找到完整的来源,对其工作原理的解释以及Building a new type of stream上的示例。

基本上,它只是一个很大的内存缓冲区,我把它当成循环队列。如果缓冲区填满,则写入器将阻塞,直到读取一些数据。如果没有要读取的数据,读取器会阻塞,直到写入一些数据或直到流被标记为已完成(即流结束)。

另一个例子是this answer

在列表中解决#4只是一个写入每个响应流的循环问题。

答案 1 :(得分:1)

就像吉姆的答案一样,我写了Nerdbank.FullDuplexStream,听起来好像是您想要的。