2016-01-20 29 views
1

我想从mp4视频文件生成gif。我想缩放它并在生成时裁剪它。从Mp4直接生成GIF - ffmpeg

我实现了从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出它)。但对于接下来的几行,我完全失去了它实际正在做的事情。

如果有人能够解释每个命令的作用,或者参考解释该主题的链接,那将是惊人的。

回答

1

在你的第一个命令,

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,你可以用300替换-1。 Lanczos是使用的缩放算法。见清单here。 Lanczos很好。

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

第二个命令中的-filter_complex是当您必须将过滤器应用于多个输入和/或需要生成多个输出时。在这里总结一下,详见here

+0

非常感谢,清除了很多! – senty