Combien d'instances de commandes FFmpeg puis-je exécuter en parallèle?

18

Je suis fatigué d'exécuter 8 commandes en parallèle pour utiliser pleinement le processeur et accélérer les conversions vidéo, quelque chose comme ceci:

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 d'entre eux sont arrêtés. Pourquoi cela arrive-t-il? S'agit-il d'une limitation FFmpeg? J'ai essayé ceci sur des machines à 16 cœurs et 4 cœurs, EC2 c1.xlarge et cc2.8xlarge. Même comportement. J'ai essayé des commandes compliquées et simples, toujours les mêmes, 2 ou 3 s'arrêtent.

d33pika
la source
3
À ma connaissance, rien dans FFmpeg ne devrait vous empêcher de le faire. Peut-être un problème de shell?
slhck
Que faire si j'ai des entrées différentes pour chaque commande? Comment puis-je les rendre indépendants, parce que si l'on s'arrête, ils s'arrêtent tous.
Samson
Avez-vous trouvé un paramètre pour utiliser plusieurs processeurs?!
Dr.jacky
qu'entendez-vous par «se faire arrêter» ici? bash les montre en pause?
rogerdpack

Réponses:

21

En répondant à la question d'origine, expliquant pourquoi certaines tâches s'arrêtent, ffmpeg sur la ligne de commande est interactif. Il lit constamment des entrées sur la ligne de commande. Pour que vous puissiez les exécuter tous en arrière-plan, vous devez modifier ceci:

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

pour ça:

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

l'ajout de </dev/nullindique à ffmpeg de ne pas rechercher d'entrée, et tous vos travaux doivent s'exécuter en arrière-plan.

DingoNV
la source
1
Qu'est-ce que c'est: 2> & 1
Dr.jacky
Merci beaucoup! J'ai eu le même problème et cela a fonctionné comme un charme, veuillez accepter!
fr_andres SupportsMonicaCellio
3
@ Mr.Hyde Tard à la fête, je sais, mais 2> & 1 indique au flux d'erreur d'aller au même endroit que le flux robuste - donc / dev / null. C'est un raccourci pour > /dev/null 2>/dev/null.
berry120
7

Juste une pensée sur votre commande: un moyen beaucoup plus facile de marteler la machine avec une seule commande consiste à tout concaténer en une seule ligne:

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

Vous voudrez peut-être ajouter (selon votre version de ffmpeg) un indicateur pour indiquer au serveur d'utiliser tous les processeurs disponibles

-threads 0

Pour référence: http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs

NublaII
la source
J'ai essayé cela, il n'utilise pas tous les processeurs efficacement. La charge reste à 20-30%, les hyper threads ne sont pas du tout utilisés.
d33pika
2
Peut-être que cela a quelque chose à voir avec les machines EC2? Je viens d'exécuter la commande ci-dessus sur une machine 16 xeon core avec 16 sorties et
voici
Êtes-vous sur la dernière version de FFmpeg?
d33pika
@NublaII Qu'est-ce que> / dev / null 2> & 1!?
Dr.jacky
1
@ Mr.Hyde Il vous cache la sortie standard et vous montre les sorties d'erreur. Lisez ceci: xaprb.com/blog/2006/06/06/what-does-devnull-21-mean
Yuri Sucupira