我试图从一组帧使用FFMPEG使用libx264编解码器编码。mp4视频。

这是我正在运行的命令:

/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4

我有时会得到以下错误:

[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)

在搜索了一下之后,似乎这个问题与缩放算法有关,可以通过添加-vf参数来修复。

然而,在我的例子中,我不想做任何缩放。理想情况下,我希望保持尺寸与框架完全相同。任何建议吗?是否存在h264强制的某种纵横比?


当前回答

宽度和高度

用裁剪滤镜使宽度和高度能被2整除:

ffmpeg -i input.mp4 -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4

如果你想按比例而不是按比例种植作物,那就按比例种植作物。

宽度或高度

使用比例过滤器。这将使宽度为1280。高度将自动计算以保持纵横比,宽度将被2整除:

ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4

类似于上面,但使高度720和自动计算宽度:

ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4

宽度和高度不能同时使用-2,但如果已经指定了一个维度,那么使用-2是一个简单的解决方案。

其他回答

宽度和高度

用裁剪滤镜使宽度和高度能被2整除:

ffmpeg -i input.mp4 -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4

如果你想按比例而不是按比例种植作物,那就按比例种植作物。

宽度或高度

使用比例过滤器。这将使宽度为1280。高度将自动计算以保持纵横比,宽度将被2整除:

ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4

类似于上面,但使高度720和自动计算宽度:

ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4

宽度和高度不能同时使用-2,但如果已经指定了一个维度,那么使用-2是一个简单的解决方案。

原始问题的答案不应该缩放视频,而是固定高度不能被2整除的误差。这可以通过使用这个过滤器来实现:

-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"

完整的命令:

ffmpeg -i frame_%05d.jpg -vcodec libx264 \
 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -r 24 \
 -y -an video.mp4 

基本上,.h264需要偶数尺寸,所以这个过滤器将:

将原来的高度和宽度除以2 四舍五入到最近的像素 再乘以2,使它成为偶数 添加黑色填充像素到这个数字

你可以通过添加滤镜参数color=white来改变填充的颜色。请参阅pad的文档。

如果你想设置一些输出宽度,并使输出与原始的比例相同

scale=720:-1 

为了避免这个问题,你可以用

scale="720:trunc(ow/a/2)*2"

(仅供搜索如何缩放的人使用)

这里的缩放解决方案的问题是,它们扭曲了源图像/视频,这几乎不是你想要的。

相反,我发现最好的解决方案是在奇数维度上添加一个1像素的pad。(默认情况下,填充是黑色的,很难被注意到。)

其他垫片解决方案的问题是,它们不能在任意维度上推广,因为它们总是垫片。

这个解决方案只在高度和/或宽度奇数的情况下添加一个1像素的pad:

-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"

这是理想的,因为它总是做正确的事情,即使没有填充是必要的。

颈须大人有正确答案,非常快

-vf scale=1280:-2

对于android,不要忘记添加

"-preset ultrafast" and|or "-threads n"