本文将教你,如何一步步制作出长毛象所需的apng动图。

所需工具:

以上工具,除最后用于压图的 tinypng 之外,均为开源自由软件。

大致步骤:

  • 将视频或gif动画转成一组单帧图片

  • 对这组图片进行相应处理(可选)

  • 将处理后图片合成为apng

  • 使用 tinypng 压缩 apng 文件大小(可选)

MP4格式

文件来源:原嘟文找不到了(如果有谁知道,请说明一下),本实例缓存的文件地址

将mp4文件转换为一组单帧图片

查看mp4文件信息

ffmpeg -i 9a161de3d2d8309e.mp4
ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.1.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
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
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '9a161de3d2d8309e.mp4':
Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.20.100
Duration: 00:00:00.53, start: 0.000000, bitrate: 682 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 200x200, 669 kb/s, 28.58 fps, 28.58 tbr, 10976 tbn, 57.17 tbc (default)
    Metadata:
    handler_name    : VideoHandler

该mp4文件帧率 28.58 fps。

ffmpeg -i 9a161de3d2d8309e.mp4 -q:v 2 -r 28 9%03d.png

参数含义:

  • -i 9a161de3d2d8309e.mp4 :输入文件

  • -q:v 2 : 最好质量

  • -r 28 : 每秒取28帧

合成apng

apngasm -o mastodon_output.png 90*.png -d 35

参数含义:

  • -o mastodon_output.png : 输出文件

  • -d 35 : 帧与帧之间间隔35毫秒(1000/28)

APNG效果:

压缩成品大小

长毛象表情最大50KB,所以还需要压缩图片大小。

原始大小:493.85 KB 使用tinypng压缩后:181.4 KB

压缩后的图像:

但文件大小还是大于50 KB,所以需要重新处理。

视频每帧原本为200×200px,现将其压缩为80×80px,然后再行制作apng。

ls 90*.png | xargs -n1 -I{} convert -resize '80x80' {} c{}
apngasm -o mastodon_output_c.png c90*.png -d 35

再次得到的apng,文件大小:112 KB。

使用tinypng压缩后:43 KB,符合相应要求,表情制作成功。

gif格式

gif动图的处理过程,基本同上。

文件来源:锤桌子这套表情包我真的看一次笑疯一次(有更新)

将gif文件转换为一组单帧图片

convert -coalesce p232962970.gif p%02d.png

查看gif信息

ffmpeg -i p232962970.gif
ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 10.1.0 (GCC)
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
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
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
Input #0, gif, from 'p232962970.gif':
Duration: 00:00:01.47, start: 0.000000, bitrate: 2024 kb/s
    Stream #0:0: Video: gif, bgra, 200x200, 14.25 fps, 14.29 tbr, 100 tbn, 100 tbc

合成apng

apngasm -o douban_output.png p*.png -d 70

最终成品(大小328.5KB):

压缩大小后的成品(大小45KB):


如果你觉得上述步骤有一点麻烦,可以直接使用 gif2apng 直接将 gif 转为 apng。

gif2apng p232962970.gif douban_gif2apng_output.png

成品如下(大小309.7KB):