ffmpeg 可以对不同大小的帧的视频进行编码吗?

Cam*_*une 7 video ffmpeg c images

我有一个工具链,可以生成通常为 1920x1080 的帧,但偶尔也生成 1919x1080 或 1920x1079 的帧。(是的,这是一个错误。请继续阅读。)当 ffmpeg 从中编码视频时,使用如下命令

ffmpeg -y -r 30 -i foo/%04d.png -vcodec h264 out.mp4
Run Code Online (Sandbox Code Playgroud)

然后它打印这样的注释

Input stream #0:0 frame changed from size:1919x1080 fmt:rgb24 to size:1920x1080 fmt:rgb24
Run Code Online (Sandbox Code Playgroud)

但这些帧并没有被调整大小并包含在 中out.mp4,而是从 中省略out.mp4

可以包含那些框架吗?我在论坛和文档中没有发现任何提及非恒定帧大小的内容,但 ffmpeg 本身在这里声称可以调整帧大小。(该注释打印在 ffmpeg.c 的第 1688 行。那里resample_changed设置了一个标志,这会导致 的宽度和高度字段InputStream *ist被纠正。)

David Elliman 可能在/sf/ask/1263068901/ generated-video-from-images?rq=1 的答案中报告了类似的行为。

llo*_*gan 5

也许scale视频过滤器可以提供您正在寻找的内容:

ffmpeg -r 30 -i foo/%04d.png -vf "scale=1920:1080,format=yuv420p" -codec:v libx264 out.mp4
Run Code Online (Sandbox Code Playgroud)

这将强制每个帧的尺寸为 1920x1080。如果您的奇怪大小的输入只是被裁剪而不是错误地缩放,则可能会导致图像稍微拉伸或压扁。如果是这种情况,请考虑使用pad视频滤镜,但请注意,这将导致出现纯色条以补偿丢失的像素。

scale如果您想喜欢它,还可以接受各种功能。有关示例,请参阅使用 ffmpeg 调整视频大小以适合静态大小的播放器。

我添加的format=yuv420p原因是,使用 libx264 的 RGB 输入时,ffmpeg 将尝试避免色度子采样,从而导致大多数播放器无法解码的 YUV 4:4:4 平面像素格式。