如何通过命令行从MP4视频创建动画GIF?


119

我想.gif.mp4视频制作动画。我希望从命令行执行此操作,因此请仅列出命令行工具。


您可以使用FFMPEG的Github上使用此脚本,并生成中间调色板以获得更好的图像质量。
troyane

Answers:


127

ffmpeg 3.4.4可以在Ubuntu 18.04上直接完成

您可能想要使用类似以下的内容:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

测试数据的生成过程在这篇文章中描述

更直接的:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

也可以使用,但是输出GIF会比输入视频大得多,因为视频格式可以跨帧进行智能压缩。

参数细分:

18.04之前的版本:ffmpeg+ convert不包含中间文件的单线

ffmpeg以前无法处理GIF。我最好的经历是:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

一些参数的解释:

即使您降低高度和帧速率,输出的GIF仍可能会大于视频,因为“真实”非GIF视频格式会跨帧压缩,而GIF仅压缩单个帧。

直接:

convert input.mp4 rpi2-bare-metal-blink.gif

可以工作,但是由于内存溢出几乎杀死了我的计算机,并为我的2s 1Mb输入文件产生了100倍的输出。也许有一天ImageMagick会赶上来。

另请参阅:https : //superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

在Ubuntu 17.10上测试。


1
不愿投票的人请解释一下;-)
Ciro Santilli新疆改造中心法轮功六四事件

1
您的延迟与-r值不匹配(结果gif为2倍速度)。另外,您也添加了scale参数,但没有明显的原因(这使gif确实很小)。
asmeurer

2
我同意。小型gif较适合网络。感谢您 scale=320:-1
僵尸

2
对于那些想知道的人:删除-r 10将使GIF恢复正常速度。
米奇

2
我的gif比mp4大20%:O
亚当·戈德曼

113

两步:

  • 从视频中提取图像

    在与.mp4文件相同的目录中创建一个名为frames的目录。使用命令:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    资源

  • 将图像转换为gif

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    文件:转换gif选项

您最终会得到一个很大的文件,请看一下image magick指南来优化可添加到第二步命令以获得较小文件的选项上的gif


1
很好的答案-一些其他信息:ffmpeg可以使用此处的说明
chepyle

3
请记住,该frames文件夹必须存在才能使第一个命令生效。
totymedli

3
对于那些想要快速优化的方法通常可以正常工作并且懒得阅读链接的人,只需在之前添加-layers Optimize到最后一个convert命令*.jpg。但是请检查输出,它可能会受到影响。对我来说,它把gif大小从5 MB减小到700 KB,而没有任何质量上的
可观

谢谢,那是一个有趣的过程,一个5.6MB的mp4最终得到了236MB的gif,不确定我是否会将其放在我的网站上;)gif可能需要限制在几秒钟而不是一分钟。
cardamom

2
建议不要使用JPG文件格式(默认设置会造成很大的损失),建议您使用PNG进行初始文件导出。ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
皮埃尔·F

12

gifify是一种基于节点的多合一实用程序,可简化转换。这取决于nodejsnpmffmpeg以及imagemagick这些都是在回购可用。

一旦你已经npm安装了可以安装gifify在全球:

    npm install -g gifify

可以使用以下方法将视频转换为.GIF:

    gifify video.mp4 -o video.gif

您还可以选择在视频中设置开始和结束位置,并添加文字说明:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️即使使用较小的视频,转换也可能需要几分钟。

注意:ffmpeg并且imagemagick可能需要使用某些特定的库进行编译(例如,libass和fontconfig)。


无法处理大约40秒的剪辑:github.com/vvo/gifify/issues/99
oligofren

19.04:另一个必需的软件包是gifsicle,但随后出现另一个问题:github.com/vvo/gifify/issues/95另外,您介意告诉我们npm新手要在哪个目录中运行npm install以及是否以root用户身份运行它?谢谢!
Nicolas Raoul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.