Кодирование видео с использованием встроенного видео Intel® HD Graphics

В этой статье речь пойдет о кодировании видео с использованием видеокодека h264 на GPU, интегрированном в современные процессоры Intel и о том опыте, который приобрела наша компания Inventos в процессе создания и оптимизации медиа сервера Streambuilder для обработки потокового видео.

 

Введение

Задача, поставленная перед нами заключалось в том, что бы в наш медиа сервер Streambuilder добавить поддержку технологии Intel Quick Sync. Наш медиасервер представляет собой эдакий «комбайн» на все случаи жизни и умеет следующее:

  • Кодирование/ресемплинг аудио/видео из почти всех популярных потоковых форматов в HLS и RTMP;

  • Поддержка съема сигнала с SDI, DVB;

  • Резервирование и масштабирование серверов кодирования;

  • Описание конфигурации кодировщика на встроенном языке;

  • Различные модули для нормализации звука, усиления, деинтерлейсинга видео и т.д

 

Несмотря на то, что код библиотек libavcodec хорошо оптимизирован, он рассчитан на работу на CPU, содержащим конечное число исполнительных устройств, таком, как x86 based. Увеличение количества ядер только отчасти решает проблему, так как обходится это недешево, да и ядра всегда есть чем загрузить, помимо кодирования видео. И логичным шагом была попытка использовать возможности графических ускорителей для решения данной задачи.

 

Решение от Intel

Мы решили переписать значительную часть кода ядра StreamBuilder для значительного увеличения производительности, используя Intel Media Server SDK. Нашей целью было обеспечить кодирование хотя бы 4 Full HD потоков на оборудовании бюджетного класса. 

 

Intel любезно предоставляет свой Media SDK для кодирования, декодирования, ресемплинга и других алгоритмов видео обработки. Данный SDK, к нашей большой радости, теперь доступен и для Linux, что крайне важно для промышленного использования. Именно благодаря появлению поддержки Linux мы заинтересовались этим решением. Коллег из Intel тоже заинтересовали результаты практического использования данного SDK в условиях промышленного использования. При этом, должен отметить, на протяжении всего периода разработки сотрудники Intel нам очень сильно помогали, отвечали на вопросы (которых было много поначалу) и давали действительно ценные советы.

 

В комплекте вместе с Media SDK идет хорошая документация и примеры почти на все случаи жизни. Процесс интеграции Intel Media SDK сильно упростило наличие примеров, без них он, надо сказать, покажется не самым тривиальным. Суть интеграции заключалась в замены наиболее требовательных к аппаратной части софтверных модулей кодирования/декодирования/ресемплинга на соответствующие модули, использующие аппаратные возможности Intel HD Graphics

 

Тестирование

Для тестирования нашего ПО был выбран 1U сервер в следующей конфигурации:


 

M/B

Supermicro X10SLH-F

Процессор

#1 Intel® Xeon® CPU E3-1225 v3, Intel® HD Graphics 3000

#2 Intel® Xeon® CPU I7-3770, Intel® HD Graphics 4000

#3 Intel® Xeon® CPU E3-1285 v3, Intel® HD Graphics P4700

Память

16 Гб

OSUbuntu 12.04.4 LTS 3.8.0-23-generic

 

Главным условием работы Quick Sync является наличие строки С226 в спецификации чипсета. Только чипы с такой маркировкой умеют работать с аппаратным кодированием видео. Кроме этого, желательно отсутствие встроенного видео на материнской плате, в противном случае могут возникнуть проблемы с определением, а значит, и использованием Intel GPU средствами Intel Media SDK.

 

Материнская плата, описанная выше, имеет интегрированную графику (встроенное видео) на борту, и нам пришлось повозиться для того, что бы заставить работать SDK на этом железе. При установке SDK на новый сервер скрипт установки Media SDK не увидел ID устройства. При этом, нам не удалось включить встроенную в процессор графику из BIOS. Поиск решения привел к необходимости обновить BIOS. После этого в BIOS появился заветный пункт. Однако, пришлось еще отключить встроенное на материнской плате видео путем переключения перемычки. В такой конфигурации не работает IPMI и выход на монитор, но мы работаем с сервером через SSH и это не так критично.

 

Кроме этого, есть некоторые ограничения на используемое в системе ядро Linux. Для серверов это Ubuntu 12.04 LTS с ядрами 3.2.0-41 и 3.8.0-23 или SUSE Linux Enterprise Server 11 с ядром SP3 3.0.76-11.

 

Процессор: E3-1225 V3, 16 Гб ОЗУ, Intel® HD Graphics P4600

 

ffmpeg

sample_full_transcode

streambuilder (no optimization)

streambuilder (optimization)

time

8 мин. 42 с

1 мин. 19 с

2 мин.19 с

1 мин. 40 с

cpu (max)

750%

55%

125%

50%

mem (max)

3,3%

4,6%

0.5%

0.4%

PSNR

48,107

46,68

  

Average PSNR

51,204

49,52

  

SSIM

0,99934

0,9956

  

MSE

1,623

2,969

  

 

Процессор: I7-3770, 3 Гб ОЗУ, Intel® HD Graphics 4000

 

ffmpeg

sample_full_transcode

streambuilder (no optimization)

streambuilder (optimization)

time

8 мин. 48 с

1 мин. 24 с

2 мин. 31 с

1 мин. 23 с

cpu (max)

750%

19%

150%

45%

mem (max)

18%

20%

2.8%

2.3%

PSNR

48,107

46,495

  

Average PSNR

51,204

49,27

  

SSIM

0,99934

0,991

  

MSE

1,623

3,036

  

 

Процессор E3-1285 v3, 16 Гб, Intel® HD Graphics P4700

 

ffmpeg

sample_full_transcode

streambuilder (no optimization)

streambuilder (optimization)

time

8 мин. 1 с

1 мин. 11 с

2 мин. 11 с

1 мин. 34 с

cpu (max)

750%

55%

130%

55%

mem (max)

3,3%

4,6%

0.5%

0,4%

PSNR

48,107

46,68

  

Average PSNR

51,204

49,52

  

SSIM

0,99934

0,9956

  

MSE

1,623

2,969

  

 

Анализ результатов

Метрики для streambuilder соответствуют полученным метрикам для тестовой утилиты sample_full_transcode и я их опустил.

Из этих таблиц видно, что серверные процессоры с Intel® HD Graphics P4700/P4600 в данном эксперименте работают быстрее и дают лучшее качество кодирования, чем I7-3770, Intel® HD Graphics 4000. Однако этот тезис не всегда верен, так как Intel совершенствует качество кодирования с каждой новой версией чипа и SDK и скорость на новых чипах может быть меньше. При этом нагрузка на CPU у первых немного больше. С чем это связано, пока непонятно.

Кроме этого, оптимизация работы с памятью дала прирост примерно в 2 раза в плане производительности.

 

Качество кодирования на Intel® HD Graphics P4700 получилось таким же, как и на Intel® HD Graphics P4600, но E3-1285 v3 работает быстрее примерно на 14% при той же загрузке ресурсов. Кроме этого, E3-1285 v3 быстрее E3-1225 V3 в кодировании при помощи ffmpeg примерно на 10%.

Сервер с установленным streambuilder с поддержкой Quick Sync позволяет кодировать один источник в 12 качеств Full HD (1080p), 24 качества HD (720p) и 46 качеств SD (480p) с нарезкой в HLS. Если это съем «сырого» сигнала с SDI, то число одновременно кодируемых качеств немного больше.

Поэкспериментировать со streambuilder (пока только libavcodec based версия) можно скачавc сайта продукта: http://streambuilder.pro. С ним в комплекте идет стандартный конфиг, позволяющий записывать в формат HLS любой источник.

 

Итоги

Технология Intel Quick Sync позволяет собрать сравнительно недорогой производительный сервер для кодирования видео с приемлемым качеством. В процессе внедрения этой технологии мы столкнулись с некоторыми техническими проблемами, связанными с наличием интегрированного в материнскую плату видео, которые, впрочем вполне решаемы. Напомним, главное при выборе железа для этих целей — это чип со спецификацией С226 и материнская плата без интегрированного видео, так как с ним может не работать IPMI и VGA выход).

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

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.