【问题标题】:Multiplexing streams? (Simultaneous r/w)多路复用流? (同时读/写)
【发布时间】:2014-12-17 19:22:41
【问题描述】:

我有一个 WebM 编写器 实例,它从 VP8 编码器 实例中将视频帧作为字节数组(媒体缓冲区)并将它们连续写入MemoryStream同时将它们打包成一个WebM 容器r.

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

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

-> 我卡住了

  1. 同时从内存流中读取
  2. 不断将数据写入连接的http客户端的响应流中

整个任务是针对 HTTP 直播流服务器。不幸的是,由于专有组件,我无法显示 WebM 编写器/VP8 编码器等的来源,但我希望你能明白。

我已经尝试过使用stream.CopyTo(),但似乎HttpListenerContext 将复制操作理解为正在完成,因此只返回了应该发送的一部分内容。同样使用StreamReader 从流中读取会在每个操作中设置位置,所以这也是没用的。

【问题讨论】:

    标签: c# multithreading http stream video-streaming


    【解决方案1】:

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

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

    另一个例子是this answer

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

    【讨论】:

      【解决方案2】:

      就像吉姆的回答一样,我写了Nerdbank.FullDuplexStream,这听起来可能是你想要的。

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 2018-08-26
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 2019-03-04
        • 2014-03-13
        • 1970-01-01
        相关资源
        最近更新 更多