我正在尝试使用libx264编解码器使用FFMPEG从一组帧中编码.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
从比例过滤器文档:
如果这些值中的一个是
-n
与n > 1
,规模过滤器也将使用该保持输入图像的纵横比的值,与其它指定的尺寸来计算.之后,它将确保计算出的尺寸可以被整除,n
并在必要时调整该值.
将宽度设置为1280,将自动计算高度以保持纵横比,并且高度可以被2整除:
-vf scale=1280:-2
与上面相同,但具有声明的高度; 离开宽度由过滤器处理:
-vf scale=-2:720
根据x264的要求,YUV 4:2:0色度二次采样输出需要"宽度和高度可被2整除".4:2:2需要"宽2整除",4:4:4没有这些限制.但是,大多数基于非FFmpeg的播放器只能正确解码4:2:0,因此这就是您在输出H.264视频时经常看到ffmpeg
带有该-pix_fmt yuv420p
选项的命令的原因.
遗憾的是,您不能同时使用-2
宽度和高度,但如果您已经指定了一个维度,那么使用-2
是一个简单的解决方案.
答案在原来的问题,其也不会要缩放的视频:
-vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"
命令:
ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2"
基本上,.h264需要均匀的尺寸,因此这个过滤器将:
将原始高度和宽度除以2
将其四舍五入到最近的像素
再将它乘以2,从而使其成为偶数
添加黑色填充像素至此数字
您可以通过添加filter参数来更改填充的颜色:color=white
.请参阅pad的文档.
如果要设置一些输出宽度并使输出具有与原始相同的比率
scale=720:-1
而不是与这个问题,然后你可以使用
scale="720:trunc(ow/a/2)*2"
(仅适用于通过缩放搜索如何执行此操作的人员)
这可能是由于H264视频通常在应用压缩之前从RGB转换为YUV空间为4:2:0(尽管格式转换本身是有损压缩算法,因此节省了50%的空间).
YUV-420以RGB(红绿蓝)图片开始,并将其转换为YUV(基本上是一个强度通道和两个"色调"通道).然后通过为该色调的每2X2平方创建一个色调样本来对Hue通道进行二次采样.
如果水平或垂直具有奇数个RGB像素,则YUV帧的二次采样色调空间中的最后一个像素列或行将包含不完整的数据.
scale
这里的解决方案的问题是它们扭曲了源图像/视频,这几乎不是你想要的.
相反,我发现最好的解决方案是在奇数维上添加1像素的垫.(默认情况下,涂层是黑色的,很难注意到.)
其他pad
解决方案的问题在于它们不会在任意维度上进行推广,因为它们总是填充.
此解决方案仅在高度和/或宽度上添加1像素焊盘(如果它们是奇数):
-vf pad="
这是理想的,因为即使不需要填充,它也始终做正确的事情.