Video FFMPEG:修复低运动区域的口吃
我正在尝试使用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_
- 必须具有非常低的关键帧速率(理想情况下小于0.5秒)
- 必须具有适度低的(约1Mbps)比特率
- 必须以合理的(~24fps)帧速率运行
- 宽度必须为4的倍数
- 不得有任何B帧
- 必须是H.264基线编码
- 必须是FLV
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进行设置即可。将两个视频过滤器组合成一个参数可以修复分辨率,还可以修复口吃问题。非常感谢。