直接从 Mp4 生成 Gif - ffmpeg

Generating Gif from Mp4 directly - ffmpeg

我正在尝试从 mp4 视频文件生成 gif。我想在生成时缩放它并裁剪它。

我通过下面的代码实现了从 mp4 到 mp4 的(裁剪和缩放)(这样我就可以使用 ffmpeg 提取 png 并使用 Imagick 制作动画 gif),但是我相信有更好的方法可以纯粹使用 ffmpeg 来实现。

ffmpeg -i in.mp4 -filter:v "scale=300:ih*300/iw, crop=200:500:50:80" -c:a copy out.mp4

我的问题是如何实现这段代码正在做的事情,但是直接从 mp4 生成 gif。


然后我开始调整 mp4 到 gif 的转换,但是当调色板出现时,我无法完全理解发生了什么。

我找到了 this answer 并且成功了,但是我不明白如何调整缩放和裁剪。

$ ffmpeg -y -ss 30 -t 3 -i in.mp4 \ -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

$ ffmpeg -ss 30 -t 3 -i in.flv -i palette.png -filter_complex \ "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" out.gif

我部分理解这个位的作用 -y -ss 30 -t 3 -i in.mp4(获取前 30 秒并从中生成 3 秒的 gif)。但是对于接下来的几行,我完全不知道它实际上在做什么。

如果有人能解释每个命令的作用,或者参考 link 解释这个主题,那就太棒了。

在你的第一个命令中,

ffmpeg -y -ss 30 -t 3 -i in.mp4 \
-vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

-y 如果输出文件已经存在,ffmpeg 会覆盖,因此不会提示确认。

-vf-filter:v 的别名,是一个视频过滤器链,它接受一个视频输入并依次处理每个指定的过滤器。所以输入 -> 过滤器 1 -> 过滤器 2 ... -> 过滤器 n -> 过滤器输出

fps=10 通过根据需要丢弃或复制帧将源转换为此帧速率,不执行插值。如果您的源是 20 fps,这将每隔一帧丢失一次。如果是 5 fps,它将每帧复制一次。

scale=320:-1:flags=lanczos 将视频的宽度调整为 320 像素,将高度调整为一定长度,以便保持原始纵横比。如果您想调整为 320x300,您可以将 -1 替换为 300。 Lanczos 是使用的缩放算法。请参阅列表 here。兰佐斯不错

palettegen 生成整个输入流的 256 色调色板。通常与 paletteuse 结合使用。

第二个命令中的 -filter_complex 是当您必须将过滤器应用于多个输入时 and/or 需要生成多个输出。总结起来有点长,见here.