![オンザフライ ffmpeg (パイプ) 変換を並列で実行するにはどうすればよいですか?](https://rvso.com/image/154453/%E3%82%AA%E3%83%B3%E3%82%B6%E3%83%95%E3%83%A9%E3%82%A4%20ffmpeg%20(%E3%83%91%E3%82%A4%E3%83%97)%20%E5%A4%89%E6%8F%9B%E3%82%92%E4%B8%A6%E5%88%97%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
答え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
最も大きなファイルは最後に終了します。私はtime
bash- を持っていますlist
。しかし、(...&) がないと、(展開されていない変数を持つ)「停止」ジョブも取得します。