Tengo una lista de 3k URL en un archivo de texto llamado "downloadmp3.txt", con el siguiente formato:
url1,filename1
url2,filename2
...
url3000,filename3000
Escribí el siguiente código usando fragmentos que encontré aquí:
while read p; do
a=$( echo $p | cut -d',' -f1 )
b=$( echo $p | cut -d',' -f2 )
ffmpeg -nostdin -loglevel quiet -stats -i ${a} ${b}.mp3 &
done <downloadmp3.txt
El problema que tengo es que mi secuencia de comandos descarga alrededor de 500 mp3 de los 3000 (algunos en su totalidad, otros parcialmente) y luego simplemente se detiene. Se agradecería cualquier consejo sobre qué cambios realizar.
¡Gracias!
Respuesta1
No ha mostrado ningún registro que indique cuál es el problema subyacente, pero básicamente está iniciando 3000 procesos al mismo tiempo, lo que podría tener consecuencias inesperadas (por ejemplo, que el servidor remoto finalice la conexión). Dado que &
pone el trabajo en segundo plano, el bucle debería salir bastante rápido una vez que todos ffmpeg
los procesos se hayan activado, pero luego tendrá 3000 trabajos ejecutándose...
En su lugar recomendaría usarÑUparallel
descargarnortearchivos a la vez.
parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt
Esto lee el archivo de texto y procesa cada línea, dividiendo las columnas por ,
. Luego puede utilizar los valores de la columna como {1}
, {2}
etc.
Ejecutaría los siguientes comandos en paralelo, con como máximonortetrabajos ejecutándose al mismo tiempo. Por defectonortees igual al número de núcleos de CPU:
ffmpeg -nostdin -loglevel error -stats -i url1 -c copy filename1.mp3
ffmpeg -nostdin -loglevel error -stats -i url2 -c copy filename2.mp3
ffmpeg -nostdin -loglevel error -stats -i url3000 -c copy filename3000.mp3
Elimine --dry-run
cuando esto imprima lo que desea.
Puede agregar --joblog jobs.txt
que cree un archivo de registro y también puede agregar --eta
o --progress
imprimir algunas estimaciones sobre cuándo finalizarán los trabajos. El número de trabajos paralelos se puede configurar con -j
.
Tenga en cuenta que lo agregué -c copy
porque generalmente no desea volver a codificar la transmisión de audio si la URL ya apunta a un archivo MP3 existente. Si su entrada no es MP3, es posible que desee omitir el archivo -c copy
nuevamente. Y cambié quiet
a error
porque probablemente quieras que se muestren los errores.