Ускорение транскодирования ffmpeg с OpenCL

Как известно, декодирование и кодирование видео можно разгрузить с помощью видеокарт. У Intel, AMD и NVidia есть свои технологии для этого.

Внутри ffmpeg долгое время небыло возможности применять любые из указанных технологий. Но время шло, и постепенно появились все из них, правда каждая с собственными ограничениями. Ситуация усложняется тем, что мне интересно транскодирование, т.е. декодировать и закодировать на процессоре и была информация, что на Intel QSV с помощью ffmpeg такую процедуру не выполнить из-за особенностей реализации ускорения аппаратного декодирования.

Из простых способов остался OpenCL, который поддерживается бинарной сборкой ffmpeg 2.8.4 под Windows. Сравнивал результат я с другой бинарной сборкой, использующей толко ЦПУ и с сервером (без железной видеокарты).

ПК 1: на Intel Core2Duo Q6600 (4 ядра 2,6 ГГц) + AMD 7750.

ПК2: Xeon X5670 8vCPU, 2.93 ГГц

Два исходных файла: mpeg4 profile 2 в SD и mpeg4 AVC в FullHD.

Транскодирование производилось с битрейтом в 4 Мбит/c.

Результаты[править]

При транскодировании на CPU ffmpeg кодирует поток в mpeg4 part 10, а при использовании OpenCL в mpeg4 part2 (т.е. более простым кодеком). Но фактор квантизации при использовании OpenCL колебался около 2, а без GPU в пределах 20-30. (чем меньше, тем лучше т.к. этот фактор определяет качество сжатия с потерями, чем он больше, тем больше информации потеряно). В дальнейшем измерялось PSNR (показывает количество шумов) и результат значительных отклонений не дал. Визуально качество видео тоже было очень близко.

Скорость транскодирования на ПК1 при использовании OpenCL примерно в три раза больше скорости транскодирования на CPU.

Скорость транскодирования на ПК1 при использовании OpenCL сравнива со скоростью транскодирования на ПК2 на CPU для FullHD, но для видео в SD транскодирование с использованием OpenCL дает прирост в 2 раза по сравнению с ПК2.

При транскодировании с использованием OpenCL процессоры были равномерно загружены примерно на 70%. При транскодировании на CPU процессоры загружены на 100%. Т.е. даже при использовании OpenCL, центральный процессор все равно эффективно используется.

Выводы[править]

Eсли видеокарта слабая и ПК не слишком мощный (мало ядер), то лучше предпочесть транскодирование с использованием OpenCL.

Если ПК мощный (много ядер), то разницы на слабой видеокарте можно и не увидеть.

За неимением мощной видеокарты, остается открытым вопрос: лучше купить много ЦПУ или мощную видеокарту и средний ЦПУ. Т.е. однозначно утверждать, что для сервера транскодирования лучше использовать транскодирование с помощью видеокарты я не берусь.