【问题标题】:Android - Playing mp3 directly from the input stream without writing into temp filesAndroid - 直接从输入流播放 mp3 而无需写入临时文件
【发布时间】:2015-02-19 10:07:50
【问题描述】:

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

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

InputStream inputStream = url.openStream();

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

【问题讨论】:

标签: android android-mediaplayer


【解决方案1】:

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

编辑:由于您真的很想使用输入流,我认为您需要使用低级。检查AudioTrack 类。这个SO answer 可能会有所帮助。还有几个问题herehere 可能是相关的。

【讨论】:

  • 我不想那样做。 MediaPlayer 不允许我管理或访问缓冲内容。我需要操作缓冲的内容,所以我想反过来做,自己流式传输 mp3,缓冲它,然后将其提供给 MediaPlayer。但是如果不将此缓冲区写入临时文件并从它们读取以使用 MediaPlayer 播放它,我找不到直接的方法!这就是我想要实现的..
【解决方案2】:

这个问题直到今天依然存在!!!检查这些链接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

【讨论】:

  • 我还没有看到任何人使用 'inputstream -> 套接字文件描述符' 方法获得成功,MediaPlayer 的 setDataSource(fd) 的 Android 文档说:“FileDescriptor 必须是可搜索的(注意,LocalSocket 是不可搜索)。“如果有错误,请纠正我,因为我使用的是令人讨厌的本地 http 服务器解决方案。
【解决方案3】:

我用来将二进制数据直接提供给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 中(没有使用实际文件)。

【讨论】:

  • 我无法让它工作,你有这种方法的工作示例吗?
猜你喜欢
  • 2013-12-28
  • 2012-11-12
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多