2010-11-25 17 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,因此在這種情況下最好的解決方案是包含一個虛擬Http服務器,它可以從URL(這是Android 1.0發行說明建議的內容)返回數據。

+0

我確實考慮過AudioTrack,並忘記在我的文章中提及它:)但它比MediaPlayer低得多。就像它說「它允許PCM音頻緩衝區流到音頻硬件播放」。我不得不自己解碼MP3。 – olafure 2010-11-26 08:20:39

相關問題