Firefox 在收到具有指定内容范围的 206 后不会请求更多数据

gar*_*hdn 5 firefox video-streaming node.js html5-video http-range

为了提供一些上下文,我有一个<video>标记,该标记具有src指向我的 node.js 服务器上的方法的属性。该方法mp4从另一台服务器获取文件,或者更确切地说是文件的一部分mp4,具体取决于Range浏览器指定的HTTP 标头,例如 - Range:bytes=0-

预期行为(Chrome 行为)

为了防止我的 node.js 服务器从第三方服务器下载整个文件,我实现了大约 5MB 的最大缓冲区,以便一次下载。因此,如果用户发送请求以获取带有标题的视频

GET /play-test/videoId HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept: */*
Referer: http://127.0.0.1:8000/movie/99861
Accept-Language: en-US,en;q=0.8,es;q=0.6
Range: bytes=0-
Run Code Online (Sandbox Code Playgroud)

..然后我的服务器将响应

HTTP/1.1 206 Partial Content
X-Powered-By: Express
Content-Range: bytes 0-5000000/415473786
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 5000001
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 12:50:42 GMT
Run Code Online (Sandbox Code Playgroud)

我相信,这是一个足够常见的模式 - 尽管客户端(在这种情况下,浏览器)已请求已请求bytes=0-(开始到结束),我反而用前 5MB 响应,最重要的是告诉客户端响应仅包含总共 415MB ( Content-Range: bytes 0-5000000/415473786) 中的5MB 。响应还具有206指示响应是部分响应的状态。

在 Chrome 中,这按预期工作 - 就在视频播放完前 5MB 的视频之前,它会向同一端点发出另一个请求,但带有标头

GET /play-test/videoId HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept: */*
Referer: http://127.0.0.1:8000/movie/99861
Accept-Language: en-US,en;q=0.8,es;q=0.6
Range: bytes=5000001-
Run Code Online (Sandbox Code Playgroud)

我再次以最大 5MB 的大小回应...

HTTP/1.1 206 Partial Content
X-Powered-By: Express
Content-Range: bytes 5000001-10000001/415473786
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 5000001
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 12:51:08 GMT
Run Code Online (Sandbox Code Playgroud)

这种模式一直持续到视频结束,用户使用搜索栏暂停或跳过,在这种情况下,浏览器会根据所需的时间请求特定的字节范围。正如我所说,一切都在 Chrome 中运行良好。

Firefox 行为

描述 Firefox 的行为比描述正确的行为更直接!

火狐请求

Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Range: bytes=0-
Referer: http://127.0.0.1:8000/movie/272
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

回复

206 Partial Content
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 5000001
Content-Range: bytes 0-5000000/415473786
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 13:15:49 GMT
X-Powered-By: Express
Run Code Online (Sandbox Code Playgroud)

然后就是这样 - Firefox 播放前 5MB 的视频,不再向服务器发出进一步的请求。搜索栏显示正确的视频持续时间,但搜索栏不起作用。当用户尝试搜索视频时,会跳回到开头并再次播放前 5MB。

任何帮助,将不胜感激。

idb*_*old -1

客户端(在本例中为浏览器)已请求已请求 bytes=0-(开始到结束),我改为以前 5MB 进行响应

我认为这就是你的问题所在。该规范规定,当客户端请求0-. 您没有遵循规范,因此它不起作用。