FFmpeg 中的“sameq”或“same_quant”选项是什么?它是指“相同质量”吗?

FFmpeg 中的“sameq”或“same_quant”选项是什么?它是指“相同质量”吗?

我经常看到使用该sameq选项的 FFmpeg 命令,例如

ffmpeg -i input.mp4 -sameq output.avi

这是什么意思?意思是“相同质量”吗?如果不是,我应该用什么来代替?

答案1

sameq并不意味着“同等品质”

网络上有多种资源提倡使用sameqsame_quant选项,但本质上,它们是错误的。使用sameq不会产生与输入具有相同质量的结果。
永远不要使用它。

造成混乱的原因是文档写得不好,暗示使用此选项将提供相同的质量。幸运的是,此选项已被删除。

以下是 FFmpeg 文档说:

请注意,这不是相同的质量。除非您知道需要,否则请不要使用此选项。

事实上,FFmpeg 开发人员改了名字sameqsame_quant只是为了确保,然后已移除sameq/same_quant总之;这意味着这个选项在最近的 FFmpeg 中不存在,但是对于那些使用旧版 FFmpeg 的人来说,这篇文章仍然有用。


视频压缩如何工作?

现在我们已经弄清楚了这一点,让我们来了解一些技术细节。

要理解为什么它不能可靠地工作,我们需要掌握“质量”对于常见视频编码器的意义以及影响质量的因素。为什么在使用不同比特率压缩时,一个视频看起来比另一个视频更好?是什么导致转换有损,为什么编码后的视频比原始视频小?

当你对视频进行编码时,输入数据会先对像素块进行数学变换,然后转换为不同的维度。这种变换主要是离散余弦变换,生成一个数字矩阵,描述视频中 8×8 像素的区域。

因此,你的 8×8 像素和相应的矩阵最初看起来应该是这样的:1

原始图像  

但数据量太大了!如果我们想压缩视频,我们实际上可以去掉右下角的数字。我不会解释为什么会这样,但我们只能说,在描述这样的块时,左上角的数字更重要。整个转换的思路基本上就是把重要的东西放在左上角。

要删除右下角的数字,我们可以将它们设为零。如果某个数字是“无”,或者只是重复为0s,我们就不必存储它,这样我们就可以节省空间。从数学上讲,我们需要量化通过应用另一个矩阵,即“量化矩阵”,对第一个矩阵进行改进。

这将导致矩阵中的数字明显减少,并且出现许多零:

压缩图像  

结果是,我们将第一个包含大量数字的高质量矩阵转换为一个仍然类似于相同 8×8 像素的矩阵,但质量较低,因为用于描述这些像素的数字较少。如果从视觉上比较这些块,它们很相似,但不再完全相同。

这里,量化矩阵决定质量。这很重要。我们可以针对不同的质量使用不同的量化矩阵。有些量化矩阵几乎保持原始矩阵不变,而有些则不然。我们删除的数字越多,更差质量会提高,但更多的我们可以压缩视频,因为我们基本上可以“扔掉”这里的零。

那和 有什么关系sameq

假设你对视频进行编码,并希望设置特定的质量。正如我们已经了解到的,不同的量化矩阵会导致不同的质量,因此当我们告诉编码器使用质量时x,它会选择适当的量化矩阵来获得该质量,无论它是什么。结果是使用该矩阵y压缩的视频。2y

有趣的部分如下:sameq表示“相同量化器”。而不是“相同质量”。如果您拥有的非最新版本的 FFmpeg,您仍然可以在以下位置找到它ffmpeg --help

ffmpeg --help 2>&1 | grep sameq

因此,当您现在获取转换后的视频并再次对其进行编码并应用该sameq选项时,FFmpeg 将简单地选择用于输入视频的相同量化矩阵。

有些当您使用完全相同的编解码器进行输入和输出时,例如从 XviD 视频转换为 XviD 视频时,这种方法是可行的,但最终的质量仍然会更差。3是因为对已经编码的内容进行编码会丢弃更多信息。在上面的例子中,我们将在矩阵中创建更多零,结果看起来会更糟。

确实如此不是完全无法跨不同的视频编解码器工作。假设您正在使用 x264 转换 XviD 编码的视频。4对于这两个编解码器,内部使用的量化矩阵是不同的——它们没有相同的系数。所以这个选项根本没有意义!不幸的是,FFmpeg 仍然允许您使用它。

底线:除非您明确知道自己在做什么,否则请不要使用该选项。如果您想使用不同的编解码器对视频进行编码,但保留质量,那么您必须进行试验并自行设置质量。看看结果是否令人满意,如果不满意,请设置更高的质量。这大概就是您能做的一切。

最后,如果您想了解如何在重新编码时保持质量,请查看以下帖子:


1) 这里的矩阵实际上并不对应图像。这只是一个例子。2
) 实际上,如今大多数编码过程不仅仅使用矩阵。当您设置特定的比特率时,编码器将使用不同的矩阵来获得每秒的平均比特率。同样,在设置特定的质量时,现代编码器会根据内容采用不同的矩阵。这是因为某些内容比其他内容“更容易”压缩,并且需要较少的量化才能获得相同的压缩系数。3
) 示例:ffmpeg -i input.avi -sameq -c:v libxvid output.avi。请不要使用此方法。4
) 示例:ffmpeg -i input.avi -sameq -c:v libx264 output.mp4。也不要使用此方法。我是认真的。

相关内容