オンザフライ ffmpeg (パイプ) 変換を並列で実行するにはどうすればよいですか?

オンザフライ ffmpeg (パイプ) 変換を並列で実行するにはどうすればよいですか?

次のような変換をしたいです。

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

私は使えると知っているffmpeg直接opusに変換したいのですが、opusencこの場合は、新しいバージョンだからです。

ffmpeg の後に opusenc を実行すると正常に動作しますが、上記を実行しようとすると、大量のエラーが表示されるだけでStopped、何も起こりません。

答え1

GNU Parallel を使用する場合は、次のように動作します:

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

それで十分でしょうか?

CPU スレッドごとに 1 つのジョブのみを実行するという追加の利点があるため、1000 個のファイルがある場合でもマシンに過負荷がかかりません。

答え2

私はこの構造を思いつきました(... &)が、なぜそれが機能するのか分かりません。

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

4 つのファイルの場合:

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

最も大きなファイルは最後に終了します。私はtimebash- を持っていますlist。しかし、(...&) がないと、(展開されていない変数を持つ)「停止」ジョブも取得します。

関連情報