Цикл Fffmpeg while останавливается до обработки всех файлов

Цикл Fffmpeg while останавливается до обработки всех файлов

У меня есть список из 3 тыс. URL-адресов в текстовом файле с именем «downloadmp3.txt» в следующем формате:

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

Я написал следующий код, используя фрагменты, которые нашел здесь:

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

Проблема в том, что мой скрипт загружает около 500 mp3 из 3000 (некоторые полностью, некоторые частично), а затем просто останавливается. Буду признателен за любые советы по поводу того, какие изменения внести.

Спасибо!

решение1

Вы не показали никаких журналов, которые могли бы указать на основную проблему, но вы по сути запускаете 3000 процессов одновременно, что может иметь неожиданные последствия (например, удаленный сервер завершит соединение). Поскольку переводит &задание в фоновый режим, цикл должен довольно быстро завершиться после того, как все ffmpegпроцессы запустятся, но тогда у вас будет запущено 3000 заданий…

Вместо этого я бы рекомендовал использоватьГНУparallelСкачатьнфайлов за раз.

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

Это считывает текстовый файл и обрабатывает каждую строку, разделяя столбцы на ,. Затем вы можете использовать значения столбцов как {1}, {2}, и так далее.

Он будет выполнять следующие команды параллельно, максимум снзадания, запущенные одновременно. По умолчаниюнравно количеству ядер ЦП:

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

Удалите, --dry-runкогда это напечатает то, что вам нужно.

Вы можете добавить --joblog jobs.txt, чтобы он создал файл журнала, а также вы можете добавить --etaили --progressдля распечатки некоторых оценок того, когда задания будут завершены. Количество параллельных заданий можно задать с помощью -j.

Обратите внимание, что я добавил, -c copyпоскольку обычно не нужно перекодировать аудиопоток, если URL-адрес уже указывает на существующий файл MP3. Если ваш ввод не MP3, вы можете опустить again -c copy. И я изменил quietна, errorпоскольку вы, вероятно, хотите, чтобы отображались ошибки.

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