为什么 H.264 视频在 FLV 容器中比在 MP4 容器中快得多?

为什么 H.264 视频在 FLV 容器中比在 MP4 容器中快得多?

我正在开发一个视频网站,目前遇到了 H.264 格式的问题。我注意到 YouTube 将其高清视频放入 MP4 容器中,因此顺理成章地我也这么做了。

接下来,我安装了mod_h264_streaminglighttpd 以使流媒体和时间线清理可以正常工作。

问题是大文件(>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 是 Adob​​e 从一开始就设计为流媒体容器的,并且它真的太简单了。它所做的就是发送一个视频数据包,然后是音频数据包,然后是视频数据包……但是,它仅支持很少的编解码器,并且除了毫秒级的时间戳外没有其他元数据。除非您需要 MP4 特定的功能,否则 FLV 就足够了。

另一方面,ISO媒体基于Apple的MOV容器。它被分成多个原子,并且有一个特定的原子,moov需要在解码之前任何其他原子可以读取。你在 MP4 上遇到的问题是因为moov原子写在文件末尾,这对于编码程序来说要容易得多。有一些工具,例如快速启动,它将进行必要的处理,将moov原子放在文件的开头。因此,文件一旦有数据就会开始播放,而不需要完全下载后才能开始播放。

答案2

如果您使用 mov 容器,它可以直接流式传输,无需安装模块或放入 flv 容器并使用模块。这只是我的想法。使用 mov 并添加适当的 mime 类型 - 完成。

相关内容