2010-11-25 15 views
4

シナリオ: 私の.apkで暗号化されたmp3ファイルがあります。解読してMediaPlayerオブジェクトに送信する必要があります。メモリからMediaPlayerにデータを送る

問題: ファイルを読み込んで復号化した後、MediaPlayerで再生するにはどうすればよいですか?

今すぐ。 MediaPlayerには4つのバージョンのsetDataSource()があります。

setDataSource(String path) 
setDataSource(FileDescriptor fd) 
setDataSource(FileDescriptor fd, long offset, long length) 
setDataSource(Context context, Uri uri) 

いずれも状況には適していません。 MediaPlayerにInputStreamを与えるのが理想でしょうか?

考えられる解決策:

  • 書き込み復号化されたデータは、そのファイルの再生 を提出します。多くのIOオーバーヘッド。
  • ダミーのhttpサーバー (ServerSocket?)を作成し、URLを MediaPlayerに渡します。もう一度、乱雑です。私は でもソケットを作成できますか?

誰かがより良い解決策を持っていますか?

答えて

1
byte[] callData = ...; 
String base64EncodedString = Base64.encodeToString(callData, Base64.DEFAULT); 

try 
{ 
    String url = "data:audio/amr;base64,"+base64EncodedString; 
    MediaPlayer mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setDataSource(url); 
    mediaPlayer.prepare(); 
    mediaPlayer.start(); 
} 
catch(Exception ex){ 
    ... 
} 
0

私は100%確実ではありませんが、再生する前に復号化されたファイルを一時的に保存する以外の方法はありません。

This questionは似たようなものですが、暗号化されたファイルがあるので、そこに示唆されている簡単な解決方法は使用しないと思います。 Custom Audio Streaming with MediaPlayerのチュートリアルへのリンクもありますが、その解決策も一時ファイルを使用するようです。

1

MediaPlayerのすべての機能が必要ない場合は、AudioTrackを試してみることをおすすめします。これは基本的にあなたが記述しているものを意味します。残念ながら、MediaPlayerはそのコンストラクタでAudioTrackを取っていないので、その場合の最善の解決策は、URLからデータを送り返すダミーのHttpサーバーを組み込むことです(これはAndroid 1.0リリースノートで推奨されています)。

+0

私はAudioTrackについて考えていましたが、私の記事では言及するのを忘れました。それはMediaPlayerよりはるかに低レベルです。それは "それは再生のためにオーディオハードウェアにPCMオーディオバッファをストリームすることができます"と言う。 MP3を自分でデコードする必要があります。 – olafure

関連する問題