リアルタイムffmpeg(パイプライン)変換を並列に実行するには?

リアルタイムffmpeg(パイプライン)変換を並列に実行するには?

次の変換を実行したいと思います。

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

私は使用できることを知っていますffmpeg作品に直接変換しましたが、使いたいです。オプセンコこの場合は最新バージョンだからです。

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。ただし、(...&) が存在しない場合は、(拡張されていない変数がある)「停止」操作も発生します。

関連情報