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 個のプロセスを同時に起動しているため、予期しない結果が発生する可能性があります (リモート サーバーが接続を終了するなど)。&ジョブはバックグラウンドに置かれるため、すべてのプロセスが起動するとループはかなり早く終了するはずですffmpegが、その場合 3000 個のジョブが実行されることになります...

代わりにGNUparallelダウンロードする一度に 1 つのファイルのみ。

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

これはテキスト ファイルを読み取り、各行を処理して、列を で分割します,。その後、列の値を 、 などとして使用でき{1}ます{2}

次のコマンドを並列に実行します。最大で一度に実行できるジョブ数。デフォルトでは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 copyURL が既に既存の MP3 ファイルを指している場合は、通常はオーディオ ストリームを再エンコードしたくないので、 を追加したことに注意してください。入力が MP3 でない場合は、 を省略したほうがよい場合があります。また、おそらくエラーを表示したいので、に-c copy変更しました。quieterror

関連情報