libavif-toolsをインストールしてJpegからAVIFへ一括変換。

AVIFを導入しているときの覚書。
AVIFがベースライン(すべての主要なブラウザ エンジンで安全に使用できる)になったのは2024年1月。

環境: CentOS Stream 9

今ならコマンドラインエンコーダavifencで簡単に変換できる。 


1.dnf経由でインストール

dnf上にあったのでインストールする。
# dnf install libavif-tools

ただしdnf上はv0.11.1だった。
# dnf info libavif

Name         : libavif
Version      : 0.11.1
Source       : libavif-0.11.1-5.el9.src.rpm
From repo    : epel

実行してみる。
# avifenc key-visual.jpg key-visual.avif

ファイルサイズを比較するとJpeg: 309KB, Webp: 76KB, Avif: 49KB

一括で変換するコマンドはこちら(Gemini 1.5 Proに教えてもらった)
サブディレクトリのファイルも変換する。
# find . -name "*.jpg" -print0 | xargs -0 -I {} sh -c 'f="{}"; avifenc "$f" "${f%.*}.avif"'


2.ソースからビルド

最新ライブラリを使うとどうなるか試してみる。
dnf経由をアンインストール。
# dnf remove libavif-tools

記事通りにやってみる。
参考: AVIF を使用してサイト上の画像を圧縮する  |  Articles  |  web.dev

ビルドに必要なツールとライブラリをインストール。
# dnf install cmake ninja-build
# dnf install zlib-devel libpng-devel libjpeg-devel

git clone
# cd /opt/software/
# git clone -b v0.9.1 https://github.com/AOMediaCodec/libavif.git
# cd libavif/
# git tag
# git checkout v1.1.1

libaom を取得してビルド
# cd ext/
# ./aom.cmd

エラー

--- aom_configure: Detected CPU: x86_64
CMake Error at build/cmake/aom_configure.cmake:178 (message):
  Unable to find assembler.  Install 'yasm' or 'nasm.' To build without
  optimizations, add -DAOM_TARGET_CPU=generic to your cmake command line.
Call Stack (most recent call first):
  CMakeLists.txt:73 (include)

yasmをインストールして再実行。
# dnf install yasm-devel
# ./aom.cmd

avifenc をビルド。
# cd ../
# mkdir build
# cd build
# cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..

エラー

--   Package 'libyuv', required by 'virtual:world', not found
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find libyuv (missing: LIBYUV_LIBRARY LIBYUV_LIBRARIES
  LIBYUV_INCLUDE_DIR) (found version "")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  cmake/Modules/Findlibyuv.cmake:52 (find_package_handle_standard_args)
  CMakeLists.txt:210 (find_package)
  CMakeLists.txt:229 (check_avif_option)

libyuvをインストールして再実行。
# dnf install libyuv-devel
# cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..

WARNINGが出た。

CMake Warning at CMakeLists.txt:582 (message):
  libavif: No decoding library is enabled.

デコードだから関係ないのかな?
ビルド実行。
# make 

変換実行。
# ./avifenc key-visual.jpg key-visual.avif

エラー

Encoding with codec 'none' speed [6], color quality [60 (Medium)], alpha quality [100 (Lossless)], tileRowsLog2 [0], tileColsLog2 [0], 4 worker thread(s), please wait...
ERROR: Failed to encode image: No codec available

バージョンが最新だからかな?
記事の通りv0.9.1にして再実行してみる。
# cd ../
# git clean -f
# rm -rf build/
# git checkout v0.9.1
# cd ext/
# ./aom.cmd
# cd ../
# mkdir build && cd build 
# cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..
# make

変換実行。
# ./avifenc key-visual.jpg key-visual.avif

Directly copied JPEG pixel data (no YUV conversion): key-visual.jpg
Successfully loaded: key-visual.jpg
AVIF to be written: (Lossy)
 * Resolution     : 1920x1200
 * Bit Depth      : 8
 * Format         : YUV444
 * Alpha          : Absent
 * Range          : Full
 * Color Primaries: 2
 * Transfer Char. : 2
 * Matrix Coeffs. : 6
 * ICC Profile    : Present (3144 bytes)
 * XMP Metadata   : Absent (0 bytes)
 * EXIF Metadata  : Absent (0 bytes)
 * Transformations: None
Encoding with AV1 codec 'aom' speed [6], color QP [24 (Medium) <-> 26 (Medium)], alpha QP [0 (Lossless) <-> 0 (Lossless)], tileRowsLog2 [0], tileColsLog2 [0], 1 worker thread(s), please wait...
Encoded successfully.
 * Color AV1 total size: 57406 bytes
 * Alpha AV1 total size: 0 bytes
Wrote AVIF: key-visual.avif

変換出来た。

もう一度v1.1.1でcmakeしてみる。
(コマンド省略)
# cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..

-- libavif: libyuv (1766) found; libyuv-based fast paths enabled.
-- libavif: some libyuv optimizations require at least version 1813 to work.

libyuvを最新にすればいいのかもしれない。

dnf経由でインストールしたのを使うことにした。



▼ 関連記事