我试图从一组帧使用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强制的某种纵横比?


当前回答

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

-vf scale=1280:-2

对于android,不要忘记添加

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

其他回答

原始问题的答案不应该缩放视频,而是固定高度不能被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的文档。

你也可以用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现在是最终的,不应该应用宽高比校正

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

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

-vf scale=1280:-2

对于android,不要忘记添加

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

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

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

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

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

scale=720:-1 

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

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

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