我正在使用即时录制视频的嵌入式设备。我想使用我们自己的自定义服务器将其流式传输到HTML5视频元素。我有几乎工作,希望得到一些帮助。
据我所知,我已经让libav / ffmpeg正确地完成了他们的工作。我在RAM中用mpov原子编码了一个mp4。我已将此文件写入磁盘,并且它应该在任何地方播放。
我认为问题在于我如何响应HTTP范围请求。当我尝试进行直播时,我会收到bytes:0-
的浏览器/播放器(目前已尝试使用Chrome,Firefox和VLC)的初始范围请求。我回复了一些初始字节。浏览器/播放器实际上播放得很好,但从未再问过。所以现场直播不起作用,只是前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
中会发生这种情况......
答案 0 :(得分:0)
渐进式下载不起作用。它浏览器假定文件永远不会改变。要播放实时流,您需要使用分段的MP4和媒体源扩展。
答案 1 :(得分:0)
这就是问题所在。我需要媒体扩展,我不清楚渐进式流媒体不适用于未知长度的直播。媒体扩展和websocket解决了这个问题。还需要将-dash
用于libav,以使其在Chrome中运行。
答案 2 :(得分:0)
我遇到了类似的问题,该问题在Firebox上运行正常,但仅在Chrome中播放了视频的第一个片段,而没有其他要求。我的情况很简单,只需使用状态代码200
和标头Accept-Ranges: bytes
使第一个响应不返回任何内容即可。
看起来很常见,请检查更新部分是否存在以下问题:Content-Range working in Safari but not in Chrome