Wie führe ich eine On-the-Fly-FFMPEG-Konvertierung (Pipe) parallel aus?

Wie führe ich eine On-the-Fly-FFMPEG-Konvertierung (Pipe) parallel aus?

Ich möchte folgende Konvertierung durchführen:

for f in *.m4a; do 
    (  ffmpeg -i "$f" -f wav - | opusenc --bitrate 38 - "${f%.m4a}.opus" ) & 
done

Ich weiß, ich könnte es gebrauchenffmpegdirekt in Opus konvertieren, aber ich möchte verwendenAbonnierenin diesem Fall, da es eine neuere Version ist.

Wenn ich opusenc nach ffmpeg ausführe, funktioniert es einwandfrei, aber wenn ich versuche, das oben genannte auszuführen, erhalte ich nur eine Menge Stoppedund nichts passiert.

Antwort1

Wenn Sie GNU Parallel verwenden, funktioniert dies:

parallel 'ffmpeg -i {} -f wav - | opusenc --bitrate 38 - {.}.opus' ::: *m4a

Vielleicht ist das gut genug?

Es bietet den zusätzlichen Vorteil, dass nur ein Job pro CPU-Thread ausgeführt wird, sodass Ihr Computer auch bei 1.000 Dateien nicht überlastet wird.

Antwort2

Ich habe mir diese Konstruktion ausgedacht (... &), bin mir aber nicht sicher, warum sie funktioniert:

for f in R*.mp3
do
  (time ffmpeg -loglevel 0 -i "$f" -ac 1 -y "${f%mp3}new.mp3" && date && ls -l "$f" &)
done

Mit 4 Dateien:

real    0m0.784s
user    0m0.795s
sys     0m0.048s
So 10 Sep 2023 16:36:43 UTC
-rw-r--r-- 1 root root 1363436   10.Sep 10:04  REC-005.mp3

real    0m1.037s
user    0m1.064s
sys     0m0.040s
So 10 Sep 2023 16:36:43 UTC
-rw-r--r-- 1 root root 1540076   10.Sep 10:04  REC-003.mp3

real    0m1.822s
user    0m1.882s
sys     0m0.055s
So 10 Sep 2023 16:36:44 UTC
-rw-r--r-- 1 root root 2948588   10.Sep 10:04  REC-002.mp3

real    0m2.196s
user    0m2.253s
sys     0m0.061s
So 10 Sep 2023 16:36:44 UTC
-rw-r--r-- 1 root root 3402476   10.Sep 10:04  REC-004.mp3

Die größte Datei endet zuletzt. Ich habe timeund ein bash- list. Aber ohne (...&) bekomme ich auch „Gestoppte“ Jobs (mit nicht erweiterten Variablen).

verwandte Informationen