Какие «железные» составляющие влияют на скорость конвертации в ffmpeg?

Всем привет!
Собираемся делать массовую обработку видео из mp4 в x264 в HLS формат, для того, чтобы им заменить незащищенный HTML5 плеер на видеоплощадке. Теперь думаем на техникой, чтобы сравнительно быстро обработать накопленный материал. . Код конвертации прикреплю в самом низу.
Вопрос : Что важнее для конвертации видео видеокарта или процессор? Тк вроде бы сейчас множество алгоритмов, которые позволяют конвертировать на GPU и по тестам в интернете они дают существенный прирост. Очень интересно как обстоят дела в реальном использовании. Тк сейчас стоит выбор арендовать сервер без GPU, но с мощным набором CPU или наоборот искать компьютер с хорошей видеокартой. Можно ли экономить на ОЗУ и скорости SSD или они тоже играют существенную роль?

Код :
ffmpeg -v quiet -stats -xerror -i test/video-1920-1080.mp4 \
-c:v h264 -profile:v main -level 4.0 \
-filter:v:0 "scale=-2:'min(720,ih)'" \
-filter:v:1 "scale=-2:'min(1080,ih)'" \
-b:v:0 3000k \
-b:v:1 6000k \
-c:a copy \
-force_key_frames "expr:gte(t,n_forced*2)" \
-map 0:0 -map 0:1 -map 0:0 -map 0:1 -f hls \
-var_stream_map "v:0,a:0 v:1,a:1" \
-master_pl_name index.m3u8 \
-hls_time 10 -hls_playlist_type vod \
-hls_segment_filename test/video/%v_%04d.ts test/video/%v.m3u8
  • Вопрос задан
  • 533 просмотра
Решения вопроса 1
@deadmoroz2
Доброго и вам!

Собираемся делать массовую обработку видео из mp4 в x264 в HLS формат, для того, чтобы им заменить незащищенный HTML5 плеер на видеоплощадке.

Можно подойти к задаче несколько иначе, а именно кодировать не в нарезанный на сегменты HLS, этим вы ограничите своё вещание только этим форматом, а в MP4, а уже непосредственно раздачу клиентам делать на базе стороннего модуля для nginx - Kaltura nginx-vod. Озвученное расширение поддерживает вещание во всех распостранённых форматах из MP4 файлов, на лету делая сегментацию для того же HLS.

В нашем довольно крупном CDN мы пошли именно по такому пути, о чём ни разу не пожалели.

Что важнее для конвертации видео видеокарта или процессор? Т.к. вроде бы сейчас множество алгоритмов, которые позволяют конвертировать на GPU, и по тестам в интернете они дают существенный прирост. Очень интересно, как обстоят дела в реальном использовании. Сейчас стоит выбор арендовать сервер без GPU, но с мощным набором CPU или наоборот искать компьютер с хорошей видеокартой.

Если выбор пал на ffmpeg, то выбор в нём ограничен софтверным транскодингом на CPU или же аппаратно ускоренным средствами Intel QuickSync и Nvidia NVENC.

Самое медленное делать весь процессинг на CPU, сюда попадёт decoding, deinterlacing (если нужно), scaling и encoding, последнее самое ресурсоёмкое. У себя несколько лет назад оценивали производительность на разных CPU: серверных одиночных Intel Xeon E3 v3/v4/v5/v6, парных Intel Xeon E5 v2/v3, а так же десктопных Intel Core i7-3930K и AMD FX-6300. Оказалось, что многоядерные процессоры Xeon E5 не давали кратный прирост скорости кодирования, т.к. decoding по сути однопоточный, соотвественно для него лучше одно высокочастотное ядро. Это справедливо для одиночного процесса ffmpeg, но никто не запрещает запускать нужное количество параллельно.

Intel QuickSync использует встроенное процессор видеоядро Intel HD, а это основном свежие десктопные модели или относительно редкие модели Xeon E3 с индексом, оканчивающимся на 5-ку. Позволяет вынести весь процессинг на GPU. Даёт ускорение кодирования в несколько раз. Не самое универсальное решение, к тому же с кучей неудобств и ограничений в серверном сегменте.

Nvidia NVENC требует в системе выделенного GPU (GTX, Quadro, Tesla), количество видеокарт ограничено только наличием свободных PCIe слотов, места под их установку и подвода питания, если оно требуется. Также позволяет вынести весь процессинг на GPU. Ускорение получалось от 8 до 20 раз относительно софтового средствами Xeon E3 в зависимости от количества выходных разрешений. Экономически оно тоже оправдано, т.к. пара GPU будет стоить значительно дешевле пары средне-топовых процессоров E5. Со свой стороны я бы рекомендовал смотреть в этом направлении.

Сами начинали с программного CPU, но как только появилась первая подержка Nvidia GPU в ffmpeg, плавно перевели всё на аппаратное кодирование нa GPU. На руку этому решению сыграло наличие уже купленных 1U серверов на базовых E3, в которые оказалось достаточно доустановить однослотовую самую бюджетную Quadro за 10-20% цены нового такого сервера и получить минимум 5-ти кратное увеличение производительности транскодинга при одновременной разгрузке почти в ноль основного CPU.

Можно ли экономить на ОЗУ и скорости SSD, или они тоже играют существенную роль?

По опыту даже для пары десятков параллельно запущенных ffmpeg с вашим профилем большого объёма RAM не требуется. Об SSD стоит задумываться только тогда, когда вам потребуется произвольно считывать с HDD на скорости свыше 400-500Mbps, запись же прекрасно кэшируется. HDD же конечно должны быть не SMR.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы