Скільки екземплярів команд 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 основних та чотирьох ядерних машинах, EC2 c1.xlarge та cc2.8xlarge. Така ж поведінка. Я спробував складні команди і прості, все одно, 2 або 3 зупиняються.


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/nullкаже ffmpeg не шукати введення, і всі ваші завдання повинні працювати у фоновому режимі.


1
Що це: 2> & 1
Dr.jacky

Велике спасибі! У мене була така сама проблема, і це спрацювало як шарм, прийміть, будь ласка!
fr_andres SupportsMonicaCellio

3
@ Mr.Hyde Пізно до партії, яку я знаю, але 2> & 1 повідомляє потоку помилок перейти в те саме місце, що і потоковий потік - so / 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


Я спробував це, він не використовує всі процесори ефективно. Навантаження залишається на рівні 20-30%, гіпер-нитки взагалі не звикають.
d33pika

2
Може, це має щось спільне з машинами EC2? Я просто запускаю вищезгадану команду на ядерній машині 16
xeon

Ви перебуваєте в останній версії FFmpeg?
d33pika

@NublaII Що таке> / dev / null 2> & 1 !?
Dr.jacky

1
@ Mr.Hyde Він приховує від вас стандартний вихід і показує вам результати помилок. Читайте це: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Юрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.