Я работаю над созданием нескольких закодированных потоков из одного файла ввода (.mp4). Входной поток не имеет аудио. Каждый кодированный поток создается путем обрезки различной части входного сигнала, а затем кодируется с одинаковой скоростью передачи данных в 32-ядерной системе.
Вот сценарии, которые я пытаюсь описать в википедии ffmpeg для создания нескольких выходов. https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs
Сценарий 1 (с использованием одного экземпляра ffmpeg)
ffmpeg -i input.mp4 \
-фильтр:v обрезать = iw/2:ih/2:0:0 -c:v libx264 -b:v 5M out_1.mp4 \
-фильтр:v обрезать = iw/2:ih/2:iw/2:0 -c:v libx264 -b:v 5M out_2.mp4 \
-фильтр:v обрезать = iw/2:ih/2:0:ih/2 -c:v libx264 -b:v 5M out_3.mp4
В этом случае я предполагаю, что ffmpeg будет декодировать ввод только один раз, и он будет предоставлен всем фильтрам обрезки. Пожалуйста, поправьте меня, если это не правильно.
Сценарий 2 (использование нескольких экземпляров ffmpeg и, следовательно, трех отдельных процессов)
ffmpeg -i input.mp4 -filter:v crop = iw/2:ih/2:0:0 -c:v libx264 -b:v 5M out_1.mp4
ffmpeg -i input.mp4 -filter:v crop = iw/2:ih/2:iw/2:0 -c:v libx264 -b:v 5M out_2.mp4
ffmpeg -i input.mp4 -filter:v crop = iw/2:ih/2:0:ih/2 -c:v libx264 -b:v 5M out_3.mp4
В моем случае мне действительно нужно кодировать еще большее количество потоков, обрезая различные разделы входного видео. Я показываю три здесь, чтобы сделать этот пример проще.
Теперь, с точки зрения производительности fps, я вижу, что сценарий 2 работает лучше. Он также использует процессор по максимуму (загрузка процессора более 95%). В сценарии 1 меньше кадров в секунду, а загрузка ЦП намного ниже (около 65%). Кроме того, в этом случае, когда я увеличиваю количество потоков, которые должны быть закодированы, загрузка ЦП не увеличивается линейно. это почти в 1,5 раза, когда я иду от одного потока к двум. Но после этого приращения очень низкие (вероятно, 10% и даже меньше с большим количеством потоков).
Итак, мой вопрос: я хочу использовать один экземпляр ffmpeg, потому что он позволяет избежать многократного декодирования, а также, потому что мой ввод может быть как 4K или даже больше. Что я должен сделать, чтобы улучшить загрузку ЦП (> 90%) и, следовательно, улучшить производительность fps? Кроме того, почему загрузка ЦП не увеличивается линейно с количеством потоков, которые должны быть закодированы? Почему один экземпляр ffmpeg не работает так же хорошо, как несколько экземпляров? Мне кажется, что с одним экземпляром ffmpeg все кодировки действительно не работают параллельно.
Изменить: Вот самый простой способ, которым я могу воспроизвести и объяснить проблему, если все не так ясно.Имейте в виду, что это только для экспериментальных целей, чтобы понять проблему.
Одиночный экземпляр: ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f ноль - -c: v libx264 -x264opts потоков = 1 -b: v 1M -f ноль - - c: v libx264 -x264opts threads = 1 -b: v 1M -f ноль -
Несколько экземпляров: ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f ноль - | ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f ноль - | ffmpeg -y -i input.mp4 -c: v libx264 -x264opts threads = 1 -b: v 1M -f ноль -
Обратите внимание, что я ограничиваю x264 одним потоком. В случае одного экземпляра я бы ожидал, что ffmpeg сгенерирует 1 поток кодирования для каждого кодирования x264 и выполнит их параллельно. Но я вижу, что полностью используется только одно ядро процессора, что заставляет меня поверить, что одновременно выполняется только один сеанс кодирования. С другой стороны, в случае нескольких экземпляров, я вижу, что три ядра процессора полностью используются, что, я думаю, означает, что все три кодировки работают параллельно.
Я действительно надеюсь, что некоторые эксперты могут подключиться и помочь с этим.