HTML5 Progressive Streaming -- 没有后续范围请求

HTML5 Progressive Streaming -- no follow-up range requests

我正在开发一种实时录制视频的嵌入式设备。我想使用我们自己的自定义服务器将其流式传输到 HTML5 视频元素。我有这个 几乎 工作,需要一些帮助。

据我所知,我已经让 libav/ffmpeg 正常工作。我在文件开头用 moov 原子在 RAM 中编码了一个 mp4。我已将此文件写入磁盘,它可以在任何地方播放。

我认为问题在于我如何响应 HTTP 范围请求。当我尝试进行直播时,我从浏览器/播放器(目前已尝试 Chrome、Firefox 和 VLC)收到 bytes:0- 的初始范围请求。我回应了一些初始字节。浏览器/播放器实际上可以很好地播放,但再也不会询问。所以直播不工作,只有前 3 秒或其他什么。

我查看了部分内容的 RFC 规范,我的理解是我正在做我应该做的事情……但显然我不是。以下是 Chrome 作为请求者的请求/响应示例:


get /live.mp4 HTTP/1.1 host: localhost:1235 connection: keep-alive accept-encoding: identity;q=1, *;q=0 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36 accept: */* dnt: 1 accept-language: en-GB,en-US;q=0.9,en;q=0.8 range: bytes=0-

HTTP/1.1 206 Partial Content Accept-Ranges: bytes Content-Type: video/mp4 Content-Length: 182400 Content-Range: bytes 0-182399/*


同样,对于该请求/响应对,Chrome 播放前 182400 个字节但从不发出第二个请求。我认为在 Content-Range 中使用“*”会让这一切发生...

渐进式下载不是这样的。它浏览器假定文件永远不会改变。要播放直播流,您需要使用碎片化的 MP4 和媒体源扩展。

这就是问题所在。我需要媒体扩展,我不清楚渐进式流媒体是否适用于未知长度的直播。媒体扩展和 websocket 解决了这个问题。还需要为 libav 使用 -dash 以使其在 Chrome.

中工作

我遇到了一个类似的问题,它在 Firebox 上运行完美,但只播放了 Chrome 中视频的第一个片段,没有请求任何其他片段。我的案子很简单地通过第一个响应 return nothing with a 200 status code 和 Accept-Ranges: bytes header.

得到了解决

看起来很常见,检查更新部分是否有以下问题:Content-Range working in Safari but not in Chrome