我试图从一组帧使用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整除的误差。这可以通过使用这个过滤器来实现:

-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的文档。


这可能是因为H264视频在应用压缩之前通常以4:2:0的格式从RGB空间转换到YUV空间(尽管格式转换本身是一种有损压缩算法,可节省50%的空间)。

YUV-420从RGB(红绿蓝)图片开始,并将其转换为YUV(基本上是一个强度通道和两个“色调”通道)。然后,通过为该色调的每个2X2平方创建一个色调样本,对色调通道进行下采样。

如果水平或垂直的RGB像素数为奇数,则YUV帧的下采样色相空间中的最后一个像素列或行将获得不完整的数据。


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

scale=720:-1 

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

scale="720:trunc(ow/a/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是一个简单的解决方案。


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

-vf scale=1280:-2

对于android,不要忘记添加

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

你也可以用bitand函数代替trunc:

比坦德(x, 65534)

将与trunc(x/2)*2相同,在我看来它更透明。 (在这里,65534是一个神奇的数字;))


我的任务是将大量视频文件自动缩放到一半分辨率。

Scale =-2,ih/2导致图像略模糊

原因:

输入视频设置了显示宽高比(DAR) 缩放实际的框架尺寸 在预览期间,新视频的大小必须使用DAR进行校正,在相当低分辨率的视频(360x288, DAR 16:9)的情况下可能会导致模糊


解决方案:

-vf "scale='bitand(oh*dar, 65534)':'bitand(ih/2, 65534)', setsar=1"

解释:

Output_height = input_height / 2 Output_width = output_height * original_display_aspect_ratio output_width和output_height现在都四舍五入到能被2整除的最小数字 Setsar =1意味着output_dimensions现在是最终的,不应该应用宽高比校正

有人可能会觉得这很有用。


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

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

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

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

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

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