如何将图片或视频转化为 AVIF/AVIFS 格式?

· 5分钟阅读
如何将图片或视频转化为 AVIF/AVIFS 格式?

AVIF 是新一代的图片压缩格式,不仅支持标准动态范围(SDR)图像,还支持高动态范围(HDR)和宽色域(WCG)。相对于传统 jpeg\png\webp\gif 图片格式而言,在提供更好的图像品质同时还能够有效的减少文件体积,并且支持透明图层。此外,AVIF 同样支持无损压缩。

AVIF 还支持动图技术(Animated Pictures),称之为Image Sequence,跟AV1编码渊源颇深。AVIF 动图文件扩展名可能为 .avifs 或.avis ,不过浏览器和图片编辑器能够自动判别,因此只需要统一使用 .avif 当文件扩展名就好。

目前,几乎所有浏览器与主流操作系统都已经支援 AVIF。Windows 10/11 或 Android 12 等系统已经提供了对它的支持。苹果公司将在 iOS 16 提供对 AVIF 的支持。以 Chromium 为基础开发的Google Chrome、Microsoft Edge浏览器皆支援AVIF动图,不过使用Gecko排版引擎的Firefox还无法显示。

既然 AVIF 已成大势所趋,那么了解一下如何从 jpeg\png\webp\gif 等图片格式转化为 AVIF 还是很有必要的。本文将以 Linux 系统为例,教您如何使用工具集通过命令行方式转换传统图片、视频格式到 AVIF

涉及到工具

全都是开源工具,可免费安装,兼容所有 Linux 发行版。

  • libavif(AVIF库) | Github
  • rav1e(AV1编码器) | Github
  • aom(AV1编码器) | Google git
  • imagemagick(图片处理工具) | 官网
  • ffmpeg(音视频处理工具) | 官网
  • gpac(视频处理工具) | Github
  • av1an(视频处理工具) | Github

GIF 转换 AVIF

首先,使用 ffmpeg 将 GIF 转成未压缩的 yuv,再使用 avifenc 将其编码成AVIF。

命令如下:

ffmpeg -i input.gif -strict -1 -f yuv4mpegpipe -pix_fmt yuva444p - | avifenc --stdin output.avif

JPEG/PNG 转换 AVIF

对于这个格式转换功能,我们使用 Image Magick 工具来做——支持转换静态图片为AVIF,并且可以设定图片品质。

命令如下:

由于JPEG(JPG)图片格式基本已被压缩处理过,我们建议在转换为 AVIF 格式时维持90%品质。

magick convert input.jpeg -quality 90% output.avif

而PNG转换AVIF我们建议使用50%品质,可以大幅缩小文件体积。

magick convert input.png -quality 50% output.avif

批量转换 PNG 到 AVIF时,我们可以这么做:

magick mogrify -format avif -quality 50 -type truecolor -alpha on output *.png

WebP 格式转换 AVIF

WebP 静态图转换 AVIF 即便制定 50% 品质,文件体积下降也不明显,不过图片清晰度肉眼基本看不出区别。

magick convert input.webp -quality 50% output.avif

WebP 动图转换 AVIF 可以显著降低文件体积。不过转换起来有点繁琐。因为目前没有工具能直接转换,FFMPEG 也不支持 WebP 动图转视频,所以要绕点圈子。

步骤如下:

首先,将 webp 动图画帧抽取成一张张的png图片:

magick convert input.webp -coalesce input%05d.png

其次,使用 AV1 编码将 PNG 合成为 MP4 文件:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' -c:v libxaom -pix_fmt yuv420p output.mp4

最后使用 MP4Box 将 MP4 转换成 AVIF:

MP4Box -add-image output.mp4:id=1:primary -new output.avifs
MP4Box -ab avis -ab msf1 -ab miaf -ab MA1B -rb mif1 -brand avis output.avifs
MP4Box -add output.mp4:hdlr=pict:ccst:name="GPAC avifs" output.avifs

MP4/WebM 视频转换成 AVIF 动图

AVIF(S) 动图编码器为 AV1,跟MP4一样都是视频容器,所以有些浏览器会直接把它认成MP4。

💡
任何视频格式(mp4、mkv、webm、avi、mov…) 都需要首先确认视频编码器为AV1,才可以用 MP4Box 转成 AVIF 动图。

如果视频不是 AV1 编码,我们可以先用 AV1an 将视频转换为 AV1 编码。在这个过程中,我们可以调大 cq-level 数值来减小最终文件的体积。命令如下:

av1an -i "input.mp4" -v "--end-usage=q --cpu-used=6 --threads=8 --cq-level=30"

然后使用 FFMPEG 将 MKV 文件原封不动的转换为 MP4 並刪除音频:

ffmpeg -i input_aom.mkv -c copy -an output.mp4

最后再使用 MP4Box 将 MP4 文件转换为 AVIF(S):

MP4Box -add-image output.mp4:id=1:primary -new output.avifs
MP4Box -ab avis -ab msf1 -ab miaf -ab MA1B -rb mif1 -brand avis output.avifs
MP4Box -add output.mp4:hdlr=pict:ccst:name="GPAC avifs" output.avifs

AVIF 转换为 MPEG/PNG

要将 AVIF 格式要转换回 JEPG/PNG 很简单,使用 Image Magick 即可。命令如下:

AVIF 转换 JPEG

magick convert input.avif -quality 90% output.jpeg

AVIF 转换 PNG(可保留透明度)

magick convert input.avif -quality 90% output.png

最后,如果通过编程将以上功能整合为 AVIF/AVIFS 在线转换应用,一定可以极大程度的方便很多用户。或许接下来我们可以聊聊这部分功能的开发方法。