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

25471
d33pika

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

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

2 ответа на вопрос

18
DingoNV

In answering the original question, as to why some of the jobs stop, ffmpeg on the command line is interactive. It's constantly reading input on the command line. In order for you to run all of them in the background you should change this:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 > /dev/null 2>&1 & 

to this:

ffmpeg -i input.mp4 -t 60 -f mp4 /mnt/a.mp4 </dev/null > /dev/null 2>&1 & 

the addition of </dev/null tells ffmpeg to not look for input, and all of your jobs should run in the background.

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

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

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

Я пробовал это, он не использует все процессоры эффективно. Нагрузка остается на 20-30%, гипер нити совсем не привыкают. d33pika 11 лет назад 0
Может быть, это как-то связано с машинами EC2? Я просто запускаю приведенную выше команду на 16-ядерном компьютере с 16 выходами, и вот что я получаю: [htop screenshot] (http://img841.imageshack.us/img841/6403/ffmpeg.jpg) NublaII 11 лет назад 2
Вы на последней версии FFmpeg? d33pika 11 лет назад 0
@NublaII Что такое> / dev / null 2> & 1!? Dr.jacky 8 лет назад 0
@ Mr.Hyde Он скрывает стандартный вывод от вас и показывает вывод ошибок. Читать это: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ Yuri Sucupira 7 лет назад 1

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