如何用FFmpeg去除视频黑边?实操遇问题求助
解决FFmpeg去除视频黑边的编码错误与残留黑边问题
1. 修复「width not divisible by 2」编码错误
你的命令中scale=ih*16/9:ih计算出的宽度849为奇数,而H.264等主流编码器要求分辨率必须是偶数。修改滤镜链,强制输出分辨率的宽高均为偶数:
ffmpeg -i sfu11.mp4 -vf "scale='trunc(ih*16/2)*2':ih,scale=iw:-2,setsar=1" -y out.mp4
这里用trunc(ih*16/2)*2把计算出的宽度转为偶数,再配合scale=iw:-2确保高度也保持偶数对齐,避免编码报错。
2. 解决水平黑边与cropdetect残留黑边问题
原滤镜逻辑是先按16:9缩放,会导致非16:9的画面被拉伸后补黑边,正确流程应该是先裁剪黑边再缩放:
步骤1:精准检测黑边区域
默认cropdetect可能因阈值或检测帧数不足导致识别不准,调整参数提升检测精度:
ffmpeg -i sfu11.mp4 -vf "cropdetect=limit=24:round=2:reset=100" -vframes 100 -f null -
limit=24:降低亮度阈值,更精准识别浅黑边(可根据实际画面调整数值)round=2:确保裁剪后的分辨率为偶数,适配编码器要求reset=100:每100帧重新检测一次,适配画面有变化的视频
执行后终端会输出类似crop=636:478:0:0的参数,这就是检测到的无黑边区域。
步骤2:裁剪+缩放至目标比例
用上一步得到的crop参数,先裁剪黑边,再缩放为16:9(或保持原比例):
# 假设检测到的参数是crop=636:478:0:0,缩放为16:9 ffmpeg -i sfu11.mp4 -vf "crop=636:478:0:0,scale=-2:ih*16/9,setsar=1" -y out.mp4
如果不需要强制16:9,只需裁剪黑边,直接用crop参数即可:
ffmpeg -i sfu11.mp4 -vf "crop=636:478:0:0,setsar=1" -y out.mp4
3. 实时验证效果
用ffplay预览调整后的效果,确认无黑边再执行编码:
ffplay -i sfu11.mp4 -vf "crop=636:478:0:0,scale=-2:ih*16/9,setsar=1"
内容的提问来源于stack exchange,提问作者watch-this
相关产品推荐
相关产品推荐

