web-dev-qa-db-ja.com

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

オンラインラジオ局からストリーミングオーディオフィードをダウンロードしようとしています。 ステーションはMP3シャウトキャストフィードで動作していましたが、現在はAAC HTTPオーディオフィードにアップグレードされています

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

ステーションのWebプレーヤーからオーディオフィードを分離する新しいソリューションを考え出しました。cURLを使用してフィードをオーディオファイルにリッピングしています持ち運びできます。

ただし、cURLが無限に記録されるはずなのに、常に「完了」が発生します。最大時間パラメーターを43200秒(12時間)に設定しましたが、ファイルサイズが変化するだけです。通常、結果の各ファイルは1時間以内です。ただし、1時間以上かかる場合もあります。ファイルのサイズと時間は異なります。ファイルは短時間で「壊れ/完了」し、スクリプトを使用してcURLの記録を再開する必要があります。 1日に2回(12時間ごと)の録音が必要なときに、フラクタル録音の大きなフォルダーができてしまいます。 cURL転送の詳細を見ると、「cURL接続はそのままです」で終わります。 cURLログにエラーはないので、cURLに「再接続」を試みさせ、ストリームが終了したと思われる場合でも、ストリームを同じファイルに解析し続ける方法がわかりません。

「wget」と「Jdownloader」も使ってみました、どちらも同じ結果になり、短時間で終了します。

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

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

どんな考えでも大歓迎です。

ありがとうございました

1
gunter

終了したと思われる場合でも、cURLに「再接続」を試行させ、ストリームを同じファイルに解析し続ける方法

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

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

重要なのは、stdoutへのcurl書き込みです。再起動の回数に関係なく、ループ全体をファイルにリダイレクトします。このようにして、複数の連続するcurlプロセスからの出力が連結され、単一のファイルに送られます。

これを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が終了し、次のストリームがまだ引き継がれていないタイムスタンプで)が、この「しゃっくり」 「そのようなストリームの処理方法を本当に知っているプレーヤーを止めるべきではありません。

1