FFMPEG:固定低运动区域的口吃

时间:2018-07-10 20:16:10

标签: video encoding ffmpeg

我正在尝试使用FFMPEG创建具有特定要求的视频:

  • 关键帧速率必须非常低(最好少于0.5秒)
  • 必须具有较低的比特率(〜1Mbps)
  • 必须以合理的帧率(〜24fps)运行
  • 宽度必须是4的倍数
  • 必须没有任何B帧
  • 必须使用H.264基线编码
  • 必须是FLV

编码速度无关紧要。如果要花2分钟来编码1秒的视频,那绝对没问题。重要的是,输出以尽可能低的比特率保持质量。

为此,我目前有以下FFMPEG命令:

ffmpeg \
    -fflags +genpts \
    -i big_buck_bunny_1080p_stereo.avi \
    -vf "scale=trunc(360*iw/ih/4)*4:360" \
    -vf "settb=1/1000" \
    -r 24 \
    -g 6 \
    -keyint_min 6 \
    -force_key_frames "expr:gte(t,n_forced/4)"\
    -c:v libx264 \
        -preset veryslow \
        -tune zerolatency \
        -profile:v baseline \
        -pix_fmt yuv420p \
    -b:v 1000k \
    -c:a speex \
        -ar 16000 \
        -ac 1 \
    -b:a 64k \
    -f flv bbb_lo.flv

我希望尝试各种编码选项(me_methodsubq等),以了解它们如何影响质量和比特率。不过,在此之前,我遇到了上面提到的命令,需要立即解决质量问题。

See the video here on YouTube

我只剪切了一部分视频,确实演示了该问题。当屏幕区域的颜色发生非常微小的变化时,就没有运动矢量。这意味着视频的某些部分在下一个关键帧之前不会更新。在视频开头左侧的树中或当他仍在睡觉时的兔子中都可以清楚地看到这一点。如果观众凝视着屏幕的某些区域,即使视频实际上以每秒24帧的速度运行,看起来视频也仅以每秒4帧的速度(我的关键帧速率)运行-它只是没有更新整个屏幕。

只要屏幕上的这些区域在保持运动的情况下变得非常模糊,那就可以了。经过一些研究,我认为选项-flags2 -fastpskip将解决此问题,但是此选项对我不起作用:

[libx264 @ 0x55b63e32c760] [Eval @ 0x7ffea2a7a830] Undefined constant or missing '(' in 'fastpskip'
[libx264 @ 0x55b63e32c760] Unable to parse option value "fastpskip"
[libx264 @ 0x55b63e32c760] Error setting option flags2 to value -fastpskip.

如何解决此问题,以牺牲图像质量为代价来保持运动?

1 个答案:

答案 0 :(得分:1)

运动矢量是由编码器(x264)计算的,不是ffmpeg。您的视频仍然是1080p,而不是360p,因为给定的比特率非常低,因此在量化过程中,细微的变化将变得平坦。

每个输出流只能有一个简单的过滤器图,所以

-vf "scale=trunc(360*iw/ih/4)*4:360" \
-vf "settb=1/1000" \

必须成为

-vf "scale=trunc(360*iw/ih/4)*4:360,settb=1/1000" \

否则仅应用时基过滤器。

对于GOP大小为6,您还可以跳过keyint和强制KF。