处理一些旧视频源的时候,有时候需要切上下左右的黑边。ffmpeg 的 -vf 滤镜可以完成这一工作。比如,某视频画面大小是 1920x1080,但实际有图像部分的大小是 1400x1080,两边都是黑色填充。但这 1400x1080 的图像边缘也并不整齐,有一些黑边。那么就可以这样处理得到干净的画面:
ffmpeg -hwaccel cuda -c:v:0 h264_cuvid -i 03.mkv -map 0:v:0 -map 0:a:0 -map 0:a:1 -sn -c:a copy -c:v hevc_nvenc -vf "crop=1400-10:ih-22:(iw-1400)/2+5:2,scale=1400:1080,setsar=1:1" -b:v 1.5M -maxrate:v 6M -bf:v 4 03new.mkv
在上面的 -vf 滤镜中,crop 负责切割画面,用法是:“crop=切割后的宽度:切割后的高度:横向切割起点:纵向切割起点”;iw 和 ih 表示原始视频画面的宽度和高度。切掉黑边后,得到的画面会比 1400x1080 略小,用 “scale=1400:1080” 可以把画面拉伸到 1400x1080。
注意:如果用 Nvidia 显卡编解码,此时不能用 -hwaccel_output_format cuda 参数。因为这个参数的功能是让显卡解码后的数据直接进入显卡编码器,整个过程不出显卡。这样效率自然最高,但由 CPU 实现的视频滤镜自然也就无效了。
图一是未处理前的画面,图二是切除黑边后。
ffmpeg -hwaccel cuda -c:v:0 h264_cuvid -i 03.mkv -map 0:v:0 -map 0:a:0 -map 0:a:1 -sn -c:a copy -c:v hevc_nvenc -vf "crop=1400-10:ih-22:(iw-1400)/2+5:2,scale=1400:1080,setsar=1:1" -b:v 1.5M -maxrate:v 6M -bf:v 4 03new.mkv
在上面的 -vf 滤镜中,crop 负责切割画面,用法是:“crop=切割后的宽度:切割后的高度:横向切割起点:纵向切割起点”;iw 和 ih 表示原始视频画面的宽度和高度。切掉黑边后,得到的画面会比 1400x1080 略小,用 “scale=1400:1080” 可以把画面拉伸到 1400x1080。
注意:如果用 Nvidia 显卡编解码,此时不能用 -hwaccel_output_format cuda 参数。因为这个参数的功能是让显卡解码后的数据直接进入显卡编码器,整个过程不出显卡。这样效率自然最高,但由 CPU 实现的视频滤镜自然也就无效了。
图一是未处理前的画面,图二是切除黑边后。