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 コルーチンを好みます。