前言

最近沉迷于 Telegram 贴纸包的制作,本着精益求精强迫症的态度,想做一些背景透明的动图出来。但咱贫乏的知识储备告诉咱,能支持 Alpha 通道的动图/视频格式并不多,于是暂时搁置。

前几天正巧看到这么些个带有圆角边框的动态贴纸,显然是采用了支持 Alpha 通道的格式,启发了咱的制作思路,在此进行分享。

准备工作

因为目标是上传到 Telegram 的视频贴纸包,所以需要符合一定的格式要求。

  • 格式 WebM
  • 尺寸 最大 512x512 且强制其中一边为 512px
  • 帧率 最高 30 FPS
  • 时间 最长 3s
  • 大小 最大 256KB
  • 编码 VP9
  • 其他 无音频流

需要的软件:

  • FFmpeg 十分强大的工具,这里用于对视频进行压缩转码
  • 一个视频剪辑软件 我使用的是达芬奇

开始制作

一、制作

首先,在视频编辑软件里制作好含 Alpha 通道的视频。

制作方法有很多:

  • 可以直接对相应元素进行扣除

    如,利用达芬奇的调色面板中的通道或蒙版进行抠像
  • 可以导入含 Alpha 通道的图片进行拼接

    此方法针对咱制作的动画贴纸,因为动画含有大量连续的相同帧
    故可以导出到 PS 处理后再导入视频编辑软件
    对于其他类型不一定适用

二、导出

假设已经在达芬奇里制作好了一段背景是透明的视频,接下来我们需要导出视频,并保留 Alpha 通道。

但问题来了,现存绝大多数视频编辑软件不支持直接导出 WebM 格式,而能导出且支持 Alpha 通道的格式,如 DNxHR,在 FFmpeg 中对于其 Alpha 通道的特性支持不佳。

如何解决这个问题?我们的方法是,让达芬奇使用 TIFF 格式导出视频,而该格式也能成功在 FFmpeg 中正常进行转码导出成 WebM 格式。

但由于 TIFF 是图片格式,所以说实际上导出的是视频的每一帧的 TIFF 图片,在导出和后续转码过程中需要注意这一点。

在达芬奇中,我们只需要对渲染设置进行一些调整即可导出。

  • 文件名

    对于后续 FFmpeg 的操作较为重要,建议取简单点
  • 位置

    此目录下会保存大量的 TIFF 图片,请注意

在视频选项卡下:

  • 格式 选择 TIFF
  • 编解码器 选择 RGB 8 bits (LZW Compression)

    此处还有 16 bit 的选项等,请自行选择
    LZW 是一种常见的压缩算法,可以节省一些存储空间
  • 分辨率

    对于贴纸包的制作,此处选择 512x512 或对应分辨率
  • 帧率

    在达芬奇中此项与项目设置直接相关
  • 勾选 导出Alpha 选项

在文件选项卡下:

  • 文件名使用 选择 自定义名称

    为默认选项,保持即可
  • 使用 8 位数(在文件名中)

    • 每个片段起始帧 1
    这两个选项影响文件的总帧数计数
    前者决定帧数计数的位数
    example_0001.tif 即为 4 位数
    后者决定帧数计数的起始数
    如 第一帧为 example_0030.tif 即为起始帧 30

说明完毕。设置好了直接进行导出。

三、转码

导出好了带有 Alpha 通道的图片,下一步就是将这些图片进行转码压制。这里就不赘述 FFmpeg 的安装了。

假设我们已经在系统变量中加入了 FFmpeg 的目录,即可以直接在命令行调用程序。我们打开上一步导出图片的目录,并在此处打开命令行。

接下来可以输入以下命令:

ffmpeg.exe -r 30 -i .\example_%4d.tif -c:v libvpx-vp9 -an -crf 32 -b:v 0 .\example.webm

命令参数详解:

  • ffmpeg.exe 指定运行的程序
  • -r 30 指定输入文件的帧数

    此处应当与之前导出时设置的帧数,即项目设置的帧数保持一致
    此项只有在使用图片作为输入文件时需要,默认为 24
  • -i .\example_%4d.tif 指定输入的文件

    此处采用 %4d 的格式编写,是指读取目录下所有符合这样「4位数字」格式的文件,作为输入文件
    (这个写法,完全就是 C 语言)
    通过这种方式,将独立的每一帧的图片转换为一个连续的视频
  • -c:v libvpx-vp9 指定使用的编码器

    此处 libvpx 为谷歌出品的 VP8 以及 VP9 编码器,后方 -vp9 指定为 VP9 编码器
    -c:v 也可以写成 -vcodec
  • -an 指禁用音频流

    类似的,还有 -vn 禁用视频流
  • -crf 32 -b:v 0 指定 以恒定质量编码 且参数为 32

    此处 CRF 即 Constant Rate Factor,以恒定质量编码
    该数字越小,质量越高,占用的空间也越大
    范围 0-63,对于表情包的制作可以选择在 33 左右
    在需要控制文件大小时,可以采用更改该参数的办法

    -b:v 0 指定目标比特率
    此处设置为 0,可以触发 VP9 编码器的恒定质量模式(Constant Quality)
    该模式类似于 x264 编码的质量控制,且采用 One-Pass
    需要控制文件大小时,可以改成指定的码率,并会采用 Two-Pass

  • .\example.webm 指定输出文件

此外,转码时还可以对帧数进行调整。但请注意,此方法应当只在无法对前一步导出时的帧数进行设置的时候使用。若没有其他办法,必须要使用时,尽量从较高帧数向较低帧数调整。

调整的方法很简单,只需要在上述命令中加入相应参数即可。

  • -an 后加上 -filter:v fps=30

    此处 -filter:v 指对视频流应用滤镜
    后方 fps=30 即为调整帧数为 30
    -filter:v 也可以写成 -vf

如果没啥差错,执行完该命令后,该目录下就有目标文件 example.webm 了,该文件即为我们所需要的带有 Alpha 通道的视频文件。

四、验证

导出完毕了,但直接播放也看不出来有没有透明度,如何验证呢?

首先是看运行上面的命令时的输出。如果能看到像素格式是 yuva420p,那么至少能确定所导出的视频是含有 Alpha 通道的。

其次,可以把视频拖入 Chrome 浏览器,然后通过 F12 修改 CSS:background-color: green;。如果能看到透明部分变成绿色的效果,即为成功。

再者,还可以把视频拖入 Telegram 进行发送。如果透明部分是白色,且预览时显示为灰白相间的格子,即为成功。

结语

上述说明可能大概也许应该讲清楚了吧。

FFmpeg 真的是一款强大的软件,对于视频处理工作帮助很大。

不仅仅是视频的处理,还有音频,mkv 的打包和解包,实在是很厉害。

参考资料

https://asimov.top/archives/ffmpeg-encoding-and-editing-course
https://trac.ffmpeg.org/wiki/Encode/VP9
https://developers.google.com/media/vp9/settings/vod