将数据从内存提供给MediaPlayer

时间:2010-11-25 22:15:02

标签: android

方案: 我的.apk中有加密的mp3文件。需要解密并发送到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传递给 媒体播放器。再次,凌乱。我 甚至允许创建一个套接字。

有没有人有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

如果您不需要MediaPlayer中的所有功能,我建议您尝试AudioTrack。它基本上就是你所描述的。不幸的是,MediaPlayer不会在其构造函数中使用AudioTrack,因此在这种情况下最好的解决方案是包含一个虚拟Http服务器,该服务器从URL发回您的数据(这是Android 1.0发行说明所推荐的)。

答案 1 :(得分: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){
    ...
}

答案 2 :(得分:0)

我不是100%肯定,但我认为除了在播放前暂时保存解密文件之外别无其他选择。

This question有点类似,但我认为你没有使用那里建议的简单解决方案,因为你有一个加密文件。还提供了Custom Audio Streaming with MediaPlayer教程的链接,但似乎他们的解决方案也使用临时文件。