Answers:
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会比输入视频大得多,因为视频格式可以跨帧进行智能压缩。
参数细分:
ulimit -Sv 1000000
:设置程序的最大1Gb内存大小。
通常,我要确保该命令不会像先前的某些尝试那样使用无限的内存。
500Mb使ffmpeg无法加载共享库...是时候升级RAM了吗?
-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-file-information-from-command-line-under-linux/1035178#1035178是在我们的情况下为1024 x 1024。
-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在Linux命令行上的视频/ 1044894#1044894
我建议使用此选项,因为由于分辨率较高,视频格式通常具有较高的帧速率。使用较小的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
一些参数的解释:
-loop 0
:将Netscape Gif扩展循环计数字段添加到输出中。0表示无限循环,如http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension中所述 eog
,firefox
并且默认情况下,即使没有铬,chrome也会无限循环,因此我不确定它是否必要是了。
-delay 5
:在显示下一帧之前等待的时间,以秒为单位,如https://en.wikipedia.org/wiki/GIF#Animated_GIF字节324 所述。因此,100
表示1 FPS,5
表示1 / 0.5 == 20FPS
。
即使您降低高度和帧速率,输出的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上测试。
scale=320:-1
-r 10
将使GIF恢复正常速度。
两步:
从视频中提取图像
在与.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
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。
frames
文件夹必须存在才能使第一个命令生效。
-layers Optimize
到最后一个convert
命令*.jpg
。但是请检查输出,它可能会受到影响。对我来说,它把gif大小从5 MB减小到700 KB,而没有任何质量上的
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
。
gifify是一种基于节点的多合一实用程序,可简化转换。这取决于nodejs
,npm
,ffmpeg
以及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)。
gifsicle
,但随后出现另一个问题:github.com/vvo/gifify/issues/95另外,您介意告诉我们npm新手要在哪个目录中运行npm install
以及是否以root用户身份运行它?谢谢!