如何将实时h.264(IP摄像机)视频流式传输到浏览器? (奖励:低带宽和低延迟)

时间:2018-09-23 21:16:31

标签: video ffmpeg h.264 live-streaming chunked-encoding

我需要将实时h.264编码的视频从IP摄像机流传输到浏览器,同时支持所有常见的浏览器和移动设备(例如Android,Firefox,Chrome,IE,Safari(Mac OS和iOS)),以及同时将带宽要求和延迟保持在最低水平。

MPEG-DASH要求浏览器支持NOT supported by iOS的媒体源扩展。这样就可以了。

HLS为only supported by Safari and Edge

DASH似乎也施加了几秒钟的延迟,这不是可取的。

我希望能够对传入的h.264数据(即fragmented MP4)进行分块,将分块的数据通过Websockets传递给浏览器,然后在它们到达时将其转储到某种播放器中。 / p>

Broadway及其分支是javascript h.264解码器,并且有一个Broadway-stream项目支持流而不是文件,但是文档很差,我只能在以下情况下找到流的示例来源不存在。

最紧迫的问题是:当“分块数据”到达播放器或视频HTML元素时,如何将其交给浏览器?

我认为理想的设置是

  1. Use ffmpeg to transcode the original video to a chunked format(fMP4)
  2. Pipe the chunked output to a Node JS app,它通过Websocket发出每个块给所有连接的查看器
  3. 观看者的浏览器将每个传入的块都转储到某种呈现视频的解码器中。

我很清楚将接收到的块交给视频解码器。在不依赖Media Source Extensions的情况下如何做到这一点,并允许观众随机加入视频流?

1 个答案:

答案 0 :(得分:1)

您有点矛盾,因为这两件事:

低延迟分块数据不能一起使用,它们可以是一个或另一个。当您累积N秒长度的块时,会引入N秒延迟。

因此,如果您需要在所有设备的浏览器中播放的H.264实时流的低延迟播放,则唯一的选择是WebRTC。基于块的流式传输(例如HLS或Dash)将无济于事。

通过Websockets的

Media Source Extensions是另一种选择,它与通过Websocket流到浏览器中的MSE的块一起工作。但您需要发送30-100毫秒长的数据块,以保持亚秒级的延迟。它还不适用于iOS。

在这里您可以将WebRTC和MSE的延迟与实时H.264 IP摄像机进行比较: http://umediaserver.net/umediaserver/demohtml5WebRTCplayer.html http://umediaserver.net/umediaserver/demohtml5MSEplayer.html