FFMPEG 的输出依赖于机器吗?

FFMPEG 的输出依赖于机器吗?

我在笔记本电脑上创建了一个幻灯片,命令如下

ffmpeg  LOOPS -i "AUDIO_FLAC" -filter_complex "TRANSITION MAP 
concat=n=30:v=1:a=0[v]" -map "[v]" -map 30:a -shortest -q:v 1 -q:a 1 output.mp4

我在高配置的台式机上制作了同样的幻灯片,并认为两者的区别只是速度。然而,台式机生成的 mp4 文件要小得多,而且质量没有任何明显的损失。

更强大的 CPU 可以更有效地(在很大程度上)制作视频,这正常吗?或者两台机器之间存在一些差异(例如,安装的编解码器)。两台机器都安装了 Ubuntu 18.04。

更新:

当我检查两台机器生成的文件时,我发现了一些差异。

  1. 第二台机器,出于我不知道的原因,尽管如此,还是将 FLAC 输入更改为 12k mp3 q:a 1。然后,我不得不添加-c:a copy -strict -2以保持音频质量。

  2. 视频编解码器有所不同:

第一台机器:

Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 4296 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)

第二台机器:

Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuvj444p(pc), 1920x1080 [SAR 1:1 DAR 16:9], 324 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

我认为大小的巨大差异(大约五倍)是由于视频是由淡入淡出的幻灯片制作而成的。显然,这些编解码器对淡入淡出行为的处理方式截然不同(例如,重复帧;只是猜测)。

答案1

更强大的 CPU 可以更有效地(在很大程度上)制作视频,这正常吗?

这取决于你对“有效”的定义以及所使用的编码模式。在对视频进行编码时,你必须做出权衡,这些权衡包括:

  • 速度(就所使用的编码特征而言)
  • 文件大小
  • 质量

您可以修复其中任意两个点,但第三点需要权衡。例如,您可以以较小的尺寸编码出一个质量良好的文件,但编码需要很长时间。或者您可以修复质量参数并选择快速编码模式,这将为您提供更大的文件。

但请注意,除非将 CPU 的速度考虑在内,否则此“速度”与时间无关。如果您拥有更强大的 CPU 并为编码指定固定质量,则假设速度设置相同,文件大小仍将相同。编码过程将更快地完成。

根据 CPU 功能的不同,质量和/或文件大小也可能会有细微差别,例如,编码器可能会使用特定于平台的优化。

此外,使用多线程时,编码过程的输出不能保证是确定性的。您不应该看到任何较大的文件大小或质量差异,但帧校验和将不匹配。

或者两台机器之间存在一些差异(例如,安装了编解码器)

由于您没有在命令中明确指定任何编解码器,因此 ffmpeg可能如果默认值不可用,则自动选择最合适的一个。

例如,如果您没有libx264安装(H.264 编码器),ffmpeg 将选择mpeg4(MPEG-4 Part II 编码器),这很可能就是您的情况,因为与 H.264 相比,MPEG-4 Part II 是一种效率低得多的编解码器。这又与上面的三个要点有关。

此外,对于 MP4 输出,您无法使用 FLAC 音频。您的音频将转换为 MP3 或 AAC,具体取决于您的 ffmpeg 支持哪种编码器。

提示:确保你总是明确地-c:a aac使用或等指定您想要的编码器-c:a libmp3lame以避免意外。

但唯一的解决方案是比较编码日志并寻找差异。如果您无法获得这些日志,则必须检查编码视频以寻找明显的线索,例如不同的编解码器或平均比特率。

答案2

编解码器的工作(一般来说)是确定性的;换句话说:具有相同编解码器(版本和实现)和相同设置的相同输入应该提供相同的输出。

根据编解码器的实现和所使用的处理器指令,可能会有一些细微的差别(例如英特尔x86-64处理器可能会在小问题上有所不同手臂实现;但我会将其算作不同的编解码器实现)。

我怀疑您遇到的情况是底层编解码器或编解码器设置不同。

您可以使用以下方法检查编解码器和编解码器设置:

ffprobe -show_streams file.mp4

我建议您对两个视频都这样做,您就会看到差异。

相关内容