Fffmpeg while loop para antes que todos os arquivos sejam processados

Fffmpeg while loop para antes que todos os arquivos sejam processados

Tenho uma lista de 3 mil URLs em um arquivo de texto chamado "downloadmp3.txt", com o seguinte formato:

url1,filename1
url2,filename2
...
url3000,filename3000

Escrevi o seguinte código usando trechos que encontrei aqui:

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

O problema que tenho é que meu script baixa cerca de 500 mp3s dos 3.000 (alguns inteiramente, outros parcialmente) e então simplesmente para. Qualquer conselho sobre quais mudanças fazer seria apreciado.

Obrigado!

Responder1

Você não mostrou nenhum registro que indique qual é o problema subjacente, mas está essencialmente iniciando 3.000 processos ao mesmo tempo, o que pode ter consequências inesperadas (por exemplo, o servidor remoto encerrando a conexão). Como &coloca o trabalho em segundo plano, o loop deve sair rapidamente assim que todos ffmpegos processos forem iniciados, mas você terá 3.000 trabalhos em execução…

Em vez disso, eu recomendaria usarGNUparallelbaixarnarquivos por vez.

parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt

Isso lê o arquivo de texto e processa cada linha, dividindo as colunas por ,. Você pode então usar os valores da coluna como {1}, {2}e assim por diante.

Ele executaria os seguintes comandos em paralelo, com no máximontrabalhos em execução ao mesmo tempo. Por padrãoné igual ao número de núcleos da 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

Remova o --dry-runquando isso imprimir o que você deseja.

Você pode adicionar --joblog jobs.txtpara criar um arquivo de log e também adicionar --etaou --progressimprimir algumas estimativas de quando os trabalhos serão concluídos. O número de trabalhos paralelos pode ser definido com -j.

Observe que adicionei -c copyporque normalmente você não deseja recodificar o fluxo de áudio se o URL já apontar para um arquivo MP3 existente. Se a sua entrada não for MP3, você pode querer omitir -c copynovamente. E mudei quietpara errorporque você provavelmente deseja que os erros sejam mostrados.

informação relacionada