我试图从一组帧使用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的文档。
宽度和高度
用裁剪滤镜使宽度和高度能被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是一个简单的解决方案。
你也可以用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"
这是理想的,因为它总是做正确的事情,即使没有填充是必要的。