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
我正在开发一种实时录制视频的嵌入式设备。我想使用我们自己的自定义服务器将其流式传输到 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