![为什么 H.264 视频在 FLV 容器中比在 MP4 容器中快得多?](https://linux22.com/image/1237881/%E4%B8%BA%E4%BB%80%E4%B9%88%20H.264%20%E8%A7%86%E9%A2%91%E5%9C%A8%20FLV%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E6%AF%94%E5%9C%A8%20MP4%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%BF%AB%E5%BE%97%E5%A4%9A%EF%BC%9F.png)
我正在开发一个视频网站,目前遇到了 H.264 格式的问题。我注意到 YouTube 将其高清视频放入 MP4 容器中,因此顺理成章地我也这么做了。
接下来,我安装了mod_h264_streaming
lighttpd 以使流媒体和时间线清理可以正常工作。
问题是大文件(>500MB,分辨率较高)需要很长时间才能开始缓冲(我读到 Flowplayer 和其他 Flash 播放器需要先下载元数据)。我使用 MP4Box 将 xmov 原子移动到文件前面(我也尝试了 Qt QuickStart),但这没有帮助。
接下来,我读到需要交错音轨,所以我也这么做了。但这并没有什么变化:视频仍然很慢。
因此我尝试将完全相同的 H.264 电影放入 FLV 容器中,播放缓冲几乎立即开始 — — 没有任何缓慢的现象。
那么我在这里忽略了什么?为什么我要选择带有模块的 MP4 容器mod_264_streaming
,而不要使用带有 lighttpd 内置的常规 FLV 容器,因为这个模块看起来超级慢mod_flv_streaming
?显然,许多网站都选择 MP4 容器,但我不明白为什么。
另外还有一个问题,我尝试使用 HTML5<video>
标签来播放相同的 H.264 MP4 电影,结果快如闪电!我查看了 lighttpd 的日志文件,发现 Flash 播放器video.mp4?start=234
每次清除时间线时都会附加内容,而使用原生 HTML5<video>
标签的浏览器则不会这样做。这是 Flash 的某种限制吗?为什么 Flash 流式传输不能像 HTML5 流式传输一样快?
答案1
TL;DR:当视频网站在视频中存储的元数据多于 FLV 支持的元数据,或使用 FLV 不支持的音频编解码器时,则使用 MP4。如果您没有充分的理由使用 MP4,FLV 的简单性和流媒体设计使其成为一个不错的选择。
至于 flash 的时间线清理,我不知道它为什么会这样做,因为我从未编写过 flash 代码,但这可能是它使用的旋钮,或者是专门与 adobe 的流媒体服务器配合使用以在文件中搜索的东西。它还可以作为一种阻止讨厌的用户将文件保留在磁盘上的方法。
您已经知道的一些内容:
FLV
和(又名 isomedia)容器之间存在根本区别MP4
。FLV 是 Adobe 从一开始就设计为流媒体容器的,并且它真的太简单了。它所做的就是发送一个视频数据包,然后是音频数据包,然后是视频数据包……但是,它仅支持很少的编解码器,并且除了毫秒级的时间戳外没有其他元数据。除非您需要 MP4 特定的功能,否则 FLV 就足够了。
另一方面,ISO媒体基于Apple的MOV容器。它被分成多个原子,并且有一个特定的原子,moov
需要在解码之前任何其他原子可以读取。你在 MP4 上遇到的问题是因为moov
原子写在文件末尾,这对于编码程序来说要容易得多。有一些工具,例如快速启动,它将进行必要的处理,将moov
原子放在文件的开头。因此,文件一旦有数据就会开始播放,而不需要完全下载后才能开始播放。
答案2
如果您使用 mov 容器,它可以直接流式传输,无需安装模块或放入 flv 容器并使用模块。这只是我的想法。使用 mov 并添加适当的 mime 类型 - 完成。