Как я могу выполнить аппаратное ускорение кодирования и декодирования H.264 для потоковой передачи?

Я могу получить данные кадра RGBA с камеры, и я хочу закодировать его в формате H.264. Я использовал FFmpeg для кодирования и декодирования видео H.264, но при размере кадра 640x480 он слишком медленный для моих нужд.

Я бы хотел использовать аппаратное ускорение для ускорения кодирования и декодирования, так как я могу это сделать?

Кроме того, мне нужно иметь возможность передавать закодированное видео по сети и декодировать его на другом конце. Как это можно сделать?

Ответы

Ответ 1

Если вы хотите сделать аппаратное ускорение видеокодирования и декодирования видео H.264 на iOS, единственный способ - AVFoundation. Не используйте сторонние библиотеки для кодирования или декодирования, потому что все они в настоящее время связаны с ЦП и намного медленнее, чем вы получаете от AVFoundation. Одной из причин использования стороннего кодировщика или декодера было бы, если вы по умолчанию работаете с форматом, который не поддерживается в iOS.

Для аппаратно-ускоренного декодирования вы захотите использовать экземпляр AVAssetReader (или один из классов проигрывателя для чистого воспроизведения). С AVAssetReader я регулярно получаю скорость воспроизведения 2X или выше для чтения видео с кодировкой H.264, поэтому устройства iOS используют для этого довольно хорошее аппаратное ускорение.

Аналогично, для ускоренного кодирования вы будете использовать AVAssetWriter. Есть несколько трюков, чтобы заставить AVAssetWriter кодироваться с максимальной скоростью (подача в кадрах BGRA с использованием пула пиксельных буферов с использованием кешей текстур iOS 5.0 при чтении из OpenGL ES), которые я подробно описываю в этот ответ.

Если вы хотите увидеть какой-то код, который использует самые быстрые пути, которые я нашел для ускоренного кодирования и декодирования, вы можете посмотреть на мой открытый источник GPUImage, который, в отличие от одного, связанного с Anastasia, полностью свободен в использовании.