Fffmpeg while 迴圈在處理所有檔案之前停止

Fffmpeg while 迴圈在處理所有檔案之前停止

我在名為「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因為您可能希望顯示錯誤。

相關內容