如何將圖片影片轉檔成AVIF / AVIFS

🇺🇸 English version

Convert images or videos to AVIF/AVIFS。

本文列出一些轉檔XX格式為AVIF/AVIFS的指令供參考教學,文末提供將AVIF轉回JPEG/PNG的指令。

下面是一張AVIF動圖,用Chromium系瀏覽器應可正常瀏覽。

AVIF (副檔名.avif)是新一代的圖片壓縮格式,提供更高效壓縮率和更好的圖像品質,並且有效減少檔案容量,支援透明圖層。此外AVIF也支援無損壓縮。

AVIF另支援動圖(animated pictures),稱之為image sequence,跟AV1編碼淵源頗深。有時候AVIF動圖副檔名會用.avifs.avis,但瀏覽器和圖片檢視器應會自動判別,因此使用.avif當副檔名就好。

目前2022年,所有瀏覽器與主流作業系統皆支援AVIF。以Chromium為基礎開發的Google Chrome、Microsoft Edge瀏覽器皆支援AVIF動圖;使用Gecko排版引擎的Firefox還無法顯示。

1. 需要的工具

作業系統:Arch Linux

以下是本篇文章會用到的軟體,全都是開源跨平台的,Arch請直接用pacman安裝。

名稱 說明 下載點
libavif AVIF函式庫 Github
rav1e AV1編碼器 Github
aom AV1編碼器 Google git
imagemagick 影像處理工具 官網
ffmpeg 視訊處理工具 官網
gpac 視訊處理工具 Github
av1an 視訊處理工具 Github

2. GIF轉AVIF

參考

用ffmpeg將GIF轉成未壓縮的yuv,再丟給avifenc編碼成AVIF。

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

3. JPEG / PNG 轉AVIF

Image Magick支援轉換靜態圖片為AVIF,並且可以設定品質。

詳細討論

因為JPEG(JPG)圖片多半有壓縮過,轉AVIF維持90%品質。

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

PNG轉AVIF可使用50%品質,能大幅縮小檔案容量

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

批次大量轉檔的指令:

1
magick mogrify -format avif -quality 90 -type truecolor -alpha on *.png

4. WebP (靜態) 轉AVIF

WebP轉AVIF使用50%品質,容量縮小不明顯

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

5. WebP (動圖) 轉AVIF

WebP轉AVIF可以縮小圖片容量。

目前沒有工具能直接轉換,FFMPEG不支援動圖轉影片。所以要繞點圈子,步驟如下。

  1. 將webp的畫格抽取成一張張的png:
1
magick convert input.webp -coalesce input%05d.png
  1. 再將PNG合成為MP4,使用AV1編碼
1
ffmpeg -framerate 30 -pattern_type glob -i '*.png' -c:v libxaom -pix_fmt yuv420p output.mp4
  1. 最後用MP4Box將MP4轉成AVIF
1
2
3
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

6. MP4 / WebM 影片轉AVIF動圖

參考

AVIF(S)的動圖編碼器為AV1,跟MP4一樣只是影片容器,所以有些瀏覽器會直接把它認成MP4。

任何影片格式(mp4、mkv、webm、avi、mov…) 需要先確認影片編碼器是AV1,才可以用MP4Box轉成AVIF動圖。

  1. 如果不是AV1編碼,使用Av1an將影片轉成AV1編碼(提高cq-level數值以換取更小檔案),詳細討論
1
av1an -i "input.mp4" -v "--end-usage=q --cpu-used=6 --threads=8 --cq-level=30"
  1. 再用FFMPEG將MKV原封不動轉成MP4並刪除音訊
1
ffmpeg -i input_aom.mkv -c copy -an output.mp4
  1. 用MP4Box將MP4轉成AVIF(S)
1
2
3
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

7. AVIF轉檔為JPEG / PNG

AVIF要轉為JEPG和PNG很簡單,把Image Magick的指令倒轉即可。

AVIF轉JPEG:

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

AVIF轉PNG可保留透明度:

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

如果本網站文章對您有幫助,歡迎贊助我。