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

Sun*_*Sun 23 ffmpeg

似乎像 YouTube 这样的许多网站都建议在文件的前面添加 moov atom(快速启动)

ffmpeg 不会将此作为默认行为,但您可以使用-movflags faststart选项指定它。我想知道总是使用这个参数有什么缺点吗?

llo*_*gan 23

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

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

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

没有 -movflags +faststart

ffmpeg -i input.mkv -c copy output.mp4
0m11.695s
Run Code Online (Sandbox Code Playgroud)

-movflags +faststart

ffmpeg -i input.mkv -c copy -movflags +faststart output.mp4
0m12.252s
Run Code Online (Sandbox Code Playgroud)

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

  • 在最新版本的 ffmpeg(3.x+ 或 4.x+)中,正确的语法实际上是“-movflags faststart”(不带“+”符号)。请参阅:https://ffmpeg.org/ffmpeg-formats.html#Options-8 (5认同)
  • @HashimAziz 此选项仅适用于 MOV 系列,例如 MP4、M4A、M4V、MOV。对于其他任何事情,它都会被忽略。 (2认同)
  • @Hashimaziz 据我所知,MKV 中没有全局元数据块,因此无需将其移至文件开头。在 MKV 中,诸如时间索引之类的元数据附加到文件的每个块,这意味着跳到所需的时间索引或多或少是一个首先猜测字节偏移量并验证最近的时间索引的游戏。当然,这是一个不精确且缓慢的过程,对于没有“快速启动”优化的 MP4 来说非常相似(尽管有细微的差别)。 (2认同)

小智 16

我想这个线程需要更新。在最新的 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
Run Code Online (Sandbox Code Playgroud)

结果一样。现在尝试一个真实的视频:

$ 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
Run Code Online (Sandbox Code Playgroud)

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


tho*_*ter 12

正如您可能已经知道的那样,在整个文件被处理之后,编写 moov atom 甚至知道 moov atom 大小所需的信息是不可用的。

因此,在开始时使用 moov atom 的缺点,以及许多工具默认情况下不这样做的原因,都与这个事实有关。

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

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

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

  • 输出不能通过管道传输到另一个命令或即时发送到标准输出,因为这些机制无法进行第二次传递或向后搜索。

  • Ffmpeg 看起来在 MP4 复用器上有一个“-moov_size bytes”选项,可以在文件开头为 moov 保留一定数量的字节。我不知道它是如何与“-movflags faststart”交互的。我假设如果你只使用“moov_size bytes”,它应该像你想要的那样工作。但你需要测试一下。另外,自己估计 moov 原子的大小听起来有点碰运气。 (2认同)