2013-03-27 66 views
15

我看到吨问题有关从MP4视频容器开始结束搬迁moov原子,使视频“网络优化”或更容易流。似乎大多数工具在首次编码视频时都需要明确的选项来执行此操作,如果它可用的话。把MOOV原子放在MP4文件的开头是否有缺点?

如果放置原子在开始使流工作得更好,这是昂贵的后 - 事实上这样做,为什么我会永远要编码的视频,并在最后的原子?有什么好处?

回答

13

对文件末尾的MOOV进行编码通常是视频编码器的默认操作,因为它们倾向于通过一次写入输出文件来操作,并且只能知道MOOV原子的确切内容和大小完全写入音频和视频数据后,因为它包含绝对文件大小。

主要例子为这是FFmpeg的,与在此答案中发现的解释:https://stackoverflow.com/a/8066089/393701

FFmpeg的有一个选项保留空间此原子,但它不能保证数据将伏贴。

将MOOV原子放在最后并没有特别的好处,但在本地播放的情况下,在播放前查找文件结尾并不像在渐进式下载传送中那样昂贵。

+2

这只是很难想象的是,在30分钟服用,或一小时,或十,以创建编码的影片的范围,任何人都会注意额外的两分钟才能写出来的MOOV原子,然后拷贝过来剩下的完成的数据段。当然,I/O成本是由编码所需的计算放在首位? – Coderer 2013-03-27 15:36:49

+2

我想这取决于编码软件,但ffmpeg足够通用,“在事实之后重写文件”需要在当前状态下进行重大重构。 FLV文件和元数据也存在类似的问题,因此在编码之后需要使用像flvtool或flvmeta这样的软件来正确注入它们。我们还必须认识到,视频编码器并不总是将数据写入可搜索的数据流(例如网络数据流),而返回数据根本不可能。 – SirDarius 2013-03-27 16:03:09

+0

我知道这是不重要的,但我仍然会问; android的视频元素只能播放mp4文件,所以即使moov元素仍然在最后仍然通过http流播放视频而没有任何问题。这怎么可能?android如何处理没有moov原子的视频? – 2015-12-08 06:32:33

4

你总是希望把索引信息的文件的开头,有此布局,除了唯一一个没有任何隐藏费用:一边做捕获/转码,你可能无法提前知道多少空间你在开始时需要MOOV原子,其数据也不太好。所以你通常直接将有效载荷写入文件,然后通过添加MOOV和更新文件的其余部分来完成写操作。

相关问题