FFmpeg缩放视频保持宽高比时遇height not divisible by 2错误求助
解决FFmpeg缩放视频时“height not divisible by 2”的错误
这个问题在FFmpeg使用中很常见——你碰到的是主流视频编码器的硬性限制:像H.264、H.265这类常用编码器,要求输出视频的宽和高必须是2的整数倍。当你用scale=240:-1时,FFmpeg按原比例算出的高度是135(奇数),不符合编码器的要求,所以才会抛出这个错误。
下面给你几个简单高效的解决方案:
1. 用-2替代-1自动对齐到2的倍数
FFmpeg的scale滤镜支持用-2作为高度参数,它会自动计算出符合原宽高比、且最接近的能被2整除的高度。直接替换命令就能解决问题:
ffmpeg -i in.mp4 -vf scale=240:-2 out.mp4
这个命令会把高度调整为136(或134,取决于FFmpeg的取整逻辑),既保留了原视频的比例,又满足了编码器的要求。
2. 手动控制取整逻辑(精准定制)
如果你想更灵活地控制高度的取整方向,可以用滤镜的数学表达式:
- 向下取整到最近的2的倍数:
ffmpeg -i in.mp4 -vf scale=240:trunc(ow/a/2)*2 out.mp4
- 向上取整到最近的2的倍数:
ffmpeg -i in.mp4 -vf scale=240:ceil(ow/a/2)*2 out.mp4
这里的ow代表原始视频宽度,a代表原始宽高比,通过数学运算确保最终高度是2的倍数。
3. 用pad/crop滤镜补全或裁剪画面(不推荐)
如果一定要保留135的高度(不建议,会带来兼容性问题),可以先缩放再补一行黑边或者裁剪一行:
- 补黑边到240x136:
ffmpeg -i in.mp4 -vf "scale=240:-1,pad=240:136:0:1" out.mp4
- 裁剪画面到240x134:
ffmpeg -i in.mp4 -vf "scale=240:-1,crop=240:134" out.mp4
不过这种方法会轻微改变画面内容,不如前两种方案实用。
另外你提到-s 240x135也报错,原因和上面一致——高度是奇数,编码器不接受;而240x180能运行只是因为它的宽高都是2的倍数,但已经偏离了原视频的宽高比。
内容的提问来源于stack exchange,提问作者Darko_Milicic
相关产品推荐
相关产品推荐

