我正在创建一个输入流来缓冲和流式传输来自云端的mp3。
URL url = new URL("http://xxxx.yyy.com/Demo.mp3");
InputStream inputStream = url.openStream();
现在我如何在不使用临时文件来存储它并从中回读的情况下从媒体播放器播放mp3?我正在开发Android Lollipop
答案 0 :(得分:1)
我非常确定MediaPlayer可以处理远程网址。看看this示例。同时查看MediaPlayer
课程中的setDataSource
方法。
答案 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中(没有使用实际文件)。