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