¿Cómo ejecuto una conversión ffmpeg (tubería) sobre la marcha en paralelo?

¿Cómo ejecuto una conversión ffmpeg (tubería) sobre la marcha en paralelo?

Quiero hacer la siguiente conversión:

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

Sé que podría usarffmpegdirectamente para convertir a opus, pero quiero usaropusencen este caso, ya que es una versión más nueva.

Cuando ejecuto opusenc después de ffmpeg, funciona bien, pero cuando intento ejecutar lo anterior, obtengo un montón de Stoppedy no sucede nada.

Respuesta1

Si usas GNU Parallel entonces esto funciona:

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

¿Quizás eso sea suficiente?

Tiene el beneficio adicional de que solo ejecuta 1 trabajo por subproceso de CPU, por lo que si tiene 1000 archivos no sobrecargará su máquina.

Respuesta2

Se me ocurrió esta construcción (... &)pero no estoy seguro de por qué funciona:

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

Con 4 archivos:

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

El archivo más grande termina al final. Tengo timey un bash- list. Pero sin (...&) también obtengo trabajos "detenidos" (con variables no expandidas).

información relacionada