Аппаратное кодирование видео Linux на процессоре Amlogic A311D2


Мы тестировали Khadas VIM4 Amogic A311D2 SBC с Ubuntu 22.04 немного дольше обычного, и хотя производительность в целом хорошая, такие функции, как ускорение 3D-графики и аппаратное декодирование видео, отсутствуют. Но нам бы хотелось увидеть раздел аппаратного кодирования видео Linux в Wiki,  так как это не часто увидишь на ранних этапах. Итак, пробуем…

Во-первых, нам нужно сделать видео в формате пикселей NV12, которое обычно выводится с камер. Мы загрузили 45-секундный образец видео 1080p H.264 с Linaro и преобразовали его с помощью ffmpeg:

Мы сделали это на ноутбуке. Как необработанное видео, оно довольно большое: 3,3 ГБ памяти используется для 45-секундного видео:

Теперь давайте попробуем закодировать видео в H.264 на плате Khadas VIM4, используя пример аппаратного кодирования видео aml_enc_test:

Вывод поясняет используемые параметры. Есть несколько сообщений об ошибках, но видео можно без проблем воспроизвести с помощью ffplay на компьютере.

Мы также можем видеть, что кодирование произошло за 26 секунд, что быстрее, чем в реальном времени, поскольку видео длится 45 секунд.

Попробуем то же самое с кодировкой H.265:

Это удивительно, но кодирование видео H.265 намного быстрее, чем кодирование видео H.264. Давайте снова попробуем кодировку H.264:

Теперь это занимает менее 9 секунд. В первый раз он считывает данные с флэш-памяти eMMC медленно, но, поскольку файл имеет размер 3,3 ГБ, он может поместиться в кеш, поэтому во второй раз узкого места в хранилище нет.

Тем не менее, файл dump.h265 также мог нормально воспроизводиться на компьютере, поэтому преобразование прошло успешно.

Спецификации Amlogic A311D2 говорят, что поддерживается кодирование видео «H.265 и H.264 при 4Kp50». Итак, давайте создадим 45-секундное видео 4Kp50 и конвертируем его в формат NV12 YUV. К сожалению, размер необработанного видео составляет 27 ГБ, и оно не поместится во флэш-память eMMC платы… Давайте сократим это до 30 секунд (около 18 ГБ)…

Теперь мы можем закодировать видео в H.264:

Две минуты, чтобы закодировать 30-секундное видео! Но, увы, это не работает, поэтому давайте снова запустим пример:

Это еще медленнее… Мы думаем, что хранилище является узким местом здесь, потому что требуемая скорость чтения для этого файла будет более 600 МБ/с для кодирования в реальном времени. Обычно система кодирует видео из потока камеры, а не из флэш-памяти eMMC. Мы должны были сначала запустить iozone:

Скорость последовательного чтения составляет около 178 МБ/с. У нас есть USB-концентратор MINIX с твердотельным накопителем на 480 ГБ, который мы тестировали со скоростью 400 МБ/с. Не совсем то, что нам нужно, но это должно привести к улучшениям.

К сожалению, диск не был смонтирован и даже не распознан даже такими инструментами, как fdisk и GParted. При перепроверке спецификаций Khadas VIM4 мы поняли, что порт USB Type-C — это интерфейс USB 2.0 OTG, который должен распознавать накопитель, но поддерживать только 480 Мбит/с, так что в любом случае это безнадежное дело… Единственный способ достичь более 600 МБ/с было бы использовать USB 3.0 NVMe SSD, но у нас его нет.

Вместо этого мы сделаем 5-секундное видео 4Kp50 размером около 2,9 ГБ.

Первый запуск с использованием H.265:

Второй запуск:

Последняя попытка с H.264:

Не совсем в реальном времени, но приближается, а это значит, что 4Kp30 должно быть возможно. Вот результат с 5-секундным видео 4Kp30 NV12, закодированным с помощью H.264:

Меньше четырех секунд. Таким образом, аппаратное кодирование видео 4Kp30 H.264 в реальном времени определенно работает на процессоре Amlogic A311D2.

На нашем компьютере играет нормально.

Также возможно кодировать изображения NV12 YUV в JPEG, но это не будет работать с пользователем khadas:

Но нет проблем с sudo:

Вероятно, просто проблема с разрешением, задача была выполнена за 44 мс, и мы без проблем смогли открыть dump.jpg (скриншот).

Если используем ffmpeg для преобразования файла NV12 в jpeg, предположительно с программным кодированием, это занимает чуть менее 200 мс:

aml_enc_test и jpeg_enc_test — небольшие утилиты для тестирования аппаратного кодирования видео/изображений в Linux на Amlogic A311D2, но исходный код был бы хорош для интеграции этого в приложение. Но в настоящее время он не является общедоступным, поэтому мы предполагаем, что он является частью Amlogic SDK. Мы попросим у компании Khadas исходный код или способ его получения.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

5 1 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments