オンラインラジオ局からストリーミングオーディオフィードをダウンロードしようとしています。 ステーションは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に待機するように指示する方法はありますか?
どんな考えでも大歓迎です。
ありがとうございました
終了したと思われる場合でも、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
が終了し、次のストリームがまだ引き継がれていないタイムスタンプで)が、この「しゃっくり」 「そのようなストリームの処理方法を本当に知っているプレーヤーを止めるべきではありません。