ffmpeg 可以从不同大小的帧编码视频吗?

ffmpeg 可以从不同大小的帧编码视频吗?

我有一个工具链,它生成的帧通常为 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

相关内容