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 Stopped
y 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 time
y un bash- list
. Pero sin (...&) también obtengo trabajos "detenidos" (con variables no expandidas).