23

アプリに軽量HTTPサーバーを記述して、feed動的に生成されMP3たデータを組み込みのAndroid MediaPlayer. に自分のコンテンツを保存することは許可されていませんSD card

私の入力データは本質的に無限の長さです。MediaPlayerそのデータ ソースは、基本的に のようなものにする必要があります"http://localhost/myfile.mp3"MediaPlayerこのリクエストを待機する単純なサーバーをセットアップしました。ただし、MediaPlayerあまり協力的ではありません。最初に を作成し、HTTP GETファイル全体を取得しようとします。単にデータを にダンプしようとするとタイムアウトするため、 Range ヘッダーを socket使用してデータをチャンクに書き込んでみました。これが気に入らず、後続のチャンクを要求し続けません。HTTPMediaPlayer

データを に直接ストリーミングすることに成功した人はいますMediaPlayerか? RTSP代わりにorShoutcastサーバーを実装する必要がありますか? 私は単にクリティカルを見逃していHTTP headerますか? ここでどの戦略を使用する必要がありますか?

4

1 に答える 1

4

HTTPサーバーは実際に電話自体でホストされていました。それは非常に単純で、 リクエストthreadをソケットでリッスンするだけでした。リクエストを受け取ると、 a HTTP GET、いくつかのヘッダーを書き戻し、音声データの へのダンプを開始します。このサーバーは他に何もしませんでした。HTTPnew socketHTTPMP3socketHTTP

Android Media Player私がストリーミングしているときに音楽を再生していました。 オーディオの再生中に再生が空になると、のMedia Player動作が非常に悪くなります。サーバーがbufferそれにデータを書き込み続けていることを確認することは、私にとって非常に重要でした。小さなチャンク (10 kB) でバイトをソケットに移動しました。私の応答のヘッダーは、 次のようになりました。HTTPsocketHTTP

// 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 つだけでした。それはかなりうまく機能しました。

于 2014-07-22T17:10:14.273 に答える