总是使用 -movflags faststart 参数有什么缺点吗?

总是使用 -movflags faststart 参数有什么缺点吗?

似乎很多网站,比如 YouTube,都建议moov atom 在文件前面(快速启动)

ffmpeg 不会将此作为默认行为,但您可以使用选项指定它-movflags faststart。我想知道始终使用此参数是否有任何缺点?

答案1

唯一的缺点是它可能需要多花几秒钟

根据输入的大小,通常需要几秒钟才能执行第二遍以将原子移动moov到文件的开头。

重新混合 1 小时视频的示例:

没有-movflags +faststart

ffmpeg -i input.mkv -c copy output.mp4
0m11.695s

-movflags +faststart

ffmpeg -i input.mkv -c copy -movflags +faststart output.mp4
0m12.252s

注意此选项仅适用于 MP4、M4A、M4V、MOV 输出。

答案2

写入 moov 原子甚至知道 moov 原子大小所需的信息直到整个文件处理完毕后才可用。因此,将 moov 原子放在开头的缺点以及许多工具默认不这样做的原因都与此事实有关。

如果以下任何一项对您来说都不是问题,那么您可以始终将 moov 放在开始处,并且不会有任何缺点。

  • 需要第二遍。这可能会使磁盘 I/O 量翻倍,因为必须从输入读取数据,写入磁盘,然后从磁盘读取并重新写入。当 I/O 速度非常慢时,例如写入网络驱动器时,这可能是不切实际的。

    请注意,某些软件可能会通过粗略估计编码开始时所需的 moov 原子大小并在输出开始时保留这么多空间以及误差幅度来优化这一点。在许多情况下,这将消除读回和重写文件其余部分的需要,而是寻找开头并仅覆盖一小部分,代价是为 moov 原子使用比必要略多的空间。

  • 输出不能通过管道传输到另一个命令或动态发送到标准输出,因为这些机制无法进行第二遍或向后查找。

答案3

我猜这个帖子需要更新。在最新的 ffmpeg (3.4.1) 上我得到:

$ time ffmpeg -y -f lavfi -i nullsrc=s=hd720:d=600 -preset ultrafast out.mp4
real 0m26.578s
$ time ffmpeg -y -f lavfi -i nullsrc=s=hd720:d=600 -movflags +faststart -preset ultrafast out.mp4
real 0m26.849s

结果相同。现在尝试使用真实视频:

$ time ffmpeg -y -i Sintel.2010.1080p.mp4 -preset:v ultrafast out.mp4
real 3m38.829s
$ time ffmpeg -y -i Sintel.2010.1080p.mp4 -preset:v ultrafast -movflags +faststart out.mp4
real 3m43.674s

大约 2% 的差异,这可能只是噪音。还需要注意的是,“开始第二遍:将 moov 原子移动到文件开头”阶段在 600Mb 输出文件上花费的时间不超过几秒钟。

相关内容