В нашей второй статье про энкодинг (с тестом А4000) мы упустили, что видеопоток бывает и большего разрешения, поэтому стоит протестировать энкодинг файлов в формате 4К. Для полноты картины мы также сравним энкодинг на решениях от NVIDIA с встроенным GPU от Intel. Некоторые профессионалы полагают, будто достаточно собрать тот же FFmpeg с включенным QuickSync и внешняя видеокарта станет не нужна. Проверим и это утверждение.
A4000 vs A5000
Используем тот же самый тестовый стенд из имеющихся в наличии серверов HOSTKEY, но установим в него видеокарту NVIDIA A5000 с большим количеством блоков энкодинга, 24 ГБ видеопамяти и более высоким энергопотреблением.
Для начала проверим ее работу на количестве потоков, оказавшемся предельным для А4000 по результатам предыдущего теста:
14 потоков
gpu | pwr | gtemp | mtemp | sm | mem | enc | dec | mclk | pclk | fb | bar1 |
---|---|---|---|---|---|---|---|---|---|---|---|
Idx | W | C | C | % | % | % | % | MHz | MHz | MB | MB |
0 | 97 | 47 | - | 92 | 3 | 100 | 0 | 7600 | 1920 | 3502 | 33 |
gpu | Idx | 0 |
pwr | W | 97 |
gtemp | C | 47 |
mtemp | C | - |
sm | % | 92 |
mem | % | 3 |
enc | % | 100 |
dec | % | 0 |
mclk | MHz | 7600 |
pclk | MHz | 1920 |
fb | MB | 3502 |
bar1 | MB | 33 |
frame=1015 fps=31 q=28.0 Lsize= 9056kB time=00:00:33.80 bitrate=2194.8kbits/s speed=1.02x
Удивительно! Мы получили сравнимые с результатом A4000 цифры. Несмотря на большую частоту работы чипа, больший объем используемой видеопамяти и большее энергопотребление, A5000 осилила энкодинг только 14 потоков и спасовала на пятнадцатом. Это фиаско еще раз доказывает, что профессиональные видеоадаптеры предназначены для других целей.
Включаем 4K
Теперь попробуем запустить трансляцию потока с разрешением 3840x2160 (оно же 4K), благо есть и такая версия файла про кролика. Энкодинг силами только центрального процессора захлебнулся уже на одном потоке, когда объем данных кратно увеличился:
frame= 2902 fps=27 q=29.0 size=104448kB time=00:01:33.56 bitrate=9144.7kbits/s dup=436 drop=0 speed=0.878x
Каковы возможности GPU (помним, результаты у A4000 и A5000 сравнимы)? Это 3 потока.
gpu | pwr | gtemp | mtemp | sm | mem | enc | dec | mclk | pclk | fb | bar1 |
---|---|---|---|---|---|---|---|---|---|---|---|
Idx | W | C | C | % | % | % | % | MHz | MHz | MB | MB |
0 | 96 | 46 | - | 100 | 3 | 96 | 0 | 7600 | 1920 | 1112 | 9 |
gpu | Idx | 0 |
pwr | W | 96 |
gtemp | C | 46 |
mtemp | C | - |
sm | % | 100 |
mem | % | 3 |
enc | % | 96 |
dec | % | 0 |
mclk | MHz | 7600 |
pclk | MHz | 1920 |
fb | MB | 1112 |
bar1 | MB | 9 |
Как видим, по потребляемой мощности и загрузке блоков энкодинга видеочип работает явно не в режиме повышенного комфорта, хотя при этом расходуется лишь около 1 ГБ видеопамяти.
Вывод FFmpeg подтверждает, что видеокарта справляется:
frame= 1465 fps=33 q=35.0 Lsize=12584kB time=00:00:48.80 bitrate=2112.4kbits/s dup=159 drop=0 speed=1.09x
А вот 4 потока адаптер уже не переваривает. Хотя загрузка железа остается примерно на тех же значениях, начинаются просадки по кадрам:
frame= 614 fps= 26 q=35.0 Lsize=4978kB time=00:00:20.43 bitrate=1995.6kbits/s speed=0.858x
Сборка FFmpeg с поддержкой QuickSync
Для тестов понадобился подходящий процессор Intel (мы нашли машину с Core i9-9900K CPU @ 3.60GHz) и собранная с поддержкой Quick Sync утилита FFmpeg. С первым проблем не возникло (достаточно чипа старше 6-го поколения и наличия в нем GPU, что несложно проверить), но сборка FFmpeg под тестовую Ubuntu 20.04 вызвала стойкие ассоциации с практическим освоением Камасутры. Чтобы не заставлять вас тратить драгоценное время, опишем, как нам удалось решить проблему.
Поскольку пакеты в репозиториях сломаны, первым делом нужно собрать и установить в систему библиотеки gmmlib и libva, а также последние версии Intel media driver и Media SDK. Для этого в домашней директории создадим папку GIT, зайдем в нее и выполним последовательно следующие команды (если будет не хватать каких-то зависимостей, установим их из репозитория; мы рекомендуем сделать sudo apt install autoconf automake build-essential cmake pkg-config):
git clone https://github.com/intel/gmmlib.git && cd gmmlib
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu ..
make -j8
sudo make install
git clone https://github.com/intel/libva.git && cd libva
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
make -j8
sudo make install
git clone https://github.com/intel/media-driver.git && cd media-driver
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu ..
make -j8
sudo make install
git clone https://github.com/Intel-Media-SDK/MediaSDK.git && cd MediaSDK
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu ..
make -j8
sudo make install
Затем нужно собрать FFmpeg с помощью нескольких магических команд:
git clone https://github.com/ffmpeg/ffmpeg
cd ffmpeg
./configure --enable-libmfx --enable-vaapi --enable-opencl --enable-libvorbis --enable-libvpx --enable-libdrm --enable-gpl --cpu=native --enable-libfdk-aac --enable-libx264 --enable-libx265 --extra-libs=-lpthread --enable-nonfree
make -j8
sudo make install
Стоит убедиться, что у нас появилась поддержка Quick Sync:
ffmpeg -decoders|grep qsv
Вывод команды должен быть примерно таким:
V....D av1_qsv AV1 video (Intel Quick Sync Video acceleration) (codec av1)
V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
V....D hevc_qsv HEVC video (Intel Quick Sync Video acceleration) (codec hevc)
V....D mjpeg_qsv MJPEG video (Intel Quick Sync Video acceleration) (codec mjpeg)
V....D mpeg2_qsv MPEG2VIDEO video (Intel Quick Sync Video acceleration) (codec mpeg2video)
V....D vc1_qsv VC1 video (Intel Quick Sync Video acceleration) (codec vc1)
V....D vp8_qsv VP8 video (Intel Quick Sync Video acceleration) (codec vp8)
V....D vp9_qsv VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
Ура! Все готово к тестам.
Тестирование энкодинга с Quick Sync
Для начала проверим, как справляется с энкодингом видео в FullHD процессор без Quick Sync: он выдерживает максимум 4 потока, при которых все ядра загружены под 100%
frame= 1461 fps= 33 q=29.0 size=24064kB time=00:00:46.33 bitrate=4254.7kbits/s speed=1.05x
Пятый поток процессор уже не осиливает, поэтому можно смело приступать к тесту с Quick Sync. В скрипте из предыдущей статьи для этого нужно будет заменить энкодер на h264_qsv, и он примет следующий вид (подробнее об использовании QuickSync с FFmpeg можно почитать тут):
#!/bin/bash
for (( i=0; i<$1; i++ )) do
ffmpeg -i http://78.0.75.110:5454/ -an -vcodec h264_qsv -y Output-File-$i.mp4 &
done
Сразу делаем проверку на 6 потоках (+2 к тесту на чистом CPU):
frame=291 fps=55 q=29.0 size=1280kB time=00:00:10.13 bitrate=1034.8kbits/s dup=2 drop=0 speed=1.93x
Разница очевидна: загрузка процессора не превышает 50%, а имеющийся запас вычислительных ресурсов позволяет прогнозировать 11 – 12 итоговых потоков.
Ставим 11 потоков:
frame=157 fps=30 q=38.0 Lsize=628kB time=00:00:05.69 bitrate=903.0kbits/s dup=2 drop=0 speed=1.09x
Загрузка процессора возрастает незначительно, но GPU уже подходит к пределу возможностей. Двенадцатый поток роняет битрейт и скорость обработки до 24 – 28 кадров.
Теперь проверяем потоки в 4K. В отличие от AMD, наш процессор Intel спокойно обрабатывает один поток в таком разрешении и без аппаратного ускорения:
frame=655 fps=31 q=-1.0 Lsize=30637kB time=00:00:21.73 bitrate=11547.9kbits/s speed=1.03x
На большее он, увы, не способен. С включенным Quick Sync тестовый компьютер смог вытянуть три потока с разрешением 4K:
frame= 509 fps=31 q=33.0 Lsize=8010kB time=00:00:17.42 bitrate=3764.7kbits/s dup=2 drop=0 speed=1.07x
Спасовал он только на четвертом, но столько же у нас выдержала и видеокарта Nvidia A5000.
Итоги
Выводы вы можете сделать самостоятельно. Мы лишь отметим, что для энкодинга видео разница в мощности видеокарт не всегда определяется их ценой, а для решения некоторых задач стоит обратить внимание на специализированные технологии внутри центральных процессоров. Также мы использовали для тестов H264, но кодеки HEVC (H265) или VP1 в теории должны дать лучшие результаты, особенно на разрешениях 4K. Если вы самостоятельно проведете подобные тесты с первым (VP1 пока что представлен аппаратно и массово только для декодинга), поделитесь результатами в комментариях.