Video FFMPEG:修复低运动区域的口吃

Video FFMPEG:修复低运动区域的口吃,video,encoding,ffmpeg,Video,Encoding,Ffmpeg,我正在尝试使用FFMPEG创建具有非常特定要求的视频: 必须具有非常低的关键帧速率(理想情况下小于0.5秒) 必须具有适度低的(约1Mbps)比特率 必须以合理的(~24fps)帧速率运行 宽度必须为4的倍数 不得有任何B帧 必须是H.264基线编码 必须是FLV 编码速度并不重要。如果对1秒的视频进行编码需要2分钟,那绝对没问题。重要的是输出以尽可能低的比特率保持质量 为此,我目前有以下FFMPEG命令: ffmpeg \ -fflags +genpts \ -i big_

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

  • 必须具有非常低的关键帧速率(理想情况下小于0.5秒)
  • 必须具有适度低的(约1Mbps)比特率
  • 必须以合理的(~24fps)帧速率运行
  • 宽度必须为4的倍数
  • 不得有任何B帧
  • 必须是H.264基线编码
  • 必须是FLV
编码速度并不重要。如果对1秒的视频进行编码需要2分钟,那绝对没问题。重要的是输出以尽可能低的比特率保持质量

为此,我目前有以下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\u method
subq
,等等),看看它们是如何影响质量和比特率的。不过,在此之前,我有一个直接的质量问题要用上面的命令来解决

我只剪辑了视频的一部分,真正说明了这个问题。当屏幕的某个区域发生非常轻微的颜色变化时,就没有运动矢量。这意味着视频的某些部分将在下一个关键帧之前取消更新。这可以在视频开头左边的树上或者兔子还在睡觉的时候看到。如果观众盯着屏幕的某些区域看,视频可能看起来只是以每秒4帧(我的关键帧速率)的速度运行,即使视频实际上是以每秒24帧的速度运行——它只是没有更新整个屏幕

如果屏幕上的这些区域变得严重模糊,只要运动保持不变,我就可以了。做了一些研究后,我认为选项
-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.

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

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

每个输出流只能有一个简单的filtergraph,因此

-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" \
否则仅应用时基过滤器


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

ffmpeg的flags2 fastpskip是。您可以将-preset veryslow替换为包含它的-preset placebo(请参见x264--fullhelp)。只需使用x264-params进行设置即可。将两个视频过滤器组合成一个参数可以修复分辨率,还可以修复口吃问题。非常感谢。