使用libx264压缩一组图像时,为什么帧速率会影响最终输出大小?

时间:2018-04-03 00:32:11

标签: ffmpeg h.264 libx264

我使用ffmpeg使用libx264编解码器将一组图像编码为短暂的间隔拍摄视频。我的第一次尝试,我用30 FPS编码,使用:

ffmpeg -r 30 -pattern_type glob -i "*.jpg" -vcodec libx264 -crf 30 -pix_fmt yuv420p output.mp4

60帧,这给了我一个长度为2秒的163 KB文件。然后我意识到我需要它更慢,所以我重新运行相同的命令,但改为-r为2.现在我有一个30秒长的文件,但大小跳到891 KB!视频质量看起来在感觉上相同。

如何以较慢的帧速率进行编码,而最终文件大小不会膨胀?

注意:我有一些理论和我检查过的东西。首先,为了确保ffmpeg不会在较长的verison中复制帧,我会检查I / P / B计数。 30 FPS文件有:

[libx264 @ 0x7f9b26001c00] frame I:1     Avg QP:30.67  size: 44649
[libx264 @ 0x7f9b26001c00] frame P:15    Avg QP:31.19  size:  5471
[libx264 @ 0x7f9b26001c00] frame B:44    Avg QP:31.45  size:   767

2个FPS文件有:

[libx264 @ 0x7fcd32842200] frame I:1     Avg QP:21.29  size: 90138
[libx264 @ 0x7fcd32842200] frame P:15    Avg QP:22.48  size: 33686
[libx264 @ 0x7fcd32842200] frame B:44    Avg QP:26.29  size:  6674

因此,I / P / B计数相同,但2 FPS文件的QP要低得多。为了抵消,我尝试增加2-FPS文件的-crf,以获得相同的目标大小,但这只是给了我一个非常模糊的视频(必须转到crf = 40)。我试过搞乱-minrate,-maxrate,-bt,没有帮助。我猜有一些x264编解码器设置是帧速率相关的,但我不知道试图找出哪一个(根据我的理解,恒定比特率受帧速率影响但CRF不应该,但也许我误解了它。

1 个答案:

答案 0 :(得分:3)

CRF模式旨在获得并保持其编码输出中的特定质量等级。如果要以25fps显示相同的帧组,则每帧的持续时间为40毫秒,并且观看者将不会完全理解瞬态特征。像x264 / x265这样的编码器将更积极地优化这些帧。 OTOH,如果以2 fps显示,每帧可见半秒钟,因此在保持感知质量方面没有更少的余地。

对于x264,这是实现该逻辑的commit的消息。

VFR /帧速率感知速率控制,第2部分

  

MB-tree和qcomp复杂性   估计现在考虑计算中帧的持续时间。   这对于视觉优化非常重要,因为它可以持续使用   更长的本质上更重要的是质量。提高VFR感知能力   极端测试用例的PSNR高达1-2db,普通的约0.5db   VFR剪辑(例如重复的动画片段)。

     

警告:此更改重新定义了x264的内部质量测量。   x264现在将根据视频的帧速率调整其质量   由于前面提到的帧持续时间逻辑。也就是说,-crf X会   60fps视频的每帧质量低于30fps视频。   这将使-crf接近恒定的感知质量   先前。 "中心"这个变化是25fps:即视频   在相同的CRF和视频中,低于25fps的音质会提升   上面会下降。这种选择是完全随意的。

     

请注意,为了充分利用这一点,x264必须对您的视频进行编码   以正确的帧速率,使用正确的时间戳。