Скільки екземплярів команд 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.