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将会:

  1. 将原始高度和宽度除以2
  2. 将其舍入到最近的像素
  3. 再乘以2,使其成为偶数

只需使用-2

从比例filter文档 :

如果其中一个值是-nn > 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帧的二次采样色相空间中的最后一个像素列或行的数据将不完整。