COMPATIBILITY IN ANDROID SYSTEMS AND AV1 PC
Supported operating systems
For now, the AV1 codec is implementing in different environments and operating systems, where we have more compatibility at the software level is in Windows and Linux, followed by Android, other environments such as Apple still have to offer an implementation plan.
- Windows 10 and Linux will find it encapsulated in MP4, MKV and webm formats.
- Android is already supported from Android 10 although the encapsulation format is not defined.
- Apple as they are macOS and iOS we do not have support information yet.
Differences between AV1 formats
Within the specifications of AV1 we have different profiles and levels, the levels indicate us up to what maximum resolution/fps we can reach at that level and the profiles indicate which environments the compression is intended for. The Main profile will be used in most contents, the High profile for 4:4:4 compatible environments and with HDR needs, the Professional profile covers all possible work environments. Check our Guide for tuning the Image Quality to learn more about it.
4.1. Подключение внешней функции
Рассмотрим следующий вариант организации кодека: кодек, зарегистрированный в FFmpeg, играет роль каркаса, а реальную процедуру кодирования/декодирования делегирует внешним функциям (своего рода plugin’ам), реализованным вне FFmpeg.
Такого решение может быть желательно по многим причинам. Вот некоторые из них:
- Кодек носит экспериментальный характер и часто меняется, а компиляция FFmpeg является довольно трудоемким процессом;
- Кодек написан не на C, а на другом языке, например на C++;
- Кодек использует библиотеки или framework, которые трудно интегрировать в FFmpeg.
Не смотря на закрытую, монолитную архитектуру FFmpeg такой вариант возможен и является вполне «законным», то есть для его реализации требуется только стандартный FFmpeg API. И ключом для решения этой задачи является механизм опций с помощью которого «внутрь» FFmpeg можно передать указатель на внешнюю функцию (или указатель структуру, содержащую указатели на внешние функции), которая и реализует требуемый функционал. Наиболее естественный вариант — это использование опций бинарного типа. В нашем примере для декодера можно предложить примерно следующее.
На стороне клиента FFmpeg API (в данном примере написан на C++) можно предложить примерно следующее.
Готовим AV1 правильно
Чтобы видео работало во всех браузерах, мы будем генерировать 3 файла:
- Для остальных: большой MP4-файл с H.264 и AAC.
Можете взять только AV1 и H.264 — видео будет тоже работать у всех.
Для Mac OS X:
Для Линукса лучше взять свежую сборку с официального сайта — пока во многих дистрибутивах нет версии с поддержкой AV1 в MP4:
Переходим к конвертации файла H.264, который нужен нам для старых браузеров. Поскольку все наши файлы используют контейнер MP4, я буду использовать , и постфиксы. Не пугайтесь длинной команды, мы потом её всю разберём:
Теперь откройте . Если качество хорошее, а размер большой — попробуйте увеличить ( потом ). Эта опция уменьшит размер файла ценой уменьшения качества. Подбор баланса качества и размера — искусство.
Теперь пришло время для конвертации AV1 — напоминаю, будет дольше H.264. Кодек пока не использует всю мощь процессора (имеет смысл запустить конвертацию нескольких файлов параллельно).
Снова поиграйте с для подбора идеального баланса качества и размера.
Теперь то же самое для HEVC.
Скопируйте , и в корень вашего сайта.
Разбираемся с опциями FFmpeg
указывает входящий файл, откуда FFmpeg возьмёт потоки видео и аудио, пережмёт их и запакует в новый контейнер.
удалит мета-информацию из видео (например, программу, в которой видео было создано). В Вебе такая информация редко бывает полезной.
или выставляют аудио-кодеки. Если вам не нужен звук, замените их на .
выбирает видео-кодек — библиотеку, которая сожмёт кадры видео-потока.
— Constant Rate Factor, баланс качества и размера. Это как слайдер качества JPEG, только он идёт в другом направлении (0 — лучшее качество и самый большой файл). Шкала CRF разная у H.264 и AV1 — у H.264 идёт до 51, у AV1 до 61. CRF для AV1 и H.264 будет разный.
выставляет минимальный битрейт для AV1, чтобы в видео было постоянное качество.
изменит размер сторон видео к ближайшим чётным (некоторые кодеки могут работать с разрешением 300×200 и 302×200, но не будут работать с 301×200). Если вы уверены, что везде разрешение делится на 2 — можете убрать эту опцию.
нужна для AV1, его кодер ещё экспериментальный.
выставляет имя итогово файла.
Запускаем видео в браузерах
<source> похожи на выражения — браузер читает их сверху вниз, пока не найдёт тот, чей он поддерживает.
В можно указать весь формат файла: контейнер ( для MP4), видео-кодек ( для AV1, для HEVC и для H.264) и аудио-кодек ( для Opus и для AAC).
3.1. Контекст кодека
Контекст кодека может поддерживать установку опций. Для кодеров эта поддержка используется достаточно часто, для декодеров реже. Структура, поддерживающая установку опций, должна в качестве первого члена иметь указатель на структуру и далее сами опции.
Далее надо определить массив типа , каждый элемент которого и описывает конкретную опцию.
Для каждой опции необходимо определить имя, описание, смещение в структуре, тип. Можно также определить значение по умолчанию и для целочисленных опций диапазон допустимых значений.
Далее надо определить экземпляр типа .
Указатель на этот экземпляр надо использовать для инициализации соответствующего члена .
Теперь при выполнении функции
будет создан экземпляр структуры и инициализирован член . Далее на основе значения будет выделена необходимая память для экземпляра , используя значение первый член этого экземпляра будет инициализирован и после этого будет вызвана функция , которая установит значений по умолчанию для опций. Указатель на экземпляр будет доступен через член структуры .
При работе с FFmpeg API значения для опций можно установить непосредственно.
Другой способ — это использование словаря опций, который будет передаваться третьим аргументом при вызове (см. ниже).
С помощью функции
можно получить список всех опций, поддерживаемых контекстом кодека. Это бывает полезно при исследовании кодека. Но перед этим надо обязательно проверить, что установлен в ненулевое значение, в противном случае контекст не поддерживает опций и при любой операции с опциями произойдет аварийное завершение программы.
1.1. Идентификатор кодека
В файле определено перечисление . Каждый элемент этого перечисления как раз и идентифицирует формат сжатия. Элементы этого перечисления должны иметь вид , где уникальное имя идентификатора кодека в верхнем регистре. Вот примеры идентификаторов кодека: , . Для более подробного описания идентификатора кодека служит структура (объявлена в , приводится в сокращенном виде):
Ключевым членом этой структуры является , остальные члены как раз и дают дополнительную информацию об идентификаторе кодека. Каждый идентификатор кодека однозначно связан с типом медиаданных (член ) и имеет уникальное имя (член ), записанное в нижнем регистре. В файле определен массив типа . Для каждого идентификатора кодека имеется соответствующий элемент массива. Элементы этого массива должны быть упорядочены по значениям , так как для поиска элементов используется двоичный поиск. Для получения информации об идентификаторе кодека можно использовать функции:
Что такое AVIF
AVIF (AV1 Still Image File Format) стал использоваться зимой 2019 года одновременно с открытым видеокодеком AOMedia Video 1 (AV1), предназначенным для потокового интернет-видео. Собственно, AVIF использует сжатие на основе библиотеки этого кодека. Он хранит данные файлов в формате HEIF и сжимает последовательности изображений с помощью AV1.
.AVIF поддерживает:
- HDR (высокий динамический диапазон);
- формат без потерь (но лучше работает сжатие с потерями);
- разные цветовые пространства;
- зернистость;
- цветовую субдискретизацию (технология кодирования изображения, при которой изменения оттенка цвета менее важны, чем изменения яркости).
Одной из первых компаний, использующих AVIF, стала Netflix. После нее этот формат стали поддерживать браузеры Chrome и Firefox, а также разработки таких компаний, как VLC и Microsoft.
4.2. Внешний декодер
Она из важных идей компьютерного мультимедиа — это отделение кодека от медиаконтейнера. В идеале медиаконтейнер любого типа может хранить медиапотоки, закодированные любым кодеком. Конечно, в реальности это не всегда выполняется. Мы видели, что для того, чтобы FFmpeg мог записать в контейнер медиапоток, мультиплексор должен «знать» кодек, так как необходимо записать идентифицирующую информацию о кодеке. А вот при чтении это уже не совсем так. Демультиплексор без проблем извлекает пакеты, закодированные неизвестным кодеком. Если клиент FFmpeg API может как-то идентифицировать этот кодек и умеет декодировать медиаданные, закодированные этим кодеком, то становится возможным воспроизведение таких медиаданных. У автора имеется подобный опыт. В свое время пришлось работать с одним видеорегистратором, который использовал аппаратное сжатие в некотором проприетарном формате. Сжатые данные переносились на PC (Windows) и затем записывались с помощью DirectShow в AVI файл. На PC имелся программный декодер для этого формата и на его основе был написан фильтр-декодер в стандарте DirectShow. Формат идентифицировался с помощью 32-битного FourCC. (Записывался в член структуры .) Таким образом, эти файлы воспроизводились на любом DirectShow проигрывателе при условии, что на PC был инсталлирован этот фильтр-декодер. При попытке воспроизвести такой файл с помощью FFmpeg проигрывателя декодер, естественно, не был найден, но член структуры содержал вышеупомянутый FourCC, что решало проблему идентификации кодека. На основе имеющегося декодера для клиента FFmpeg API был написан дополнительный декодер, которому и передавался пакет. Таким образом проблема воспроизведения таких файлов была решена с помощью стандартной сборки FFmpeg и использования FFmpeg API.
В ряде случаев неизвестный кодек можно идентифицировать по метаданным потока, например в файлах FFmpeg записывает туда имя кодека (свойство ).
Заключение
В данной статье рассматривались только изменения в коде, не рассмотрены изменения, которые необходимо внести в другие части FFmpeg: документации, changelog, систему контроля версий и т.д. Но если вы планируете «домашнюю» сборку FFmpeg, предназначенную только для конкретного проекта, то этого можно не делать.
Ресурсы
Общие вопросы архитектуры FFmpeg
Компиляция
Программирование с использованием FFmpeg API
Видеоплеер на базе ffmpeg
Добавление кодеков
Альтернативы
С большой долей вероятности в ближайшие годы HEVC и AV1 будут занимать доминантные позиции. Остальным кодекам, чтобы претендовать на место под солнцем, нужно будет предложить существенное улучшение скорости кодирования/декодирования в сочетании с конкурентным уровнем компрессии, хотя бы в определенной нише. А если разработчики захотят использовать запатентованные технологии, то чтобы предложить реалистичные цены, им понадобятся еще и хорошие маркетологи.
Сегодня к возможным альтернативам относят две разработки. Во-первых, кодек XVC (Extreme video codec), оптимизированный для работы на низких скоростях, характерных для доступа через сотовые сети. Это разработка шведской компании Divideon, появившейся в начале 2017 года. На сайте Divideon уже выложены демонстрационные ролики и графики, иллюстрирующие преимущество нового кодека относительно прочих в нише мобильного приема (рис. 4). Кодек платный, но система его лицензирования проще, чем у HEVC.
Сравнения PSNR
Второй претендент — это JEM (Joint Exploration Model), кодек, разрабатываемый на смену HEVC.
Для его разработки в конце 2015 года была создана команда JVET (Joint Video Exploration Team), объединившая MPEG и VCEG. Полтора года ушло на сборы требований к кодеку, и в апреле 2018 года началась собственно разработка. По этому случаю команда была переименована в Joint Video Experts Team. Судя по информации о ходе работы над кодеком, которую участники JVET озвучивают на отраслевых мероприятиях, никаких принципиально новых подходов к компрессии вводить не планируется. Предполагается дальше усложнять и оптимизировать алгоритмы обработки, то есть эксплуатировать постоянно растущие процессорные мощности. Хотя все еще может поменяться, да и сам кодек, разрабатываемый «по старинке», на базе закрытых лицензионных технологий, может оказаться неконкурентным в новых рыночных условиях.
3.2. Функции
Рассмотрим теперь подробнее, как устроены функции, используемые при инициализации кодека и фактического кодирования/декодирования. В них обычно всегда требуется получить указатель на .
Функции и будут вызваны при выполнении функции
В них надо выделить необходимые ресурсы для работы кодека, и при необходимости инициализировать некоторые члены структуры , например для аудиокодера.
Функции и будут вызваны при выполнении
В них надо освободить выделенные ресурсы.
Рассмотрим функцию для реализации декодирования
Она должна реализовать следующие операции:
- Фактическое декодирование;
- Выделение необходимого буфера для выходного кадра;
- Копирование декодированных данных в буфер кадра.
Рассмотрим, как надо выделять необходимый буфер для выходного кадра. Параметр на самом деле указывает на , поэтому сначала надо выполнить преобразование типа:
Далее надо выделить буфер для хранения данных кадра. Для этого надо инициализировать члены , определяющие размер буфера кадра. Для аудио это , , (для видео , , ).
После этого надо вызвать функцию
В качестве первого аргумента используется указатель на кадр, являющийся преобразованным параметром , в качестве второго рекомендуется передавать ноль. После использования кадра (это происходит уже вне кодека), буфер, выделенный этой функцией, освобождается функцией
Функция должна возвращать количество байт, использованных для декодирования, из пакета, на который указывает . Если формирование кадра завершено, то переменной, на которую указывает присваивается ненулевое значение, иначе эта переменная получает значение .
Рассмотрим функцию для реализации кодирования
Она должна реализовать следующие операции:
- Фактическое кодирование;
- Выделение необходимого буфера для выходного пакета;
- Копирование закодированных данных в буфер пакета.
Для выделения необходимого буфер используется функция
В качестве первого аргумента используется параметр , в качестве второго размер закодированных данных. После использования пакета (это происходит уже вне кодека), буфер, выделенные этой функцией, освобождаются функцией
Если формирование пакета завершено, то переменной, на которую указывает присваивается ненулевое значение, иначе эта переменная получает значение . В случае отсутствия ошибки, функция возвращает ноль, иначе код ошибки.
При реализации кодека обычно используется логгирование (для ошибок это можно считать обязательным требованием). Вот пример:
В этом случае при выводе в лог в качестве имени контекста будет использовано имя кодека.
HOW TO PLAY AV1 CONTENTS
Android Playback
For the Android system for now we do not have acceleration in decoding at the hardware level, to reproduce these formats there are not many options today. When the SoC manufacturers make the leap we will undoubtedly have alternatives, they will offer us in the native support players.
- Android 10 is required at least to be able to playback the AV1 format.
- Players: VLC and KODI in future versions will support it, versions with ffmpeg support are already being compiled.
- Browsers: Chrome and Mozilla already announced support.
- Apps: Netflix already use in its Android AV1 app in SD quality. Youtube has videos available on AV1.
Windows or Linux playback
From Windows or Linux it is possible to play content in AV1 but the performance without even having hardware acceleration for decoding is quite limited. As we can see our APU AMD Ryzen 5 3400G the CPU reproducing reaches peaks of 64% use when playing samples in 4K, we reach 34% use in 1080p content, today it is inefficient.
The most popular players for these systems are adapting to the new codec quite quickly.
- VLC in its latest version by activating> Settings> All> Input Codecs> Prefered codec list> write “aom”
- MPC-HC we need version 1.8.3 or higher, in addition to installing the latest LAV.
- KODI filters in its version 18.5 are not yet supported but is being compiled to support the latest ffmpeg with AV1 support.
Install AV1 codec for Windows Player
We can install a codec in Windows to support the AV1 format in the “Movies and TV” default player for free, we just have to install the codec and without having to create an account in the microsoft store.
Download for free AV1 Video Extension (BETA)
Constant Quality
libaom-av1 has a constant quality (CQ) mode (like CRF in x264 and x265) which will ensure that every frame gets the number of bits it deserves to achieve a certain (perceptual) quality level, rather than encoding each frame to meet a bit rate target. This results in better overall quality. If you do not need to achieve a fixed target file size, this should be your method of choice.
To trigger this mode, you must use a combination of -crf and -b:v 0. -b:v MUST be 0.
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 av1_test.mkv
The CRF value can be from 0–63. Lower values mean better quality and greater file size. 0 means lossless.
AV1 не готов для масс (пока)
Без роялти и на 30% лучше. Где я могу зарегистрироваться? Но есть проблема, на самом деле огромная проблема. Кодирование файлов AV1 идет медленно. Мой оригинальный 4K клип с моего смартфона длится 15 секунд. Для кодирования этого с использованием только программного обеспечения в H.264 на моем ПК требуется около 1 минуты, что в четыре раза больше длины клипа. Если я использую аппаратное ускорение, доступное на моей видеокарте NVIDIA, тогда это займет 20 секунд. Просто немного дольше, чем оригинальный клип.
Для H.265 все немного медленнее. Только программное кодирование занимает около 5 минут, что немного дольше, чем оригинал. К счастью, аппаратное кодирование в H.265 также занимает всего 20 секунд. Поэтому аппаратное кодирование H.264 и H.265 похоже на мою настройку.
До того как все фанаты видео начали кричать, да, я знаю, что есть миллиард различных настроек, которые могут изменить время кодирования. Я приложил все усилия, чтобы удостовериться, что я кодирую как для подобного.
Мое оборудование не поддерживает кодирование AV1, поэтому мой единственный вариант – программный. Тот же 15-секундный клип, который занял 5 минут для программного обеспечения H.265, занимает 10 минут для Av1. Но это было не так, как было, это было изменено, чтобы получить лучшую производительность. Я протестировал несколько разных вариантов настроек качества и пресетов, 10 минут было лучшим временем. Один вариант, который я пробежал, занял 44 минуты. 44 минуты на 15 секунд видео. Это использует кодировщик SVT-AV1, которым увлекается Netflix. Существуют альтернативы, но они намного медленнее, например часы и часы, гораздо медленнее.
Кодирование клипа 4K 15 сек. | SW или HW | Время |
---|---|---|
H.264 | Программное обеспечение | 1 мин |
H.264 | аппаратные средства | 20 сек |
H.265 | Программное обеспечение | 5 минут |
H.265 | аппаратные средства | 20 сек |
AV1 | Программное обеспечение | 10 минут |
Это означает, что если у меня есть 1-часовой фильм, который я отредактировал со своего отпуска в экзотическое место, то для преобразования его в H.265 с использованием аппаратного ускорения на моем компьютере потребуется 80 минут. Один и тот же файл с использованием современных программных кодеров AV1 займет 40 часов!
Вот почему он не готов для масс (пока). Улучшения придут к кодировщикам. Программное обеспечение станет лучше, и аппаратная поддержка начнет появляться. Декодеры уже становятся экономными и эффективными, поэтому Netflix может начать потоковую передачу некоторого контента в AV1 на устройства Android. Но с точки зрения повсеместной замены H.264 нет, пока нет.
Одна интересная вещь в заявлениях Google относительно AV1 для Duo заключается в том, что она подразумевает кодирование AV1 на клиентских устройствах и декодирование AV1. Я написал по электронной почте Google об этом, и были обнадеживающие признаки того, что он собирался рассказать мне некоторые детали, но его планы относительно кодека AV1 и Duo, но затем все в списке рассылки загадочным образом затихли. Если кто-нибудь из Google вернется ко мне, я дам вам знать!
Источник записи: https://www.androidauthority.com
Как проверить правильную работу Auto Frame Rate
Во-первых, фишку должен поддерживать телевизор или подключенный TV-бокс. В случае с приставкой телевизор должен уметь менять частоту вывода и разрешение по HDMI. Так умеет большинство современных ТВ-панелей, но проверить спецификацию все-таки стоит.
Во-вторых, телевизор должен поддерживать все распространённые частоты FPS. Чаще всего для комфортного воспроизведения фильмов требуется поддержка 24 кадров в секунду.
В-третьих, работе Auto Frame Rate не должны мешать встроенные системы повышения чёткости изображения.
Возможны ситуации, когда заявленная поддержка AFR со стороны производителя ТВ просто не работает из-за конфликта с другими фишками либо когда опция поддерживается на приставке, но неверно воспринимается телевизором и не даёт нужного эффекта.
Если все указанные выше условия соблюдены, можно проверить правильность работы AFR в вашем конкретном случае.
1. Настройте правильное разрешение. Перейдите в параметры телевизора или используемой приставки и установите правильное разрешение для используемой матрицы. Если телевизор поддерживает разрешение 4K – устанавливайте его, не нужно ставить 1080p по умолчанию на такой панели. И наоборот – не завышайте разрешение воспроизводящего устройства, если его не поддерживает матрица.
Не всегда AFR поддерживает смену разрешения и неверно установленный параметр не позволить получить максимальное качество картинки.
2. Верно выберите подходящую частоту. Здесь все зависит от наиболее предпочитаемого вида контента. Например, при регулярном просмотре IPTV следует установить частоту кадров на значение 50. В этом случае AFR не будет менять параметры экрана в большинстве сценариев использования.
Можете воспользоваться параметрами контента, которые указаны в первом разделе статьи или узнать рекомендуемую частоту кадров у поставщика своего контента.
3. Включите фишку Auto Frame Rate. Она может иметь различные названия в зависимости от используемой операционной системы или оболочки. Например, на многих распространённых моделях TV-боксов с Android TV фишка называется HDMI self-adaption и находится в разделе Playback Settings.
4. Установите подходящий режим работы фишки (если в настройках предусмотрена такая опция). Обычно производители предлагают два режима: частичный (part mode) с переключениям режима только при указанных частотах контента или полный (total mode) с переключением на любую частоту воспроизводимого контента.
5. Скачайте тестовый ролик на приставку. И включите его воспроизведение на устройстве.
https://youtube.com/watch?v=GdG1hqZQGlU
Видео будет выглядеть как на примере выше.
6. Используйте любое стороннее приложение-камеру для iOS или цифровую камеру в ручном режиме.
7. Установите выдержку на отметку 1 секунда и сделайте фото телевизора.
Если Auto Frame Rate включён и работает правильно, увидите на снимке равномерно окрашенную серую доску. Это значит, что панель за секунду отображает кадры с подсветкой каждого из квадратов.
Если Auto Frame Rate не включился или конфликтует с какой-то другой фишкой телевизора, то вы увидите изображение-шахматку. Оно свидетельствует о том, что за секунду панель не успевает отобразить все нужные кадры. Так можно самостоятельно убедиться в работе фишки на ваших устройствах.
Теперь вы знаете, за какой фишкой гнаться при выборе современного телевизора в 2021 году.
iPhones.ru
Включаем, настраиваем, проверяем.
Как внедрить AVIF на ваш сайт?
Внедрять AVIF на сервер желательно прогрессивным методом. Т.е. если браузер поддерживает AVIF, то будет показываться AVIF. Если этот формат не поддерживается, то подключается WebP. Если не поддерживается ни то, ни другое, выводится «стандартный» JPG.
Это делается с помощью имплементации автоматической пакетной обработки на сервере. Как это можно сделать на веб-сервере Nginx, вы можете узнать в инструкции по данной ссылке.
Для такой задачи вам понадобится технический специалист.
Пример внедрения в HTML с помощью тега picture:
<picture> <source srcset="img/photo.avif" type="image/avif"> <source srcset="img/photo.webp" type="image/webp"> <img src="img/photo.jpg" alt="Описание фотографии"> </picture>
Такой код гарантирует, что браузер будет загружать первый формат, который поддерживает. Если тег picture не поддерживается, то по умолчанию указан img.
Можно воспользоваться конвертером изображений
Есть нет возможности со стороны сервера имплементировать сборку, а на сайте еще мало контента, можно пользоваться конвертером. Например, Squoosh от Google.
Если вы уже использовали этот сервис ранее, но у вас не появился выбор AVIF, нужно с помощью ctrl+f5 обновить страницу и сбросить кэш.
Одной интересной особенностью сервиса (кроме того, что он бесплатный) является наблюдение за процессом изменения картинки.