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

目錄
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。
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%品質。
magick convert input.jpeg -quality 90% output.avif
PNG轉AVIF可使用50%品質,能大幅縮小檔案容量
magick convert input.png -quality 50% output.avif
批次大量轉檔的指令:
magick mogrify -format avif -quality 90 -type truecolor -alpha on *.png
4. WebP (靜態) 轉AVIF #
WebP轉AVIF使用50%品質,容量縮小不明顯
magick convert input.webp -quality 50% output.avif
5. WebP (動圖) 轉AVIF #
WebP轉AVIF可以縮小圖片容量。
目前沒有工具能直接轉換,FFMPEG不支援動圖轉影片。所以要繞點圈子,步驟如下。
- 將webp的畫格抽取成一張張的png:
magick convert input.webp -coalesce input%05d.png
- 再將PNG合成為MP4,使用AV1編碼
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
6. 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
7. AVIF轉檔為JPEG / 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