我在名為「downloadmp3.txt」的文字檔案中有一個 3k URL 列表,格式如下:
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
我遇到的問題是,我的腳本下載了 3000 個 mp3 中的大約 500 個(有些是全部,有些是部分),然後就停止了。任何有關進行哪些更改的建議將不勝感激。
謝謝!
答案1
您沒有顯示任何日誌來暗示根本問題是什麼,但您實際上同時啟動了 3000 個進程,這可能會產生意想不到的後果(例如,遠端伺服器終止連線)。由於將作業置於後台,一旦所有進程都啟動,&
循環應該很快就會退出,但隨後您有 3000 個作業正在運行...ffmpeg
我建議使用GNUparallel
去下載n一次文件。
parallel --dry-run --colsep ',' ffmpeg -nostdin -loglevel error -stats -i {1} -c copy {2}.mp3 :::: downloadmp3.txt
這會讀取文字檔案並處理每一行,並按 分割列,
。然後,您可以將列值用作{1}
、{2}
等。
它將並行運行以下命令,最多n作業同時運行。預設情況下n等於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
--dry-run
當列印出你想要的內容時刪除。
您可以添加--joblog jobs.txt
讓它建立一個日誌文件,您還可以添加--eta
或--progress
列印一些有關作業何時完成的估計。可以使用 來設定並行作業的數量-j
。
請注意,我添加了這一點,-c copy
因為如果 URL 已指向現有 MP3 文件,您通常不想重新編碼音訊串流。如果您的輸入不是 MP3,您可能需要省略 back -c copy
。我更改quiet
為,error
因為您可能希望顯示錯誤。