Серверное решение для кодирования видео с использованием встроенного видео Intel HD Graphics
В предыдущей статье речь шла о кодировании видео с использованием технологии Intel Quick Sync на современных процессорах Intel и о том опыте, который мы получили в процессе интеграции этой технологии в наш софт. В этот раз я расскажу о том, как мы создавали серверное решение, о проблемах, с которыми столкнулись, а также о производительности нашего решения на серверных процессорах Intel. Пользуясь случаем, хочу поблагодарить наших коллег из Intel за оперативную помощь в процессе интеграции Intel Quick Sync в наш софт.Тестирование Для тестирования нашего ПО был выбран 1U сервер в следующей конфигурации: M/B Supermicro X10SLH-F Процессор Intel® Xeon® CPU E3–1225 v3 @ 3.20GHz Память 16 Гб Версия OS на сервере Ubuntu 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.Также мы оптимизировали механизм передачи сырых фреймов в нашем конвейере, используя нативный тип памяти SDK, что увеличило производительность и дало возможность выжать из железа максимум скорости. При этом передается лишь указатель на поверхность и не происходит физического копирования памяти по конвейеру.
В качестве тестового ролика выступало видео 1920×800, H264, продолжительностью 12 минут. Выходное видео: 1920×800, high, H264, 8Мб/с. В случае ffmpeg параметры были по умолчанию (profile high). Тестовая утилита из Intel Media SDK sample_full_transcode также кодировала с параметрами по умолчанию (profile high). Streambuilder с поддержкой QuickSync кодировал со следующими параметрами: profile high, RateControlMethod cbr, level avc 4.2. Параметр target usage (влияет на качество/скорость кодирования) во всех случаях balanced.Результаты тестов иллюстрирует следующая таблица.
Процессор: 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 версия) можно скачав его отсюда. С ним в комплекте идет стандартный конфиг, позволяющий записывать в формат HLS любой источник.
Итоги Технология Intel Quick Sync позволяет собрать сравнительно недорогой производительный сервер для кодирования видео с приемлемым качеством. В процессе внедрения этой технологии мы столкнулись с некоторыми техническими проблемами, связанными с наличием интегрированного в материнскую плату видео, которые, впрочем вполне решаемы. (Напомним, главное при выборе железа для этих целей — это чип со спецификацией С226 и материнская плата без интегрированного видео, так как с ним может не работать IPMI и VGA выход).Плюсы такого решения, на мой взгляд, это то, что почти не задействован CPU, а также небольшое потребление памяти. При этом, свободные ресурсы можно использовать для других задач или для кодирования средствами CPU.В ближайших планах у нас поиграться с VPP (video post processing = постобработка видео) функциями Intel Media SDK (denoise, crop, resize, frame rate conversion, deinterlacing и т.д.). Пока мы реализовали crop, resize и deinterlacing, и эти операции выполняются так же быстрее, чем их чисто программные аналоги. В Intel Media SDK довольно много параметров кодирования, и мы продолжаем делать тесты и сравнивать с нашим профайлами. О результатах экспериментов с VPP, производительностью/качеством и сравнении 2-pass кодирования ffmpeg/h264 с технологией LookAhead Intel HD Graphics, я думаю, мы еще напишем.