cURL を使用して Web ストリームをダウンロードする

cURL を使用して Web ストリームをダウンロードする

オンラインラジオ局からストリーミングオーディオフィードをダウンロードしようとしています。この放送局は以前はMP3のシャウトキャストフィードで運営されていたが、現在はAAC HTTPオーディオフィードにアップグレードされている。

私は車での移動中にステーションをリッピングするためにターミナルで「streamripper」を使用していましたが、現在、streamripperは新しいストリームをリッピングできません. 現在、この放送局はストリームに http チャンク転送エンコーディングを使用していると思いますが、これは streamripper ではサポートされていません。

私は新しい解決策を思いつきました。それは、放送局のウェブプレーヤーからオーディオフィードを分離し、私はcURLを利用してフィードをオーディオファイルにリッピングしています持って行けますよ。

しかしcURLで「補完」が頻繁に表示されますが、無限に記録されるはずです最大時間パラメータを 43200 秒 (12 時間) に設定しましたが、ファイル サイズがばらつきます。通常、結果として生成されるファイルは 1 時間以内です。ただし、1 時間を超えることもあります。ファイル サイズと時間は異なります。ファイルは短時間で「中断/完了」し、スクリプトを使用して cURL 記録を再開する必要があります。1 日あたり 2 回 (12 時間ごと) の記録で済むはずなのに、フラクタル記録の大きなフォルダーができてしまいます。cURL 転送の詳細を確認すると、「cURL 接続はそのままです」で終わります。cURL ログにはエラーがないため、cURL が終了したと認識していても、強制的に「再接続」を試行し、ストリームを同じファイルに解析し続ける方法がわかりません。

「wget」と「Jdownloader」も試してみましたどちらも結果は同じで、短時間で終了します。

基本的に強制的に再接続し、上書きせずに同じファイルにダウンロードし続けるために何ができるのかわかりません。

録音が「中断」されないようにするにはどうすればいいでしょうか? 再接続を強制するために何かできることはありますか? あるいは、cURL の転送速度が 0 に低下した場合でも cURL に待機するように指示する方法があるでしょうか?

ご意見をいただければ幸いです。

ありがとう

答え1

cURL が「再接続」を試み、ストリームを解析して同じファイルに書き続けるように強制する方法 (終了したと認識している場合でも)

一般的な方法( に固有のものではありませんcurl)は次のとおりです。

while true; do curl -o - … ; done >file

ポイントは、curlstdout への書き込みです。何回再起動しても、ループ全体をファイルにリダイレクトします。このようにして、複数の連続したcurlプロセスからの出力が連結され、1 つのファイルに送信されます。

これを 12 時間実行するには:

timeout 12h sh -c 'while true; do curl -o - … ; done >file'

ノンストップで実行し、12 時間ごとに新しいファイルを作成するには:

while true; do
   timeout 12h sh -c 'while true; do curl -o - … ; done >"audio_feed_$(date +%Y-%m-%d_%T)"'
done

必要に応じて新しいファイルを開始するには、現在のファイルtimeoutまたはshその子ファイルを削除してください。


注: 時々数秒が欠落するストリームが連結されても、再生可能なファイルになるかどうかはわかりません。ネットワーク経由でリアルタイムにストリーミングされるように設計されたプロトコル/コンテナ/コーデックは、欠落したフラグメントの後に再同期できるはずです。これは、データがサーバーから来るかファイルから来るかに関係なく機能するはずです。キャプチャするストリームがこのような場合、後で再生するときに「コンテンツが欠落」することになります (1 つのストリームがcurl終了し、次のストリームがまだ引き継いでいないタイムスタンプ)。ただし、この「問題」は、そのようなストリームの処理方法を本当に知っているプレーヤーを停止させるものではありません。

関連情報