Одной из новых функций Android 12 является поддержка формата файлов AVIF, который обеспечивает файлы гораздо меньшего размера при том же уровне качества. Джейк Арчибальд проделал огромную работу по сравнению формата AVIF с JPEG, WebP и другими форматами неподвижных изображений, и результаты действительно впечатляют.
Помимо Android 12, AVIF уже поддерживается в браузере Chrome и будет включен по умолчанию в Firefox 86, но здесь мы рассмотрим некоторые программы и библиотеки с открытым исходным кодом, которые позволяют вам управлять изображениями AVIF.
С помощью библиотеки libavif, AOMedia опубликовала эталонную реализацию на C вместе с инструментами avifenc и avifdec, которые полагаются на различные кодеки, но, похоже, rav1e рекомендуется для кодирования изображения AVIF, а dav1d – лучший выбор для декодирования AVIF.
libavif не будет автоматически создавать кодек, и их необходимо включить в CMakeLists.txt
1 2 3 4 5 |
option(AVIF_CODEC_AOM "Use the AOM codec for encoding/decoding (see AVIF_CODEC_AOM_DECODE/AVIF_CODEC_AOM_ENCODE)" OFF) option(AVIF_CODEC_DAV1D "Use the dav1d codec for decoding" ON) option(AVIF_CODEC_LIBGAV1 "Use the libgav1 codec for decoding" OFF) option(AVIF_CODEC_RAV1E "Use the rav1e codec for encoding" ON) option(AVIF_CODEC_SVT "Use the SVT-AV1 codec for encoding" OFF) |
а также определить путь для выбранного кодека.
Библиотека кодирования rav1e AVIF и инструмент cavif-rs
Давайте создадим rav1e в Ubuntu 20.04:
1 2 3 4 |
git clone https://github.com/xiph/rav1e cd rav1e sudo apt install cargo nasm cargo build --release |
Мы сделали это на ноутбуке AMD Ryzen, но rav1e оптимизирован как для Arm, так и для x86:
asm
– по умолчанию включен. Когда этот параметр включен, сборка создается для поддерживающих его платформ.x86_64
: запрашиваетnasm
.aarch64
- запрашивает
gas
- Альтернатива: используйте ассемблер
clang
установивCC=clang
- запрашивает
ПРИМЕЧАНИЕ. SSE2 всегда включен на x86_64, neon всегда включен для aarch64, вы можете установить для переменной среды RAV1E_CPU_TARGET значение rust, чтобы отключить все оптимизированные для сборки процедуры во время выполнения.
rav1e основан на rust, но есть также библиотека C c файлом pkg-config для людей, желающих интегрировать rav1e в свои проекты C. Его можно сгенерировать следующим образом:
1 2 |
cargo install cargo-c cargo cinstall --release |
rav1e предназначен для кодирования необработанных видео, и, кстати, не существует образца для кодирования файла изображения AVIF, поэтому мы можем использовать libavif или cavif-rs для создания файла AVIF из файла PNG или JPG.
Вот как можно создать cavif-rs в Ubuntu 20.04:
1 2 3 |
git clone https://github.com/kornelski/cavif-rs cd cavif-rs cargo install cavif |
Обратите внимание, что он будет компилировать rav1e в процессе, поэтому не нужно заранее создавать rav1e. Теперь мы можем запустить программу, чтобы проверить ее:
1 2 3 4 5 6 7 |
export PATH=$PATH:/home/jaufranc/.cargo/bin time cavif cnxsoft-logo.png cnxsoft-logo.avif: 30KB (29221B color, 0B alpha, 188B HEIF) real 0m4.753s user 0m17.945s sys 0m0.064s |
На преобразование файла PNG в файл AVIF на процессоре AMD Ryzen 7 2700U потребовалось почти пять секунд, но теперь файл стал намного меньше:
1 2 3 |
ls cnxsoft-logo.* -l -rw-rw-r-- 1 jaufranc jaufranc 29409 Feb 23 11:05 cnxsoft-logo.avif -rw-r--r-- 1 jaufranc jaufranc 205216 Feb 23 11:03 cnxsoft-logo.png |
Честно говоря, возможно это не оптимальный файл для формата PNG без потерь. Затем мы смогли открывать файлы в Chrome, и увидеть различия весьма сложно:
Вы также можете проверить исходные файлы PNG и AVIF.
Библиотека декодирования dav1d AVIF и инструмент davif
Большинство встраиваемых систем, вероятно, будут использовать только декодирование/рендеринг AVIF, и для этого мы можем создать библиотеку dav1d C:
1 2 3 4 5 6 |
git clone https://code.videolan.org/videolan/dav1d cd dav1d/ sudo apt install nasm meson ninja-build mkdir build && cd build meson .. ninja |
Как и rav1e, dav1d оптимизирован как для Arm, так и для x86. На момент работы кодек оптимизирован с помощью ассемблерного кода для 64-битных процессоров Arm с инструкциями NEON SIMD и чипов x86 с инструкциями AVX2 и SSSE3 + SIMD. Ведется работа над ARMv7 (32-разрядная версия) и менее распространенной архитектурой без PPC, SSE2 или AVX-512.
Затем вы можете использовать код для интеграции в свою программу, но если нам нужен пример кода, который будет декодировать/преобразовывать файл AVIF с помощью dav1d, инструмент davif может преобразовать файл AVIF в PNG.
Вот как мы его собираем в Ubuntu 20.04:
1 2 3 4 |
git clone --recurse-submodules --recursive https://github.com/link-u/davif cd davif cmake . make |
Преобразование из AVIF в PNG происходит намного быстрее, чем наоборот, точнее, в 10 раз быстрее.
1 2 3 4 5 6 7 8 9 |
time ./davif -i cnxsoft-logo.avif -o cnxsoft-logo.png [2021/02/23 11:51:15 INFO ] davif [2021/02/23 11:51:15 DEBUG] - dav1d ver: 0.8.0-34-g7424f8e [2021/02/23 11:51:15 INFO ] Decoding: cnxsoft-logo.avif -> cnxsoft-logo.png [2021/02/23 11:51:15 INFO ] Decoded: cnxsoft-logo.avif -> cnxsoft-logo.png in 93 [ms] real 0m0.392s user 0m0.431s sys 0m0.012s |
Поскольку все написано на C и ассемблере, может быть проще переносить на встраиваемые системы с ограниченными ресурсами.
Следует отметить, что AVIF – не единственный новый формат изображения, поскольку в стадии разработки так же находится формат JPEG XL, но его интеграция в веб-браузеры может занять немного больше времени. Вы найдете эталонную реализацию JPEG XL на Gitlab. Разница между AVIF и JPEG XL обсуждается на форуме encode.su и в блоге Cloudinary , где упоминается, что AVIF предлагает лучшее сжатие, но декодер JPEG XL и особенно кодировщик должны быть быстрее и поддерживать большие разрешения, тогда как AVIF ограничен до 3840 × 2160 что кажется странным. JPEG XL не требует лицензионных отчислений, и он остается совместимым с JPEG.
Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.