制作avifenc-butteraugli docker镜像

WARNING: This article may be obsolete
This post was published in 2022-05-19. Obviously, expired content is less useful to users if it has already pasted its expiration date.
This article is categorized as "Garbage" . It should NEVER be appeared in your search engine's results.


参考资料

向依赖地狱投降

经验总结:绝大部分场合下,编译butteraugli相关的内容时一定要使用最新git repo

所有参考资料:

🔗 [Enable tune butteraugli support · Issue #622 · AOMediaCodec/libavif] https://github.com/AOMediaCodec/libavif/issues/622

🔗 [Error while loading shared libraries · Issue #49 · gmarcais/Jellyfish] https://github.com/gmarcais/Jellyfish/issues/49

🔗 [relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC · Issue #2171 · BVLC/caffe] https://github.com/BVLC/caffe/issues/2171

🔗 [Exception for sh1 dot not found · Issue #13 · beyondcode/laravel-er-diagram-generator] https://github.com/beyondcode/laravel-er-diagram-generator/issues/13

🔗 [High quality encoding of AVIF images using aomenc-av1: a small guide : AV1] https://www.reddit.com/r/AV1/comments/o7s8hk/high_quality_encoding_of_avif_images_using/

🔗 [Is there any suggest about the butteraugli compare result value? · Issue #22 · google/butteraugli] https://github.com/google/butteraugli/issues/22

(有关butteraugli的编译)🔗 [butteraugli | Wener Live & Life] https://wener.me/notes/service/media/butteraugli

🔗 [Using AVIF to compress images on your site] https://web.dev/compress-images-avif/#building-command-line-encoder-avifenc

准备

Debian的Docker(命令行版本,不是Docker-Desktop)安装笔记见:🔗 [Wordpress docker - Truxton's blog] https://truxton2blog.com/wordpress-docker/

先拉一个Debian 12(以前用的是Debian 11,2023年6月换成了Debian 12),安装一堆包:

# 在此之前最好检查一下有没有历史遗留的docker debian images

docker pull docker.io/debian

执行 $ docker run --name debian_container_avif_webp -it debian /bin/bash 以后,在docker-debian-bash下:

apt update;apt upgrade


apt install -y clang vim wget git sudo ninja-build nasm cmake pkg-config libbrotli-dev libgflags-dev libgif-dev libjpeg-dev libopenexr-dev libpng-dev

方法1(成功)

汇总

版本:

libwebp: v1.4.0

libavif: v1.1.1

aom: v3.10.0

libjxl: 默认latest. 因为只会用到butteraugli相关的代码,所以对版本稳定性没有特殊要求。 很长一段时间都用latest,但2023年6月突然发现latest有点问题(butteraugli.h装不上去),所以暂时用最新的stable release v0.8.2 . 再后来我发现libjxl开发组已经把butteraugli api从项目中永久移除了(见:🔗 [remove Butteraugli from the libjxl API by jonsneyers · Pull Request #2576 · libjxl/libjxl] https://github.com/libjxl/libjxl/pull/2576),但鉴于reddit的很多人认为Butteraugli仍然是最佳,所以本项目暂时还在用Butteraugli,v0.8.2可能要一直这么用下去了。

但一直用v0.8.2总觉得有点不舒服,所以还在密切关注Butteraugli的候选算法(比如VMAF)。

2024-08-30 编译通过:

apt update;apt -y upgrade


apt install -y clang vim wget git sudo ninja-build nasm


apt install -y  cmake pkg-config libbrotli-dev libgflags-dev libgif-dev libjpeg-dev libopenexr-dev libpng-dev


# webp
cd /root

wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.4.0.tar.gz

tar -xzvf libwebp-1.4.0.tar.gz

cd libwebp-1.4.0
./configure
make -j$(nproc)
sudo make install

rm -rf /root/libwebp-1.4.0

rm /root/libwebp-1.4.0.tar.gz


# avif

cd /root

git clone -b v0.8.2 https://github.com/libjxl/libjxl.git --recursive
sudo apt install cmake pkg-config libbrotli-dev
sudo apt install libgif-dev libjpeg-dev libopenexr-dev libpng-dev

cd libjxl
mkdir build
cd build

apt --purge remove -y gcc

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF ..
cmake --build . -- -j$(nproc)

sudo cmake --install .

cd /root
git clone -b v3.10.0 https://aomedia.googlesource.com/aom
cd aom

# If you want to use libaom v3.1.0, run the command:
#     git checkout v3.1.0
# and then apply the following four patches:
#     https://aomedia-review.googlesource.com/c/aom/+/136044
#     https://aomedia-review.googlesource.com/c/aom/+/134506
#     https://aomedia-review.googlesource.com/c/aom/+/135521
#     https://aomedia-review.googlesource.com/c/aom/+/136082

mkdir build.libavif
cd build.libavif
cmake -DCONFIG_TUNE_BUTTERAUGLI=1 -DCMAKE_BUILD_TYPE=Release \
-DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 \
-DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
make -j$(nproc)
sudo make install


cd /root

git clone -b v1.1.1 https://github.com/AOMediaCodec/libavif

cd libavif/ext
bash libyuv.cmd
bash libsharpyuv.cmd
bash libjpeg.cmd
bash zlibpng.cmd

cd ..

cmake -S . -B build -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=SYSTEM -DAVIF_LIBYUV=LOCAL -DAVIF_LIBSHARPYUV=LOCAL -DAVIF_JPEG=LOCAL -DAVIF_ZLIBPNG=LOCAL -DAVIF_BUILD_APPS=ON
cmake --build build --parallel

ln -s /root/libavif/build/avifenc /usr/bin/avifenc
ln -s /root/libavif/build/avifdec /usr/bin/avifdec

接下来会删除多余文件,如果以上编译环境需要保存并反复调试则需要在接下来的命令开始之前保存一次docker:

# 删除多余文件
apt --purge remove clang vim wget git ninja-build nasm cmake
apt autoremove

# 有的时候还是会误伤libatomic,需要补回去
# 最近(2023年9月以后)发现已经不需要这么做了
# apt install libatomic1

rm -rf /root/aom
rm -rf /root/libjxl

# 检查
avifenc --version
avifdec --version
cwebp -version
dwebp -version

然后导出Docker镜像:

docker commit debian_container_avif_webp debian:avif_webp_modified

docker save debian:avif_webp_modified | gzip > avif_webp.tar.gz
历史版本

2022-05,不包含GoogleTest的版本:

apt update;apt -y upgrade


apt install -y clang vim wget git sudo ninja-build nasm


apt install -y  cmake pkg-config libbrotli-dev libgflags-dev libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev


cd /root

git clone https://gitlab.com/wg1/jpeg-xl.git --recursive
sudo apt install cmake pkg-config libbrotli-dev
sudo apt install libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev

cd jpeg-xl
mkdir build
cd build

apt --purge remove -y gcc

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF ..
cmake --build . -- -j$(nproc)

sudo cmake --install .

cd /root
git clone https://aomedia.googlesource.com/aom
cd aom

# If you want to use libaom v3.1.0, run the command:
#     git checkout v3.1.0
# and then apply the following four patches:
#     https://aomedia-review.googlesource.com/c/aom/+/136044
#     https://aomedia-review.googlesource.com/c/aom/+/134506
#     https://aomedia-review.googlesource.com/c/aom/+/135521
#     https://aomedia-review.googlesource.com/c/aom/+/136082

mkdir build.libavif
cd build.libavif
cmake -DCONFIG_TUNE_BUTTERAUGLI=1 -DCMAKE_BUILD_TYPE=Release \
-DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 \
-DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
make -j
sudo make install


cd /root

git clone https://github.com/AOMediaCodec/libavif
cd libavif
mkdir build
cd build


cmake -G Ninja .. -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=ON \
-DAVIF_LOCAL_AOM=OFF -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON \
-DCMAKE_BUILD_TYPE=Release

ninja

ln -s /root/libavif/build/avifenc /usr/bin/avifenc
ln -s /root/libavif/build/avifdec /usr/bin/avifdec

2022-05,包含GoogleTest的版本:

apt update;apt -y upgrade


apt install -y clang vim wget git sudo ninja-build nasm


apt install -y  cmake pkg-config libbrotli-dev libgflags-dev libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev


cd /root

git clone https://gitlab.com/wg1/jpeg-xl.git --recursive
sudo apt install cmake pkg-config libbrotli-dev
sudo apt install libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev

cd jpeg-xl
mkdir build
cd build

apt --purge remove -y gcc

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF ..
cmake --build . -- -j$(nproc)

sudo cmake --install .

cd /root
git clone https://aomedia.googlesource.com/aom
cd aom

# If you want to use libaom v3.1.0, run the command:
#     git checkout v3.1.0
# and then apply the following four patches:
#     https://aomedia-review.googlesource.com/c/aom/+/136044
#     https://aomedia-review.googlesource.com/c/aom/+/134506
#     https://aomedia-review.googlesource.com/c/aom/+/135521
#     https://aomedia-review.googlesource.com/c/aom/+/136082

mkdir build.libavif
cd build.libavif
cmake -DCONFIG_TUNE_BUTTERAUGLI=1 -DCMAKE_BUILD_TYPE=Release \
-DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 \
-DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
make -j
sudo make install


cd /root

git clone https://github.com/AOMediaCodec/libavif
cd libavif
mkdir build
cd build


cmake -G Ninja .. -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=ON \
-DAVIF_LOCAL_AOM=OFF -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON \
-DAVIF_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release

ninja

ln -s /root/libavif/build/avifenc /usr/bin/avifenc
ln -s /root/libavif/build/avifdec /usr/bin/avifdec

分段代码(软件版本已经过期)

建议直接参考汇总

直接照搬了下面链接的构建代码:

🔗 [Enable tune butteraugli support · Issue #622 · AOMediaCodec/libavif] https://github.com/AOMediaCodec/libavif/issues/622

git clone https://gitlab.com/wg1/jpeg-xl.git --recursive
sudo apt install cmake pkg-config libbrotli-dev
sudo apt install libgif-dev libjpeg-dev libopenexr-dev libpng-dev libwebp-dev

cd jpeg-xl
mkdir build
cd build

apt --purge remove -y gcc

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DJPEGXL_ENABLE_BENCHMARK=OFF ..
cmake --build . -- -j$(nproc)

sudo cmake --install .
git clone https://aomedia.googlesource.com/aom
cd aom

# If you want to use libaom v3.1.0, run the command:
#     git checkout v3.1.0
# and then apply the following four patches:
#     https://aomedia-review.googlesource.com/c/aom/+/136044
#     https://aomedia-review.googlesource.com/c/aom/+/134506
#     https://aomedia-review.googlesource.com/c/aom/+/135521
#     https://aomedia-review.googlesource.com/c/aom/+/136082

mkdir build.libavif
cd build.libavif
cmake -DCONFIG_TUNE_BUTTERAUGLI=1 -DCMAKE_BUILD_TYPE=Release \
-DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 \
-DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
make -j
sudo make install

如果拉取的libavif在commit  44b086a31433e63f84d9a4e6cca49e311d7c9833 之后,那么就需要去掉google test的构建;否则可以继续使用google test.

git clone https://github.com/AOMediaCodec/libavif
cd libavif
mkdir build
cd build


cmake -G Ninja .. -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=ON \
-DAVIF_LOCAL_AOM=OFF -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON \
-DAVIF_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release

ninja

在启动指令前,需要

export LD_LIBRARY_PATH=/usr/local/lib

在Docker中运行

首先后台开一个docker容器:

docker run  -v /xxxxx/wp-content/:/xxxxx/wp-content:Z --name avif --rm -it -d  -e LD_LIBRARY_PATH=/usr/local/lib [docker image ID]

可以再次检查一遍avif/webp的版本:

docker exec avif cwebp -version

docker exec avif dwebp -version

docker exec avif avifenc --version

docker exec avif avifdec --version

然后执行转换命令(每转换一张图都要使用这个命令):

docker exec avif avifenc [-parameters] input.jpg output.jpg.avif

方法2(目前是废案,无法通过butteraugli的编译)

开始构建jpegXL

# 主要参考https://github.com/libjxl/libjxl的教程
# 一定要使用最新版


git clone https://github.com/libjxl/libjxl.git --recursive --shallow-submodules


export CC=clang CXX=clang++


#  apt install libavif-dev libavif9


cd libjxl
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF ..
cmake --build . -- -j$(nproc)


sudo cmake --install .


#  apt remove libavif-dev libavif9

然后开始处理libavif-ext

git clone https://github.com/AOMediaCodec/libavif


cd libavif/ext

处理aom,首先clone git repo:

git clone --depth=1 https://aomedia.googlesource.com/aom

cd aom
mkdir build.libavif
cd build.libavif

# 选择一个cmake语句
# cmake xxxxxxxx

ninja

可选cmake:

# 原始cmake(不含DBUILD_SHARED_LIBS):
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..

# 添加DBUILD_SHARED_LIBS:
cmake -G Ninja -DBUILD_SHARED_LIBS=1 -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0  ..

# 添加DCONFIG_TUNE_BUTTERAUGLI:
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 -DCONFIG_TUNE_BUTTERAUGLI=1 ..

然后处理libyuv

修改libyuv.cmd的内容如下:

git clone https://chromium.googlesource.com/libyuv/libyuv

cd libyuv

mkdir build
cd build

# 选择一个cmake语句
# cmake xxxxxxx

ninja yuv

可选的cmake语句:

# 原始cmake
cmake -G Ninja -DBUILD_SHARED_LIBS=0 -DCMAKE_BUILD_TYPE=Release ..

# 修改DBUILD_SHARED_LIBS=1,同时添加CMAKE_CXX_FLAGS
cmake -G Ninja -DBUILD_SHARED_LIBS=1 -DCMAKE_CXX_FLAGS=-fPIC -DCMAKE_BUILD_TYPE=Release ..

然后编译libavif

cd libavif
mkdir build
cd build


# 选择一个cmake语句
# cmake xxxxxxx

make

可选的cmake语句:

# 原始语句,https://web.dev/compress-images-avif/#building-command-line-encoder-avifenc
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 ..

# 使用本地libyuv:
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DAVIF_CODEC_AOM=1 -DAVIF_LOCAL_AOM=1 -DAVIF_BUILD_APPS=1 -DAVIF_LOCAL_LIBYUV=1 ..

参数组合

aomlibyuvlibavif结果
原班人马:
不显式声明-DBUILD_SHARED_LIBS
原班人马:
显式声明-DBUILD_SHARED_LIBS=0
原班人马:
显式声明-DBUILD_SHARED_LIBS=0
(原班人马)可行
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=0显式声明-DBUILD_SHARED_LIBS=155%以后爆炸报错
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=0显式声明-DBUILD_SHARED_LIBS=088%以后爆炸报错
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=1,
同时添加CMAKE_CXX_FLAGS=-fPIC
显式声明-DBUILD_SHARED_LIBS=088%以后爆炸报错,
同时还有报错“ undefined reference to `JxlButteraugliApiSetHFAsymmetry' ”
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=1,
同时添加CMAKE_CXX_FLAGS=-fPIC
显式声明-DBUILD_SHARED_LIBS=159%以后爆炸报错,
结尾没有关于Butteraugli的报错
显式声明-DBUILD_SHARED_LIBS=1显式声明-DBUILD_SHARED_LIBS=1显式声明-DBUILD_SHARED_LIBS=1
报错:recompile with -fPIC,需要修改libyuv的cmake选项(修改结果见下一行)
显式声明-DBUILD_SHARED_LIBS=1显式声明-DBUILD_SHARED_LIBS=1,
同时添加CMAKE_CXX_FLAGS=-fPIC
显式声明-DBUILD_SHARED_LIBS=1修好了上一行的问题:可行
显式声明-DBUILD_SHARED_LIBS=1,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=1,
同时添加CMAKE_CXX_FLAGS=-fPIC
显式声明-DBUILD_SHARED_LIBS=152%以后爆炸报错
显式声明-DBUILD_SHARED_LIBS=0,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=1,
同时添加CMAKE_CXX_FLAGS=-fPIC
显式声明-DBUILD_SHARED_LIBS=188%以后爆炸报错,
同时还有报错“ undefined reference to `JxlButteraugliApiSetHFAsymmetry' ”

去掉本地yuv,专门负责处理aom

aomlibavif结果
不显式声明-DBUILD_SHARED_LIBS显式声明-DBUILD_SHARED_LIBS=0能编译
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=092%以后出现错误:
undefined reference to `JxlButteraugli*'
不显式声明-DBUILD_SHARED_LIBS,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=162%以后爆炸错误
显式声明-DBUILD_SHARED_LIBS=1,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=092%以后出现错误:
undefined reference to `JxlButteraugli*'
显式声明-DBUILD_SHARED_LIBS=1,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
显式声明-DBUILD_SHARED_LIBS=192%以后出现错误:
undefined reference to `JxlButteraugli*'
显式声明-DBUILD_SHARED_LIBS=1,
附带-DCONFIG_TUNE_BUTTERAUGLI=1
去掉-DBUILD_SHARED_LIBS92%以后出现错误:
undefined reference to `JxlButteraugli*'

libyuv废案:

git clone https://chromium.googlesource.com/libyuv/libyuv
cd libyuv
mkdir out
cd out
cmake -DCMAKE_INSTALL_PREFIX="/usr/local" -DCMAKE_BUILD_TYPE="Release" ..
cmake --build . --config Release
sudo cmake --build . --target install --config Release


 Last Modified in 2024-08-30 

Leave a Comment Anonymous comment is allowed / 允许匿名评论