28

HTTP 経由で MP3 形式で音楽をストリーミングするサーバーを Python で実装したいと考えています。クライアントがストリームに接続して、ラジオ局のように現在再生中のものを聴き始めることができるように、音楽をブロードキャストしたいと考えています。

以前、SocketServer.TCPServer を使用して Python で独自の HTTP サーバーを実装しました (はい、BaseHTTPServer が存在することは知っています。自分でミニ HTTP スタックを書きたかっただけです)。ネットワーク側と MP3 側でどのライブラリを確認する必要がありますか?

4

5 に答える 5

40

mp3 形式はストリーミング用に設計されているため、予想よりも簡単なことがいくつかあります。データは、基本的に、生データが続くファイル ヘッダーではなく、境界マーカーが組み込まれたオーディオ フレームのストリームです。これは、クライアントがオーディオ データの受信を期待している場合、既存の mp3 ソース (ライブかファイルか) の任意のポイントからバイトの送信を開始できることを意味し、クライアントは次のフレームを見つけて同期します。オーディオの再生を開始します。わーい!

もちろん、クライアントに接続をセットアップする方法を提供する必要があります。事実上の標準は、SHOUTcast (ICY) プロトコルです。これは HTTP に非常によく似ていますが、ステータス フィールドとヘッダー フィールドが大きく異なるため、Python の組み込みの http サーバー ライブラリと直接互換性がありません。これらのライブラリに作業の一部を任せることができるかもしれませんが、文書化されたインターフェースだけでは十分ではありません。彼らにSHOUTcastを話させる方法を理解するには、彼らのコードを読む必要があります。

開始するためのいくつかのリンクを次に示します。

http://forums.winamp.com/showthread.php?threadid=70403

http://forums.radiotoolbox.com/viewtopic.php?t=74

http://www.smackfu.com/stuff/programming/shoutcast.html

http://en.wikipedia.org/wiki/Shoutcast

データ ソースとして 1 つの mp3 ファイルから始めて、クライアント サーバー接続のセットアップと再生を機能させてから、ライブ ソース、複数のエンコード ビット レート、インバンド メタデータ、プレイリストなどの問題に移ることをお勧めします。

プレイリストは通常​​、.pls または .m3u ファイルであり、基本的にライブ ストリームの URL を指す静的テキスト ファイルです。多くの (ほとんどの?) mp3 ストリーミング クライアントは、プレイリストがまったくないライブ ストリーム URL を受け入れるため、それらは難しくなく、厳密に必要というわけでもありません。

建築に関しては、分野はかなり広く開かれています。HTTP サーバーと同じ数のオプションがあります。スレッド?ワーカープロセス?イベントドリブン?それはあなた次第です。私にとってより興味深い質問は、単一の入力ストリーム (ブロードキャスター) からのデータを、複数の出力ストリーム (プレーヤー) を提供するネットワーク ハンドラーと共有する方法です。IPC と同期の複雑さを避けるために、シングルスレッドのイベント ドリブン設計から始めることになるでしょう。Python 2 では、geventのようなライブラリを使用すると、非常に優れた I/O パフォーマンスが得られると同時に、コードを非常に理解しやすい方法で構造化できます。Python 3 では、asyncio コルーチンを好みます。

于 2013-01-18T19:31:24.913 に答える
1

あなたはすでに Python の経験が豊富なので (既に HTTP サーバーを作成していると仮定して)、既に行った基礎作業を拡張する方法について、いくつかの指針しか提供できません。

  • 、、、などのリクエスト ヘッダーを処理するためにサーバーを準備します。MP3-over-HTTP プレーヤー (つまり、VLC) は、HTTP を「話す」方法とファイル内のさまざまな位置を「シークする」方法を知っている mp3 プレーヤーに他なりません。 .Accept-EncodingRangeTE (Transfer Encoding)

  • Wireshark または tcpdump を使用して、HTTP 経由で mp3 を再生するときにVLC によって行われた実際の HTTP 要求を盗聴します。これにより、どの要求ヘッダーを受信して​​実装するかがわかります。

あなたのプロジェクトで頑張ってください!

于 2013-01-23T20:59:10.593 に答える
0

行き過ぎる前に、これらを調べてください。

http://wiki.python.org/moin/PythonInMusic

具体的には

http://edna.sourceforge.net/

于 2011-04-28T22:47:37.503 に答える
0

m3uまたはplsファイルの提供を検討する必要があります。これにより、プレーヤーが mp3 ファイルを探して http サーバーにヒットするのに十分なほど十分に理解できるファイル形式が得られるはずです。

最小限の m3u ファイルは、1 行に 1 つの曲の URL を持つ単純なテキスト ファイルです。サーバーで次の URL を使用できると仮定します。

/playlists/<playlist_name/playlist_id>
/songs/<song_name/song_id>

次の URL からプレイリストを提供します。

/playlists/myfirstplaylist

リソースの内容は次のようになります。

/songs/1
/songs/mysong.mp3

プレーヤー (Winamp など) は、HTTP サーバー上の m3u ファイルへの URL を開くことができ、プレイリストの最初の曲のストリーミングを開始します。これをサポートするために必要なのは、他の静的コンテンツを提供するのと同じように mp3 ファイルを提供することだけです。

サポートしたいクライアントの数によっては、大量の同時ストリームをサポートするためにTwistedのようなライブラリを使用して非同期 IO を調べたい場合があります。

于 2011-04-22T03:45:32.783 に答える
0

静的 URI (例: http://example.com/now_playing.mp3 )を指す .m3u または .pls ファイルを作成し、要求されたときに曲のどこからでも mp3 データを提供する必要があります。ファイル。おそらく、ここで詳しく説明している小さな問題がたくさんあります...ただし、少なくともフォレストが指摘しているように、任意のバイトからmp3データのストリーミングを開始できます。

于 2013-01-17T08:40:30.220 に答える