アプリで軽量のHTTP
サーバーをfeed
動的に生成されたMP3
データに組み込みのAndroid
MediaPlayer
。コンテンツをSD card
に保存することは許可されていません。
私の入力データは本質的に無限の長さです。 MediaPlayer
に、そのデータソースは基本的に"http://localhost/myfile.mp3"
のようなものでなければならないと言います。 MediaPlayer
がこのリクエストを行うのを待つ簡単なサーバーをセットアップしました。ただし、MediaPlayer
はあまり協力的ではありません。最初に、それはHTTP GET
を作成し、ファイル全体を取得しようとします。データをsocket
に単純にダンプしようとするとタイムアウトになるため、HTTP
Rangeヘッダーを使用してデータをチャンクに書き込んでみました。 MediaPlayer
はこれが気に入らず、後続のチャンクを要求し続けません。
誰かがデータをMediaPlayer
に直接ストリーミングすることに成功した人はいますか?代わりにRTSP
またはShoutcast
サーバーを実装する必要がありますか?重要なHTTP header
がないだけですか?ここではどのような戦略を使用する必要がありますか?
HTTP
サーバーは実際に電話自体でホストされていました。非常に単純でした。thread
がHTTP GET
リクエストをソケットでリッスンしているだけです。HTTP
リクエストを受け取ると、new socket
になり、いくつかのHTTP
ヘッダーを書き戻し、MP3
オーディオデータをsocket
。このHTTP
サーバーは他に何もしませんでした。
Android Media Player
は、ストリーミング中に音楽を再生していました。オーディオの再生中に再生buffer
が空になった場合、Media Player
の動作は非常に悪くなりました。HTTP
サーバーがそのsocket
にデータを書き込み続けることを確認することは私にとって非常に重要でした。バイトを小さなチャンク(10 kB)でソケットに移動しました。HTTP
応答のヘッダーは次のようになりました。// Build response headers StringBuilder sb = new StringBuilder(); sb.append( "HTTP/1.1 200 OK\r\n"); sb.append( "Content-Type: audio/mpeg\r\n"); sb.append( "Connection: close\r\n" ); sb.append( "Accept-Ranges: bytes\r\n" ); sb.append( "Content-Length: " + totalFileSize + "\r\n" ); sb.append( "Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n");
私がパイプを刺激し続けている限り、
Android Media Player
は文句なしにそれを消費し続けました。オーディオの再生には、1つの要求と応答のみが必要でした。それはかなりうまく機能することになった。