Ich habe eine Liste mit 3.000 URLs in einer Textdatei namens „downloadmp3.txt“ im folgenden Format:
url1,filename1
url2,filename2
...
url3000,filename3000
Ich habe den folgenden Code unter Verwendung von Codefragmenten geschrieben, die ich hier gefunden habe:
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
Mein Problem ist, dass mein Skript etwa 500 der 3.000 MP3s herunterlädt (einige vollständig, andere teilweise) und dann einfach aufhört. Ich bin für jeden Ratschlag dankbar, was ich ändern sollte.
Danke!
Antwort1
Sie haben keine Protokolle angezeigt, die auf das zugrunde liegende Problem hinweisen würden, aber Sie starten im Wesentlichen 3000 Prozesse gleichzeitig, was unerwartete Folgen haben kann (z. B. dass der Remote-Server die Verbindung beendet). Da der &
Job in den Hintergrund gestellt wird, sollte die Schleife ziemlich schnell beendet werden, sobald alle ffmpeg
Prozesse hochgefahren sind, aber dann laufen 3000 Jobs …
Ich würde stattdessen empfehlen,GNUparallel
herunterladenNSie können mehrere Dateien gleichzeitig speichern.
parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt
Dadurch wird die Textdatei gelesen und jede Zeile verarbeitet, wobei die Spalten durch aufgeteilt werden ,
. Sie können die Spaltenwerte dann als {1}
, {2}
, usw. verwenden.
Es würden die folgenden Befehle parallel ausgeführt, mit höchstensNJobs gleichzeitig ausgeführt werden. StandardmäßigNist gleich der Anzahl der CPU-Kerne:
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
Entfernen Sie das --dry-run
, wenn das Gewünschte gedruckt wird.
Sie können hinzufügen, --joblog jobs.txt
dass eine Protokolldatei erstellt wird. Außerdem können Sie hinzufügen --eta
oder --progress
ausdrucken, um Schätzungen darüber abzugeben, wann die Jobs abgeschlossen sein werden. Die Anzahl paralleler Jobs kann mit eingestellt werden -j
.
Beachten Sie, dass ich hinzugefügt habe, -c copy
da Sie den Audiostream normalerweise nicht neu kodieren möchten, wenn die URL bereits auf eine vorhandene MP3-Datei verweist. Wenn Ihre Eingabe nicht MP3 ist, sollten Sie das „noch einmal“ vielleicht weglassen . Und ich habe es in -c copy
geändert, da Sie wahrscheinlich möchten, dass Fehler angezeigt werden.quiet
error