Audio 逐步下载音频文件

Audio 逐步下载音频文件,audio,android-mediaplayer,progressive-download,Audio,Android Mediaplayer,Progressive Download,我想编写一个应用程序,通过标准的Androidmediaplayer从远程http源播放逐步下载的音频,但我也想将音频文件的副本保存到SD卡。事实证明,这是一个难题: 1) 我们将一个uri传递给媒体播放器,然后在播放过程中被“切断循环”,因为mediaplayer直接与远程设备通话,因此无法访问正在播放的字节 2) Android似乎没有将下载的数据写入磁盘的选项,也没有访问下载数据的回调 3) 虽然可以将Web服务器嵌入到我们的应用程序中(请参见nanohttpd),然后将localhost

我想编写一个应用程序,通过标准的Android
mediaplayer
从远程http源播放逐步下载的音频,但我也想将音频文件的副本保存到SD卡。事实证明,这是一个难题:

1) 我们将一个
uri
传递给媒体播放器,然后在播放过程中被“切断循环”,因为
mediaplayer
直接与远程设备通话,因此无法访问正在播放的字节

2) Android似乎没有将下载的数据写入磁盘的选项,也没有访问下载数据的回调

3) 虽然可以将Web服务器嵌入到我们的应用程序中(请参见
nanohttpd
),然后将
localhost
uri传递到
mediaplayer
,但这似乎是一个可怕的难题

我错过了更简单的方法吗?这一定是个解决了的问题


编辑:也许是一个更简单的问题:如果我的内存中有一个包含音乐的缓冲区,我可以播放它吗?我必须将它写入磁盘或使用web服务器让
mediaplayer
播放它,这似乎很可笑。

是的,有一种方法可以做到这一点。创建本地代理服务器并将MediaPlayer连接到该服务器。请参阅我的答案了解更多细节


编辑:在我的PC而不是手机上看了这个之后,我注意到你提到在你的应用程序中嵌入了一个服务器。如果操作得当,它将是轻量级和直观的。它将使您能够访问原始数据。我不认为这是一个“乱七八糟”的问题。

你必须在自己的应用程序中间加入人。。我认为这是一个胡扯。它还增加了延迟和复杂性。而且,出于安全考虑,它会在您的设备上打开一个任何人都可以从中吸取音乐的端口(这尤其令人担忧,因为代理将从其文档根解密加密文件,然后向mediaplayer提供纯文本音乐)。我很感激你的回答,戴夫,但我要看看能不能找到另一种方法。也许可以通过OpenSL ES的api。随你的便。但是1) 在我的经验中,使用NIO时,延迟可以忽略不计,甚至根本不存在。2) 我看不到安全问题,特别是因为你打算写世界可读SD卡。如果设计代理,则可以根据需要限制访问并提供安全介质。最后,考虑到可用的API,这只是一种变通方法。不过,我更关心的是视频,所以我还没有探讨OpenSL选项。我很想看看你有什么想法。祝你好运我会给SD写密文。您建议如何限制对代理的访问?(我知道一种方法,但我想听听你说这话时的想法。)首先我有另一个建议。根据您是否需要seek功能以及可能要使用的介质类型,您可以使用管道。您的客户机为管道(以及您想要的任何其他内容)提供数据,而媒体播放器的读取方式就好像它是一个文件一样。我只在我的硬件供应商的黑客播放器上测试过这个,但我敢打赌它也适用于标准的Android。我在DroidMediaPlayer文档中读到文件描述符必须是可查找的(他们特别警告不要使用管道)。也许你是对的,如果玩家不寻找管道,管道可能仍然有效,但我们的管道会寻找。不过,这是个聪明的主意!我只是希望我们可以扩展FileDescriptor,这一切都会很容易。。。但这是Java中的最后一个类。高斯林20年前破坏了我。。。好家伙。