在油管上看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添加支持:

  1. 使用drawtext,编译时需要加上--enable-libfreetype
  2. 要使用多种字体,需要加上--enable-libfontconfig
  3. 需要字体变形,需要加上--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秒源视频:

small.gif
裁剪后3秒源视频