代码之家  ›  专栏  ›  技术社区  ›  jd20

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

  •  4
  • jd20  · 技术社区  · 6 年前

    我使用ffmpeg将一组图像编码为一个简短的timelapse视频,使用的是libx264编解码器。我的第一次尝试是以每秒30帧的速度对其进行编码,使用:

    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 回复  |  直到 6 年前
        1
  •  4
  •   Community Egal    4 年前

    CRF模式旨在获得并保持其编码输出的一定质量水平。如果要以25 fps的速度显示同一组帧,则每个帧的持续时间为40毫秒,观众将无法完全欣赏到瞬态特征。像x264/x265这样的编码器将更积极地优化这些帧。OTOH,如果以2帧/秒的速度显示,则每一帧都可以看到半秒钟,因此在保持感知质量方面的回旋余地较小。

    对于x264,这是 commit 实现了这种逻辑。

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

    MB树和qcomp复杂性 估计现在在计算中考虑帧的持续时间。 这对于视觉优化非常重要,因为帧可以持续 时间越长,质量越重要。改进VFR感知 在极端测试情况下,峰值信噪比高达1-2db,在更普通的情况下,峰值信噪比约为0.5db VFR剪辑(例如,消除重复的动画片段)。

    警告:此更改重新定义了x264的内部质量度量。 x264现在将根据视频的帧率调整其质量 由于上述帧持续时间逻辑。也就是说,-crf X将 60fps视频的每帧质量低于30fps视频。 这将使——crf更接近于恒定的感知质量,而不是 先前此更改的“中心”是25fps:即视频 在相同的CRF和视频中,低于25fps将提高质量 上面的将下降。这种选择完全是武断的。

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