我有一个工具链,它生成的帧通常为 1920x1080,但偶尔也会生成 1919x1080 或 1920x1079。(是的,这是一个错误。请继续阅读。)当 ffmpeg 从中编码视频时,使用如下命令
ffmpeg -y -r 30 -i foo/%04d.png -vcodec h264 out.mp4
然后它会打印如下注释
Input stream #0:0 frame changed from size:1919x1080 fmt:rgb24 to size:1920x1080 fmt:rgb24
但这些框架并没有被调整大小并纳入其中out.mp4
,而是被从中省略了out.mp4
。
可以包含这些帧吗?我在论坛和文档中没有找到关于非恒定帧大小的提及,但 ffmpeg 本身在这里索赔调整帧的大小。(注释打印在 ffmpeg.c 的第 1688 行。在那里,resample_changed
设置了一个标志,这会导致宽度和高度字段InputStream *ist
被纠正。)
David Elliman 可能在回答中报告了类似的行为https://stackoverflow.com/questions/18043841/ffmpeg-missing-image-frames-in-generated-video-from-images?rq=1。
答案1
也许scale
视频过滤器可以提供您所需要的:
ffmpeg -r 30 -i foo/%04d.png -vf "scale=1920:1080,format=yuv420p" -codec:v libx264 out.mp4
这将强制每帧的尺寸为 1920x1080。如果您奇怪大小的输入只是被裁剪而不是被错误缩放,这可能会导致图像略微拉伸或挤压。如果是这种情况,请考虑使用pad
视频过滤器,但请注意,它将产生一个纯色条来补偿缺失的像素。
scale
还接受各种功能如果你想让它看起来更漂亮。参见使用 ffmpeg 调整视频大小以适合静态大小的播放器举个例子。
我添加的format=yuv420p
原因是,使用 libx264 的 RGB 输入,ffmpeg 将尝试避免色度子采样,从而导致大多数播放器无法解码的 YUV 4:4:4 平面像素格式。
答案2
尝试省略-r 30
输入帧速率的参数,改用-framerate 30
输出帧速率的参数。我遇到了同样的问题,但这种方法有效。
答案3
您可能需要指定缩放模式才能使调整大小生效。我从我的实现中获取了这一点。
--custom-anamorphic --display-width 1920 --keep-display-aspect --modulus 8 --crop 0:0:0:0