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

评论

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

#1 楼

ffmpeg 3.4.4可以在Ubuntu 18.04上直接进行操作
您可能想要使用以下内容:
sudo apt install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

opengl-rotating-triangle.gif

图像信息:426kB,45帧,512x512视在大小,合并,在Lenovo P51上的转换时间为0.5s。
以上转换在ulimit -Sv 1000000(DRAM使用限制为1GB)之后也有效,因此“不会消耗大量内存”记忆体”,就像我之前对Imagemagick所做的尝试一样,它几乎杀死了我的机器。 500MB但是失败了,因为ffmpeg无法加载其共享库...是时候升级您的RAM了;-)?
测试这篇文章中描述的数据生成过程。
输出有一个可见的点阵模式,即在下面的“ ffmpeg +转换”方法中不可见。我们可以尝试使用以下方法来改善图像质量:

https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using -ffmpeg-with-reasonable-quality
https://stackoverflow.com/questions/42980663/ffmpeg-high-quality-animated-gif

例如使用palettegen滤镜:
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf "scale=512:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle-palettegen.gif

opengl-rotating-triangle-palettegen.gif

图像信息:979K,45帧,512x512视在尺寸,合并,转换时间联想P5​​1:3.5秒。
所以我们看到:

现在点状图案变得不那么明显了。
GIF大小大约增加了一倍。 TODO:为什么只选择调色板会增加图像尺寸?是否因为现在有更多的颜色,所以我们需要每种颜色更多的位?如何观察每个调色板?
生成时间要慢7倍,大概是因为ffmpeg首先扫描整个视频以确定最佳调色板。

我们还可以使用已记录的palettegen参数,例如palettegen=max_colors=16实现不同大小的质量折衷点。
参数分解


-ss 00:00:03 -to 00:00:06:从中剪切视频的开始和结束时间。
不,GIF并不是最好的盗版方式在线分发视频。
另请参阅:https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg


-vf scale=512:-1:将输出的高度设置为512像素,并调整宽度以保持纵横比。
这是网络图像的常见用例,其分辨率通常比视频要小得多。
如果删除此选项的输出GIF与输入视频的高度相同。
例如,可以使用ffprobe找到原始视频的高度:https://superuser.com/questions/595177/how-to-retrieve-video -Linux-Linux / 1035178#1035178中的-file-information-fromformation-from-command-line-file-信息,在本例中为1024 x1024。


-r 15:采样FPS。
例如,原始视频为30 FPS,因此-r 15意味着ffmpeg每2个帧会选择一个帧(= 30 / 15)。
感知输出FPS进行了调整以匹配输入,因此您不会注意到加速更大的粒度。
可以找到输入的FPS使用ffprobe,并且输入帧的总数可以使用mediainfo来找到,如以下所述:https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames-in-a -video-on-the-linux-command-line / 1044894#1044894
我建议使用此选项,因为由于分辨率较高,视频格式通常具有较高的帧速率。使用较小的GIF时,较低的帧速率不太明显,因此我们可以跳过一些帧并制作较小的GIF。来自Wikimedia Commons的具有类似命令的摄像机视频的质量:
wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -r 15 -vf scale=512:-1 \
  -ss 00:00:17 -to 00:00:22 STS-132_Liftoff_Space_Shuttle_Atlantis.gif

STS-132_Liftoff_Space_Shuttle_Atlantis.gif

图像信息:1.3MB,75帧,512x288视在尺寸,合并(但是效果很小,因为镜头从开始就稍微平移了),联想P51的转换时间为2.3秒。
这是带有palettegen的版本,但仅2秒就可以满足2MiB的上传限制:

图片信息:1.5MB,30帧,512x288外观尺寸,在Lenovo P51上的转换时间:43s。
更直接的方法:
sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

也可以,但是输出GIF会更大比输入视频要多,因为视频格式可以使用高级算法更有效地跨帧压缩,而GIF只能进行简单的矩形帧差异。
在18.04之前:ffmpeg + convert单线,没有中间文件
ffmpeg以前无法处理GIF。我遇到过的最好的事情是:
sudo apt-get install ffmpeg imagemagick
ffmpeg -i opengl-rotating-triangle.mp4 -r 15 -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 -f image2pipe -vcodec ppm - |
  convert -deconstruct -delay 5 -loop 0 - opengl-rotating-triangle-image-magick.gif

opengl-rotating-triangle-image-magick.gif

图像信息:995kB,45帧,512x512外观尺寸,合并。
对于亚特兰蒂斯号航天飞机的镜头,类似:
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -r 15 -vf scale=512:-1 \
  -ss 00:00:17 -to 00:00:22 -f image2pipe -vcodec ppm - |
  convert -deconstruct -delay 5 -loop 0 - STS-132_Liftoff_Space_Shuttle_Atlantis_512x.gif

产生更好的输出,但是最终的GIF很大,为6.2MB,所以我无法上传。
对一些参数的解释:


-loop 0:将Netscape Gif扩展循环计数字段添加到输出中。 0表示无限循环,如以下网址所述:http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eogfirefox和Chrome在默认情况下都无限循环,即使没有循环也是如此,所以我不确定



-delay 5:在显示下一帧之前等待的时间(以秒为单位),如以下网址所述:https://en.wikipedia.org/wiki/GIF# Animated_GIF字节324。所以100表示1 FPS,5表示1 / 0.5 == 20FPS


-deconstruct:在具有矩形差异的帧之间压缩,另请参见:如何使用ImageMagick调整动画GIF文件的大小? br />

即使您降低高度和帧速率,输出的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上进行了测试。
Gifski
https://gif.ski/
这是引起我注意的另一个选项,它声明了智能算法,因此让我们试试吧。
首先,我们需要将视频转换为图像序列,然后将其输入到gifsky中,例如:
sudo snap install gifski
mkdir -p frames
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  frames/%04d.png
gifski -o opengl-rotating-triangle-gifski.gif frames/*.png

opengl-rotating-triangle-gifski.gif

图像信息:954K,45帧,512x512外观尺寸,未合并,在Lenovo P51上的转换时间:4.8s。
和2s STS:

图像信息:1.6M,30帧,512x288表观尺寸,未合并,在Lenovo P51上的转换时间为2.8s。 />

评论


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

– asmeurer
16-10-21在17:51

我同意。较小的gif较适合于网络。感谢scale = 320:-1

–僵尸
16-10-26在8:26

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

–米奇
17年2月13日在8:05

我的gif比mp4大20%:O

–亚当·戈德曼(Adam Goldman)
17年5月11日在2:39

根据top的说法,该进程运行了3分钟后,它使用了所有内存的30%,而在4分钟后它已使用了50%,以此类推。因为我只有8GB的内存,所以@@ CiroSantilli华涌低端人口六四事件法轮功RAM,由于需要使用交换磁盘,这使我的计算机开始执行所有操作。我们将看到进展情况,现在转换过程正在使用5.5GB的RAM ...将整个进程内文件存储在内存中似乎并不很聪明。

–寡核苷酸
18年1月31日,12:35



#2 楼

分两步:



从视频中提取图像

在与.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选项


您最终会得到一个很大的文件,请查看图片魔术指南,以优化可添加到第二步命令以获得较小文件的选项的gif。

评论


很好的答案-一些其他信息:ffmpeg可以使用此处的说明进行安装

–chepyle
16-3-29在2:02



请记住,frames文件夹必须存在,第一个命令才能起作用。

–totymedli
17年6月7日在15:09

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

–cpury
17年7月10日在8:54



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

–小豆蔻
17年9月12日在9:37

我建议您使用PNG进行初始文件导出,而不是使用JPG文件格式(默认设置非常有损)。 ffmpeg -i video.mp4 -r 5'frames / frame-%03d.png'。

–皮埃尔·F
18年6月7日,11:15



#3 楼

gifify是一个基于节点的多合一实用程序,可简化转换。它取决于在仓库中可用的nodejsnpmffmpegimagemagick

一旦安装了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!'


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


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


评论


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

–寡核苷酸
18年1月30日在16:03

19.04:另一个必需的软件包是gifsicle,但是又出现另一个问题:github.com/vvo/gifify/issues/95另外,您介意告诉我们npm新手在哪个目录中运行npm install以及是否以root用户身份运行它?谢谢!

–尼古拉斯·拉乌尔(Nicolas Raoul)
19年4月18日在4:13

#4 楼

我已经开始组合使用一种工具来为常见操作提供简化的界面。
您可以将MP4转换为GIF,如下所示:
$ npm install @mountbuild/mouse -g
$ mouse convert input.mp4 -o output.gif -s 00:00:00 -e 00:00:03

您可以更改开始时间和结束时间,以及同时安装了--fps--width
需要安装ffmpeg。
如果没有其他内容,请查看源代码,并查看如何编写自己的脚本以使用JavaScript进行操作。