首页 文章

Android - 直接从输入流播放mp3而无需写入临时文件

提问于
浏览
6

我正在创建一个输入流来缓冲和流式传输来自 Cloud 的mp3 .

URL url = new URL("http://xxxx.yyy.com/Demo.mp3");

InputStream inputStream = url.openStream();

现在我如何从媒体播放器播放mp3而不使用临时文件来存储它并从同一回读?我正在为Android Lollipop开发

3 回答

  • 1

    我很确定MediaPlayer可以处理远程URL . 看一下this的例子 . 检查 MediaPlayer 类中的setDataSource方法 .

    编辑:既然你真的想要使用输入流,我认为你需要进入低级别 . 检查AudioTrack课程 . 这个SO answer可能有所帮助 . 还有一些可能相关的问题herehere .

  • 1

    即使在今天这个问题仍然存在!检查这些链接https://code.google.com/p/android/issues/detail?id=29870

    http://www.piterwilson.com/blog/2014/03/11/android-mediaplayer-not-quite-there-yet/ . 绝对没有办法访问和控制MediaPlayer缓冲区,也不能将存储在字节数组中的缓冲的mp3内容作为参数播放到MediaPplayer中 . 所以人们要么将mp3缓冲区转换为PCM并使用AudioTrack来播放它,要么将输入流的字节数组写入本地套接字,并使用套接字文件描述符回读Mediaplayer,如下面提到的链接Audio stream buffering

  • 0

    我用来直接将二进制数据提供给 MediaPlayer 的解决方案是使用ParcelFileDescriptor#createPipe()(API级别9)和MediaPlayer#setDataSource(java.io.FileDescriptor) .

    这是示例代码(未经测试):

    ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
    FileDescriptor fd = pipe[0].getFileDescriptor();
    mediaPlayer.setDataSource(fd);
    OutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]);
    

    从这一点开始, MediaPlayer 将接收您在输出流中写入的任何内容 . 这是非常快的,因为它使用内核FIFO来传输数据(没有套接字,没有TCP),据我所知,完全在RAM中(没有使用实际文件) .

相关问题