У меня есть список из 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
поскольку вы, вероятно, хотите, чтобы отображались ошибки.