【问题标题】:How does loading HTML5 video chunks actually work?加载 HTML5 视频块实际上是如何工作的?
【发布时间】:2021-12-17 02:34:09
【问题描述】:

基本上我的理解是:每当视频播放器播放媒体时,它都会以块的形式下载它,由RANGE 标头定义。服务器只提供从文件中请求的字节。

但是,当我在 chromium 中打开 mp4 文件时会发生什么:

以下是每个请求上与内容相关的响应标头,以及RANGE 请求标头,顺序相同:

---
accept-ranges: bytes
content-encoding: gzip
content-type: video/mp4

range: bytes=0-
---
accept-ranges: bytes
Content-Length: 100450390
Content-Range: bytes 0-100450389/100450390
content-type: video/mp4

range: bytes=100237312-
---
accept-ranges: bytes
Content-Length: 213078
Content-Range: bytes 100237312-100450389/100450390
content-type: video/mp4

range: bytes=32768-
---
accept-ranges: bytes
Content-Length: 100417622
Content-Range: bytes 32768-100450389/100450390
content-type: video/mp4

range: bytes=6127616-
---
accept-ranges: bytes
Content-Length: 94322774
Content-Range: bytes 6127616-100450389/100450390
content-type: video/mp4

据我所见,我理解第二个请求请求整个文件,第三个请求从文件末尾请求 200kb,第四个请求从 32kb 开始,最后一个请求文件从第 6 兆字节开始。

仅此一项看起来就很混乱,但是问题开头的屏幕截图进一步延续了混乱,这表明一半的响应与请求的尺寸不符?

此外,最后一个请求从开始播放视频到最后是 3 分钟长,服务器保持请求存活这么长时间,大部分时间都处于空闲状态,这不是很糟糕吗?寿命(我说的是特别是 apache)?

我想如果我必须总结我的问题,我想了解正在发生的事情并理解所有这些。

【问题讨论】:

    标签: html video server html5-video chunking


    【解决方案1】:

    每个视频都有一个描述视频的 MOOV atom。

    大多数编码器将它放在 mp4 的前面,因此当您下载视频时 - 它就在那里,首先是播放器可以解码有关视频的信息。

    但是,某些编码器会将 MOV 放在文件末尾。播放器使用范围请求,而不是将所有 100MB 的视频下载到 MOOV。

    1. 服务器上是否存在视频? (40b - 是的!)
    2. 前 32 KB 没有 moov...也许在最后?
    3. 最后 200 KB - 有 moov 吗?是的 - 好的,我们可以继续
    4. 好的,我们有 0-32KB(来自第 2 步).. 让我们继续 32 KB ->

    【讨论】:

    • 这听起来仍然很奇怪,但他们确实在最后一次请求中请求了完整的 94MB。我猜他们确定(来自 MOOV)即使内容没有以他们可以按块访问它的方式排序,因此必须实际获取整个内容来解码并浏览它。 TLDR;重新编码您的文件,使其“针对网络进行优化”。
    • 好吧,这是有道理的,但是如果它从 32KB 继续,为什么它只得到 65KB,然后停止?然后最后一个请求从 6MB 开始,它从哪里得到第一个 6MB?完整的视频是100.5MB,所以94MB是准确的,从6号开始。
    猜你喜欢
    • 2015-12-23
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    相关资源
    最近更新 更多