手把手教你用ffmpeg制作表情包
在油管上看linux大神在芬兰阿尔托大学演讲视频时,突然发现了一个名场面,有观众说英伟达对Linux系统支持不够好,大神一通说明后来了句:Nvidia,FXXK YOU! 原视频在下面,需要梯子,时间是49:56。
这么出名的场面,就想做成表情包玩玩,于是就想到了曾经把我折磨的死去活来的ffmpeg。
1. 下载视频
首先需要使用youtube-dl下载原视频,先列出视频可下载的格式:
youtube-dl -F 'https://www.youtube.com/watch?v=MShbP3OpASA'
[youtube] MShbP3OpASA: Downloading webpage
[info] Available formats for MShbP3OpASA:
format code extension resolution note
249 webm audio only tiny 55k , opus @ 50k (48000Hz), 21.72MiB
250 webm audio only tiny 69k , opus @ 70k (48000Hz), 25.71MiB
140 m4a audio only tiny 131k , m4a_dash container, mp4a.40.2@128k (44100Hz),
58.10MiB
251 webm audio only tiny 135k , opus @160k (48000Hz), 46.92MiB
160 mp4 256x144 144p 109k , avc1.4d400c, 25fps, video only, 17.00MiB
278 webm 256x144 144p 114k , webm container, vp9, 25fps, video only,
39.68MiB
242 webm 426x240 240p 225k , vp9, 25fps, video only, 44.87MiB
133 mp4 426x240 240p 244k , avc1.4d4015, 25fps, video only, 41.77MiB
243 webm 640x360 360p 415k , vp9, 25fps, video only, 100.11MiB
134 mp4 640x360 360p 583k , avc1.4d401e, 25fps, video only, 86.82MiB
244 webm 854x480 480p 758k , vp9, 25fps, video only, 184.20MiB
135 mp4 854x480 480p 1199k , avc1.4d401e, 25fps, video only, 138.93MiB
247 webm 1280x720 720p 1506k , vp9, 25fps, video only, 251.06MiB
136 mp4 1280x720 720p 2117k , avc1.4d401f, 25fps, video only, 220.55MiB
248 webm 1920x1080 1080p 2633k , vp9, 25fps, video only, 381.07MiB
137 mp4 1920x1080 1080p 3637k , avc1.640028, 25fps, video only, 318.59MiB
18 mp4 640x360 360p 389k , avc1.42001E, 25fps, mp4a.40.2@ 96k (44100Hz), 178.03MiB
22 mp4 1280x720 720p 608k , avc1.64001F, 25fps, mp4a.40.2@192k (44100Hz) (best)
我们做gif表情包,不需要声音,下载一个高质量的Viedo only视频即可,下载指定视频:
youtube-dl -f 137 -o linux.mp4 'https://www.youtube.com/watch?v=MShbP3OpASA'
2. 裁剪视频
下载好之后,找到要裁剪的时间段:49:58,裁剪时长3秒,进行裁剪:
ffmpeg -i linux.mp4 -ss 00:49:58.00 -t 00:00:03.00 linux_3s.mp4
3. 添加文字
ffmpeg中可以用drawtext filter为视频添加水印或添加文字,需要编译ffmpeg添加支持:
- 使用drawtext,编译时需要加上--enable-libfreetype
- 要使用多种字体,需要加上--enable-libfontconfig
- 需要字体变形,需要加上--enable-libfribidi
查看ffpmeg编译参数:
ffmpeg -version
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.28)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_9 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
参数没有问题,就可以使用drawtext filter添加文字了:
ffmpeg -i linux_3s.mp4 -vf "drawtext=fontcolor=yellow:fontsize=100:fontfile=msyh.ttf:text='英伟达不讲武德':x=(w-text_w)/2:y=h-th-20" -y out_3s.mp4
设置文字位置:
- 顶端左侧: x=0:y=0 (边缘留白10像素: x=10:y=10)
- 顶端居中: x=(w-text_w)/2:y=0 (边缘留白10像素: x=(w-text_w)/2:y=10)
- 顶端右侧: x=w-tw:y=0 (边缘留白10像素: x=w-tw-10:y=10)
- 画面中心: x=(w-text_w)/2:y=(h-text_h)/2
- 底端左侧: x=0:y=h-th (边缘留白10像素: x=10:y=h-th-10)
- 底端居中: x=(w-text_w)/2:y=h-th (边缘留白10像素: x=(w-text_w)/2:y=h-th-10)
- 底端右侧: x=w-tw:y=h-th (边缘留白10像素: x=w-tw-10:y=h-th-10)
如果有多句话,可以指定时间段进行添加:
ffmpeg -i linux_3s.mp4 -vf "drawtext=enable='between(t,1,2.5)':fontcolor=yellow:fontsize=100:fontfile=msyh.ttf:text='英伟达不讲武德':x=(w-text_w)/2:y=h-th-20" -y out_3s.mp4
enable='between(t,1,2.5)' 指定的是在1s-2.5s之间添加文字。
4. 缩放视频尺寸
裁剪好后的源视频是1920x1080 1080p格式的,做成gif是全屏的比较大,需要先进行缩放:
ffmpeg -i out_3s.mp4 -vf scale=360:-2 small_3s.mp4
注意 sacle
值必须是偶数,这里的 -2
表示要求压缩出来的视频尺寸长宽都保持为偶数.如果需要保持长宽比,根据宽度值自适应高度,可以使用 -1
。
我这里只进行缩小就可以了,你也可能有加速播放和慢速播放的需要,也可以用实现。
4.1 加倍速播放视频
ffmpeg -i out_3s.mp4 -filter:v "setpts=0.5*PTS" out_speedup.mp4
4.2 定义帧率 16fps
ffmpeg -i out_3s.mp4 -r 16 -filter:v "setpts=0.125*PTS" -an out_16fps.mp4
4.3 慢倍速播放视频
ffmpeg -i out_3s.mp4 -filter:v "setpts=2.0*PTS" out_slowdown.mp4
5.将视频 MP4 转化为 GIF
经过以上步骤,已经有了我们处理完成的视频文件,只需要转换成gif即可:
ffmpeg -i small_3s.mp4 small.gif
转化成gif默认转换是中等质量的,压缩的比较厉害,可以修改比特率提高gif质量:
ffmpeg -i small_3s.mp4 -b 2048k small.gif
统过以上步骤就完成了我们要制作的gif,ffmpeg的生态比较丰富,目前很多在线制作表情包的网站和一些Telegram上的bot,就是通过ffmpeg进行制作。也可以找其它的视频进行制作,比如,张学友:食屎啦你、有钱真的可以为所欲为、王镜泽: 真香 等等。
附上最终做好的gif,和裁剪好的3秒源视频:
[...]手把手教你用ffmpeg制作表情包[...]