我正在使用即时录制视频的嵌入式设备。我想使用我们自己的自定义服务器将其流式传输到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解决了问题。还需要使用 -dash
作为libav使其在chrome中起作用。
我遇到了一个类似的问题,它在Firebox上正常工作,但仅在Chrome中播放视频的第一个片段,并且不要求其他任何内容。我的案子是通过简单地通过200
状态代码和Accept-Ranges: bytes
标题来解决的,从而解决了我的案例。
看起来很常见,请检查以下问题的更新部分:在Safari中工作的内容范围,但在Chrome中不工作