2010-11-22 22 views
7

私はインターネットのラジオストリーム(.asx、.plsなど)を読み込んでファイルに保存するためのpythonスニペットを探しています。Pythonのストリーミングとインターネットラジオの録音

最後のプロジェクトは、1時間または2時間のインターネットラジオを録音し、通勤時に再生するために携帯電話に転送するcronスクリプトです。 (私の通勤には3gは斑があります)

スニペットやポインタは大歓迎です。

答えて

4

したがって、私は、Streamripperがうまく動作するとわかりました。これは私が、私はこれが歳であるが、これはまだ私は最近、いじるされている実行可能な問題であり、承知しています

streamripper http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200 -d ./streams -l 10800 -a tb$FNAME 
1

私は(.PLSが言及あなたのファイルになります)どのようにShoutcastはストリーミング作品を持つ唯一のよく知っている:

あなただけのプレイリストであるPLSファイルを、ダウンロードしてください。それは実際のストリームがどこにあるかを指すテキストファイルなので、フォーマットはかなりシンプルです。

このストリームに接続できるのは、HTTPだけで、MP3またはAACをストリームします。あなたの使用のために、あなたはファイルに取得するすべてのバイトを保存し、MP3またはAACファイルをあなたのMP3プレーヤーに転送することができます。

Shoutcastにはオプションのメタデータが1つあります。あなたはそれがどのように動作するのかを見つけることができますが、実際には必要ありません。

これを行うサンプルアプリケーションが必要な場合は、私にお知らせください。後で何かを作成します。

+0

ありがとう、私はそれを試してみるつもりです – madmaze

2

を使用するコマンドです。

ほとんどのインターネットラジオ局では、ダウンロードの種類を選択できます。MP3バージョンを選択し、生のソケットから情報を読み取り、ファイルに書き込むことができます。そのトリックは、あなたのダウンロードとその曲の演奏との速さを計算して、読み書きサイズのバランスをとることができます。これはあなたのバッファdefにあるでしょう。

ファイルがあるので、単にドライブ(レコード)に残しておけば大丈夫ですが、ほとんどのプレイヤーは既に再生されたチャンクをファイルから削除し、ストリーミングが停止するとドライブとRAMからファイルを消去します。

私は、ファイルの処理、再生、バッファリングの魔法の多くを処理する圧縮アプリケーションなしのファイルアーカイブからいくつかのコードスニペットを使用しています。プロセスがどのように流れるかは非常に似ています。あなたがいくつかのsudoコード(私が強く推奨する)を書くなら、類似点を見ることができます。

+0

それをバッファリングすることに関してどのくらい速くダウンロードするか心配する必要は本当ですか?あなたは、コードが到着したときにオーディオチャンクを保存することができます。これは、Pythonでかなり自動化されています。 'req = urllib.request.Request(URL); resp = urllib.request.urlopen(req); headers = resp.getheaders(); shutil.copyfileobj(resp、f) ' – dingles

3

以下は、リクエストライブラリを使用してhttpリクエストを処理する私の仕事です。あなたはctrl+Cでそれを中断するまでstream.mp3ファイルにストリームを保存します

import requests 

stream_url = 'http://your-stream-source.com/stream' 

r = requests.get(stream_url, stream=True) 

with open('stream.mp3', 'wb') as f: 
    try: 
     for block in r.iter_content(1024): 
      f.write(block) 
    except KeyboardInterrupt: 
     pass 

+0

これは役に立ちますが、ファイル内で繰り返されるブロックはどのように破棄しますか? –

+1

'要求'はSHOUTcastプロトコル(ラジオ)をサポートしていないようですが、BadStatusLine( 'ICY 200 OK \ r \ n'))とエラーが発生します。 – Doomsday

+0

これについては、@Doomsday - 最善の方法を見つけるのにはしばらく時間がかかりましたが、ステータスチェックを無効にして、「ICY 200 OK」はそれを過ぎて行き過ぎる最もクリーンな方法である「HTTP/1.0 200 OK」ですもっと楽しいもの。それが役に立てば幸い! – dingles

2

"HTTP/1.0 200 OK"ヘッダーの代わりに "ICY 200 OK"を返すため、Python 3でのリクエストまたはurllib.request呼び出しがストリームの保存に失敗した場合は、基本機能ICY 200 OKはOKです!

効果的にできることは、ストリームを開いた後、ヘッダを処理する直前にステータスを読み取るルーチンをインターセプトすることです。

このようなルーチンをストリームの開始コードの上に置きます。

def NiceToICY(self): 
    class InterceptedHTTPResponse(): 
     pass 
    import io 
    line = self.fp.readline().replace(b"ICY 200 OK\r\n", b"HTTP/1.0 200 OK\r\n") 
    InterceptedSelf = InterceptedHTTPResponse() 
    InterceptedSelf.fp = io.BufferedReader(io.BytesIO(line)) 
    InterceptedSelf.debuglevel = self.debuglevel 
    InterceptedSelf._close_conn = self._close_conn 
    return ORIGINAL_HTTP_CLIENT_READ_STATUS(InterceptedSelf) 

URLを開く前に、これらの行をメインルーチンの先頭に置きます。

ORIGINAL_HTTP_CLIENT_READ_STATUS = urllib.request.http.client.HTTPResponse._read_status 
urllib.request.http.client.HTTPResponse._read_status = NiceToICY 

彼らは、標準的なルーチンをオーバーライドする(この一回のみ)と、それは、ストリームを開いた際に、通常の状態チェックの代わりにNiceToICY機能を実行します。 NiceToICYは認識できないステータス応答を置き換え、その後、 'real' _read_status関数で必要とされる元の応答の関連ビットをコピーします。最後に元のものが呼び出され、その値が呼び出し元に返され、それ以外のものはすべて正常に処理されます。

これは、エラーの原因となるステータスメッセージの問題を回避する最も簡単な方法であることがわかりました。それがあなたにとっても役立つことを願っています。

関連する問題