大多数人将视频文件.mp4
视为文件,但实际上avi, mp4, mkv
还有更多只是在其中存储大量信息的容器。最好的类比是存档(您将其视为一个文件,但它是许多文件只是组合在一起并压缩)。大多数时候,这个容器里面有音频和视频(它们是同步的)和一些元数据,这些元数据有助于读取这个容器的程序了解里面的内容。您可以在此处阅读有关编解码器和容器的信息
当您观看视频时,您实际上正在访问这两个流(视频和音频)。在此期间,您的计算机正在执行多项操作:
- 解码视频流并将它们显示为一系列图像(如动画 gif)
- 解码音频并强制您的扬声器发出声音
- 一些额外的东西
为了了解视频导航(基本上是解码)是如何工作的,您需要了解视频是如何编码的。你可以在这里阅读。基本上一切都围绕三个主要框架发展:
- I 帧的可压缩性最低,但不需要其他视频帧进行解码。
- P 帧可以使用先前帧中的数据进行解压缩,并且比 I 帧更易于压缩。
- B 帧可以同时使用前一帧和前一帧作为数据参考,以获得最高的数据压缩量。
这样做是因为如果您将视频存储为一系列 .jpg 图片,它会非常庞大。P 帧和 B 帧可让您节省空间。(如果您曾经尝试从torrent打开未完全下载的视频,并且看到当您转发并强制您几乎看不到里面的内容时,现在您知道为什么会发生这种情况了,P帧和B帧不存储所有信息)。因此,当您向前和向后移动时,您就是在 I 帧之间导航。Container 存储有关这些 I 帧位置的信息,并允许您快速浏览文件。HTML5 通过 JS 为您提供 API 来访问这些数据以及在您进行 API 调用时mediaElement.currentTime = 122
浏览器只是将时间转换为您必须从中读取新信息的偏移量。如果您愿意,您可以深入研究一些开源浏览器代码并检查它是如何实现的。
写在一天结束的时候,所以我想吃饭,没有足够的时间。如果您发现一些不准确之处 - 请随时进行编辑。