15

如果您为托管在接受范围请求的服务器上的视频播放 HTML5 视频,那么当您尝试寻找视频的非缓冲部分时,您会从网络流量中注意到浏览器生成一个字节范围请求。我假设浏览器通过提前知道总视频大小并假设比特率恒定来计算字节(如果您在进度条中单击一半,那么它将在中途点请求字节)。但特别是如果视频是可变比特率的,它请求的字节似乎不太可能真正对应于用户点击的时间点,并且字节可能会落在帧的中间。

一旦开始获取某个任意字节,浏览器如何知道下一帧的开始是什么?

4

2 回答 2

17

我假设您的视频位于 Mp4 容器中。mp4 文件格式包含“盒子”的层次结构。其中之一是 Time-To-Sample (stts) 框。此框包含每一帧的时间(以紧凑的方式)。从这里您可以使用 Sample-to-Chunk (stsc) 原子找到包含帧的“块”。最后,块偏移原子 (stco) 为您提供文件中的字节偏移量。

影片的总时长存储在 Movie 标头原子 (mvhd) 中。当您移动拖拽手柄时,会根据影片的时长和您松开拖拽手柄的位置估算时间,根据之前下载的文件头进行计算,并发出请求。

编辑:如果不是 mp4,其他容器也有类似的机制。编解码器无关紧要。

于 2013-08-12T03:03:42.470 回答
1

许多视频/媒体类型,例如 MPEG,被编码在固定相同的数据包中。

MPEG 最初是在 188 字节数据包上设计的(最初选择为 ATM 传输层的 8 个信元,尽管现在已经过时了)。因此,如果您寻求 188 字节大小的倍数,播放器将在找到帧开始时读取有效数据包并恢复同步。

当浏览器/播放器到达可以独立于任何其他帧解码的 I 帧(或关键帧)时,可以显示实际图片。P 帧和 B 帧是插值,所以如果你寻找它们,你还不能构建图片。

看:

于 2013-08-12T01:29:34.803 回答