代码之家  ›  专栏  ›  技术社区  ›  olafure

将数据从内存传送到媒体播放器

  •  5
  • olafure  · 技术社区  · 14 年前

    脚本: 在my.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一个输入流?

    可能的解决方案:

    • 将解密数据写入文件播放 那个档案。大量IO开销。
    • 创建虚拟http服务器 (服务器套接字?)并将url传递给 媒体播放器。又一次,一团糟。我是不是 甚至可以创建一个套接字。

    有没有更好的解决方案?

    3 回复  |  直到 14 年前
        1
  •  2
  •   A. Serediuk    7 年前
    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
  •  1
  •   rwat    14 年前

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

        3
  •  0
  •   Community kfsone    7 年前

    我不是百分之百确定,但我认为除了在播放之前临时保存解密文件外,您没有其他选择。

    This question 有点类似,但我不认为您使用此处建议的简单解决方案,因为您有一个加密文件。还提供了一个指向 Custom Audio Streaming with MediaPlayer ,但他们的解决方案似乎也使用临时文件。