FFMPEG(libx264)“高度不能被2整除”
我正尝试使用libx264编解码器使用FFMPEG从一组帧中编码.mp4video。
这是我正在运行的命令:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
我有时会得到以下错误:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
在search了一下后,似乎这个问题与缩放algorithm有关,可以通过添加-vf参数来解决。
但是,在我的情况下,我不想做任何缩放。 理想情况下,我想保持尺寸完全一样的框架。 有什么build议? 是否有一些h264执行的宽高比?
玩过这个之后,我想我已经回答了我自己的问题。 这是解决scheme,以防其他人遇到类似的问题…我不得不将下面的参数添加到命令:
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
命令:
ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
基本上,.h264甚至需要维度,所以这个filter将会:
- 将原始高度和宽度除以2
- 将其舍入到最近的像素
- 再乘以2,使其成为偶数
只需使用-2
从比例filter文档 :
如果其中一个值是
-n
且n > 1
,则缩放filter将使用保持input图像纵横比的值,从另一个指定尺寸计算得出。 然后,它将确保计算的维度可以被n
整除,并在必要时调整该值。
例子
将宽度设置为1280,高度将自动计算以保留宽高比,高度将被2整除:
-vf scale=1280:-2
与上面相同,但是具有已声明的高度。 留下的宽度由filter处理:
-vf scale=-2:720
“2除尽”
根据x264的要求,对于YUV 4:2:0色度二次采样输出,需要“对于宽度和高度可以整除2”。 4:2:2需要“宽度可以被2整除”,而4:4:4则没有这些限制。 但是,大多数非FFmpeg播放器只能正确解码4:2:0,所以在输出H.264video时,经常会看到带有-pix_fmt yuv420p
选项的ffmpeg
命令。
警告
不幸的是,你不能在宽度和高度都使用-2
,但是如果你已经指定了一个维度,那么使用-2
就是一个简单的解决scheme。
如果你想设置一些输出宽度和输出与原来相同的比例
scale=720:-1
而不是与这个问题,那么你可以使用
scale="720:trunc(ow/a/2)*2"
(只是为了寻找如何缩放的人)
这很可能是由于H264video在压缩之前通常从RGB转换为YUV空间为4:2:0(尽pipe格式转换本身是一种有损压缩algorithm,节省了50%的空间)。
YUV-420以RGB(红绿蓝)图像开始,并将其转换为YUV(基本上是一个强度通道和两个“色调”通道)。 然后通过为该色调的每个2X2平方创build一个色调样本来对色相通道进行二次取样。
如果水平或垂直方向上有奇数个RGB像素,则YUV帧的二次采样色相空间中的最后一个像素列或行的数据将不完整。