将MOOV原子放在MP4文件开头有什么缺点吗?

27

我看到很多关于将MP4视频容器的moov原子从结尾移动到开头以使视频“网页优化”或更易于流传播的问题。似乎大多数工具要求在首次编码视频时明确选择此选项(如果有的话)。

如果将该原子放在开头可以使流媒体效果更好,并且事后重新处理成本高昂,为什么我要将原子放在末尾进行视频编码?这有什么好处吗?

2个回答

28

在视频编码器中,将 MOOV 编码到文件结尾通常是默认操作,因为它们往往通过单遍写入输出文件运行,并且只有在完全写入音频和视频数据后才能知道 MOOV 原子的确切内容和大小,因为它包含绝对文件大小。

使用 -movflags +faststart,FFmpeg 允许您进行第二遍编码并将原子移动到开头。

在本地播放情况下,在文件末尾寻找播放之前,在 MOOV 原子结尾没有特殊的好处,但在渐进式下载传递中,这种做法不如在本地播放情况中不方便。


3
在30分钟、1小时或10小时的时间内创建一个编码电影,很难想象有人会注意到写出MOOV原子并复制其余完成的数据段所需的额外1到2分钟。毕竟,输入/输出成本相比首先进行编码所需的计算来说微不足道。 - Coderer
3
这取决于编码软件,但遗憾的是ffmpeg是通用的,因此“事后重写文件”在当前状态下需要进行重大重构。 FLV文件和元数据也存在类似的问题,因此需要像flvtool或flvmeta这样的软件来在编码后正确注入它们。还必须意识到视频编码器并不总是将数据写入可寻址流(例如网络流),在那里无法返回。 - SirDarius
1
我知道这不是正题,但我还是要问一下:安卓的视频元素只能播放mp4文件,即使moov元素在末尾,它仍然可以通过http流播放视频,没有任何问题。这是如何可能的?安卓如何处理没有moov原子的视频? - Sagar Pilkhwal
3
@SagarPilkhwal 我的猜测是通过使用部分HTTP请求来实现这一点。一旦知道了总文件大小,客户端就可以使用包含MOOV原子的字节范围进行HTTP请求,然后从开头恢复文件加载。 - SirDarius
1
是的,我想是这样的。我找到了这个链接,它讨论了我提到的问题:http://fabiensanglard.net/mobile_progressive_playback/index.php - Sagar Pilkhwal

6

您总是希望将索引信息放在文件开头,这种布局没有任何隐藏成本,除了一个:在进行捕获/转码时,您可能无法提前知道需要多少空间来存储 MOOV 原子,而且其数据也尚不可用。因此,通常直接将有效负载写入文件,并通过添加 MOOV 和更新文件的其余部分来完成写入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接