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”)。
无需过多了解视频编码的细节,您可以查看量化参数 (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 的限制。
归档时间: |
|
查看次数: |
10395 次 |
最近记录: |