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

时间:2015-02-19 10:07:50

标签: android android-mediaplayer

我正在创建一个输入流来缓冲和流式传输来自云端的mp3。

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

InputStream inputStream = url.openStream();

现在我如何在不使用临时文件来存储它并从中回读的情况下从媒体播放器播放mp3?我正在开发Android Lollipop

3 个答案:

答案 0 :(得分:1)

我非常确定MediaPlayer可以处理远程网址。看看this示例。同时查看MediaPlayer课程中的setDataSource方法。

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

答案 1 :(得分: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所述

答案 2 :(得分: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中(没有使用实际文件)。

相关问题