ffmpeg 中“q”值的最大值和最小值是多少?

Jun*_* Oh 7 ffmpeg video-conversion

当通过 ffmpeg 从视频中提取图像时,可以得到如下消息。

frame=    1 fps=0.0 q=2.5 Lsize=N/A time=00:00:00.03 bitrate=N/A 
Run Code Online (Sandbox Code Playgroud)

“q”值表示“编码帧的质量”。我通过搜索代码 ffmpeg.c. 找到了这个(参考链接:http ://www.ffmpeg.org/doxygen/trunk/frame_8h_source.html#l00205 )

通常它的值在 0.0 到 6.0 之间。但问题是它可以通过引用获得更高的价值。
代码说,

 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
Run Code Online (Sandbox Code Playgroud)

质量值的范围是 1 到 32,767。FF_QP2LAMBDA 是 118。所以我们可以得到 %2.1f 的最大值超过 277。这是非常可疑的(因为“%2.1f”)。

slh*_*hck 8

无需过多了解视频编码的细节,您可以查看量化参数 (QP) 或 Lambda 参数来表达编码帧的质量。

此图来自程小银——主观优化的高清电视视频编码,2009 年。您可以将 Lambda 视为率失真优化过程中的拉格朗日乘数。

如果你使用一个宏块并用低 QP 对其进行编码,与原始图像相比,失真 ( D ) 会很低,但比特率 ( R ) 会很高。同样,如果您选择高 QP,失真会很高,但比特率会很低。因此,压缩帧的成本由J = D + ?R 计算– 并且该成本需要最小化。

在您的特定情况下,我很确定enc->coded_frame->quality从编码器分配了 Lambda 值。使用FF_QP2LAMBDA常数,您可以转换为 Lambda 单位,例如让QP = 21,那么? = 21 ×FF_QP2LAMBDA。反过来,您通过QP =FF_QP2LAMBDA获得QP。/,这就是您在输出中看到的内容。

例如,在 H.264 中,基本关系是?= 0.85 × 2 (QP-12)/3。由于 QP 值的范围从 0 到 51,因此您会得到介于 0.053 和 6,963.2 之间的 Lambda 值——但 FFmpeg 无论如何都会通过将 Lambda 转换回 QP 来输出 QP 值。

现在,当您说“质量值的范围是 1 到 32,767”时,您指的是可能的 Lambda 值的范围。由于拉格朗日函数仅将 QP 应用于编码宏块后才起作用,coded_picture->quality因此可以获得的最大数量存在实际限制。例如,在 MPEG-4 Part 2 中,QP 值从 1 到 31,就像我上面所说的,在 MPEG-4 Part 10 中,它是从 0 到 51。作为回报,q=将再次输出正确的 QP,因为可能的 Lambda 值受到您之前选择的 QP 的限制。