Сколько экземпляров команд FFmpeg я могу запустить параллельно?
Я устал выполнять 8 команд параллельно, чтобы полностью использовать процессор и ускорить преобразование видео, что-то вроде этого:
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/b.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/c.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/d.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/e.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/f.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/g.mp4 > /dev/null 2>&1 &
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/h.mp4 > /dev/null 2>&1 &
От 2 до 3 из них останавливаются. Почему это происходит? Это ограничение FFmpeg? Я пробовал это на 16-ядерных и 4-ядерных компьютерах, EC2 c1.xlarge и cc2.8xlarge. Такое же поведение Я пробовал сложные команды и простые, все те же, 2 или 3 останавливаются.
2 ответа
Отвечая на первоначальный вопрос о том, почему некоторые задания прекращаются, ffmpeg в командной строке является интерактивным. Это постоянно чтение ввода в командной строке. Чтобы запустить все из них в фоновом режиме, вы должны изменить это:
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 &
к этому:
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 &
Добавление </dev/null
говорит ffmpeg не искать ввод, и все ваши задания должны выполняться в фоновом режиме.
Просто подумайте о вашей команде: гораздо более простой способ разбить машину одной командой - объединить все в одну строку:
ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 \
-f mp4 /mnt/b.mp4 \
-f mp4 /mnt/c.mp4 \
-f mp4 /mnt/d.mp4 \
-f mp4 /mnt/e.mp4 \
-f mp4 /mnt/f.mp4 \
-f mp4 /mnt/g.mp4 \
-f mp4 /mnt/h.mp4 > /dev/null 2>&1
Возможно, вы захотите добавить (в зависимости от вашей версии ffmpeg) флаг, чтобы указать серверу использовать все доступные процессоры
-threads 0
Для справки: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs