5

为了提供一些上下文,我有一个<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-

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

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

我相信,这是一种足够常见的模式——尽管客户端(在本例中为浏览器)请求已请求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-

我再次以最大 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

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

火狐行为

描述 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

回复

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

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

任何帮助,将不胜感激。

4

1 回答 1

-1

客户端(在本例中为浏览器)已请求已请求字节 = 0-(从头到尾),我已响应前 5MB

我认为那是你的问题。规范说,当客户要求0-. 您没有遵循规范,因此它为什么不起作用。

于 2015-10-21T20:48:27.387 回答