我目前正在制作一项视频流服务,其中视频以每个大约 1MB 的块进行转码。 Firefox、Chrome 和 IE 的 HTML5 播放器都尽力请求部分内容(通过在请求中添加 Range 标头)。不幸的是,大多数时候这个标题看起来像这样:
Range:bytes=0-
我不想返回完整的内容,只想返回1MB的内容,所以我返回这个:
Content-Range:bytes 0-1048575/5074944
现在 Chrome 完全接受这一点,并继续请求部分内容,直到达到总长度。然而,Firefox 只发出一个请求,其中包含部分内容而不是完整内容。 Firefox 认为这是完整的内容,因此不会播放完整的视频,而只会播放其中的一部分。如何在 Firefox 中获得与 Chrome 中相同的行为?我尝试返回 416 Range not Satisfiable 但 Chrome 和 Firefox 似乎在收到此状态代码后都发出请求。
所以我最终放弃了这个并查看了Firefox的源代码。当 Firefox 收到的范围与预期不同时,开发人员会发表评论,询问在这种情况下该怎么做。该规范没有指定在这种情况下该怎么做,因此 Firefox 选择什么也不做。 Chrome 更有创意一点,并提出了开发人员认为最好的响应(这绝对是我想要的结果)。
看来我不是唯一有这个问题的人,否则我也不会得到赞成票。事实是:要让 Firefox 纠正这个问题,我们需要对规范进行更改,我认为这几乎是不可能的。因此,我将结束这个问题并将这篇文章标记为答案。
我正在实现一个http服务器来支持范围请求,但我无法让浏览器向我的服务器发送http范围请求。如果我发送 http 范围响应,浏览器(firefox 和 chrome)不会再发送任何 http 范围请求来获取文件的剩余部分,那么初始化浏览器发送更多 http 范围请求来获取文件的正确方法是什么?整个文件?
“如何在 Firefox 中获得与 Chrome 中相同的行为?”这个问题的答案就是升级到Firefox 57.0(Quantum)。此版本的 Firefox(在我自己的服务器代码的测试中,它对部分响应大小进行了相同的限制)能够在视频播放时请求额外的部分内容,与 Chrome 和 IE 的方式大致相同。
话虽如此,如果我在视频中向后查找,Firefox 将从新位置播放部分内容(大概使用该位置的缓存部分内容),但随后无法请求(或使用缓存)部分内容缓冲的内容用完 - 相反,它跳到末尾。
看起来 Firefox 开发人员已尝试解决部分内容小于预期的问题,但在搜索和/或缓存方面还没有完全正确。
我有兴趣知道 Firefox 源代码中关于“做什么”的原始评论在哪里,了解实际做了什么,也许可以向 Firefox 开发人员提供适当的反馈。