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

Aug 14, 2022 14:16

作者:Nicolas

原文链接: https://chirpset.com/t/topic/431

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 发行版。

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 在线转换应用,一定可以极大程度的方便很多用户。或许接下来我们可以聊聊这部分功能的开发方法。