Сколько экземпляров команд FFmpeg я могу запустить параллельно?

18

Я устал выполнять 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 останавливаются.

d33pika
источник
3
Насколько мне известно, в самом FFmpeg не должно быть ничего, что мешало бы вам делать это. Может ли быть проблема с оболочкой?
Slhck
Что если у меня есть разные входы для каждой команды? Как я могу сделать их независимыми, потому что если кто-то останавливается, они все останавливаются.
Самсон
Вы нашли какой-либо параметр для использования нескольких процессоров ?!
Dr.jacky
что вы подразумеваете под "быть остановленным" здесь? Баш показывает их как на паузу?
rogerdpack

Ответы:

21

Отвечая на первоначальный вопрос о том, почему некоторые задания прекращаются, 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/nullffmpeg запрещает искать ввод, и все ваши задания должны выполняться в фоновом режиме.

DingoNV
источник
1
Что это: 2> & 1
Dr.jacky
Большое спасибо! У меня была та же самая проблема, и это работало как шарм, пожалуйста, примите!
fr_andres ПоддерживаетMonicaCellio
3
@ Mr.Hyde Поздно, когда я знаю партию, но 2> & 1 указывает потоку ошибок перейти в то же место, что и полный поток - так / dev / null. Это сокращение для > /dev/null 2>/dev/null.
berry120
7

Просто подумайте о вашей команде: гораздо более простой способ разбить машину одной командой - объединить все в одну строку:

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

NublaII
источник
Я пробовал это, он не использует все процессоры эффективно. Нагрузка остается на уровне 20-30%, гиперпотоки не привыкают совсем.
d33pika
2
Может быть, это как-то связано с машинами EC2? Я просто запускаю
указанную
Вы на последней версии FFmpeg?
d33pika
@NublaII Что такое> / dev / null 2> & 1!?
Dr.jacky
1
@ Mr.Hyde Он скрывает стандартный вывод от вас и показывает вывод ошибок. Читать это: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Юрий Сукупира,