「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 copy
URL が既に既存の MP3 ファイルを指している場合は、通常はオーディオ ストリームを再エンコードしたくないので、 を追加したことに注意してください。入力が MP3 でない場合は、 を省略したほうがよい場合があります。また、おそらくエラーを表示したいので、に-c copy
変更しました。quiet
error