Как запустить параллельное преобразование ffmpeg (pipe) «на лету»?

Как запустить параллельное преобразование ffmpeg (pipe) «на лету»?

Я хочу сделать следующее преобразование:

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

Я знаю, что мне бы это пригодилось.ffmpegнапрямую преобразовать в opus, но я хочу использоватьopusencв данном случае, так как это более новая версия.

Когда я запускаю opusenc после ffmpeg, все работает нормально, но когда я пытаюсь запустить вышеуказанное, я получаю кучу ошибок Stoppedи ничего не происходит.

решение1

Если вы используете GNU Parallel, то это работает:

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

Может быть, этого достаточно?

Дополнительным преимуществом является то, что он выполняет только 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. Но без (...&) я также получаю "Остановленные" задания (с нераскрывающимися переменными).

Связанный контент