我们正在为 Android 手机实现一个程序,用于播放来自互联网的音频流。我们所做的大约如下:
- 下载自定义加密格式。
- 解密以获取常规 MP3 数据块。
- 将 MP3 数据解码为内存缓冲区中的原始 PCM 数据。
- 将原始 PCM 数据传送到 AudioTrack
到目前为止,我们的目标设备是 Droid 和 Nexus One。在 Nexus One 上一切正常,但在 Droid 上 MP3 解码速度太慢。如果我们将 Droid 置于负载状态,音频播放就会开始跳过。我们不被允许将 MP3 数据解码到 SD 卡,但我知道这不是我们的问题。
我们没有编写自己的MP3解码器,而是使用了MPADEC(http://sourceforge.net/projects/mpadec/ http://sourceforge.net/projects/mpadec/)。它是免费的,并且很容易与我们的程序集成。我们使用 NDK 编译它。
在使用各种分析工具进行详尽的分析后,我们确信正是这个解码器落后了。
以下是我们正在考虑的选项:
找到另一个可以使用 Android NDK 编译的 MP3 解码器。该 MP3 解码器必须经过优化才能在移动 ARM 设备上运行,或者可能使用纯整数数学或其他一些优化来提高性能。
由于内置的 Android MediaPlayer 服务将获取 URL,因此我们可以在程序中实现一个小型 HTTP 服务器,并为 MediaPlayer 提供解密的 MP3。这样我们就可以利用内置的 MP3 解码器。
通过 NDK 访问内置 MP3 解码器。我不知道这是否可能。
有人对我们可以采取哪些措施来加快 MP3 解码速度有任何建议吗?
--
罗布·史兹
正确的方法是构建您自己的固件并作为自定义 OpenCORE 编解码器的一部分进行解密。当然,这将限制您只能安装该固件的设备。
请记住,其余部分都有些推测性。我实际上需要做一些类似于你所描述的事情,但我没有几个月的时间来解决这个问题。因此,我将以我处理问题的方式来描述这一点。
一种解决方案是 twk 的答案中描述的解决方案。您不必使用 SD 卡,但您可能必须在应用程序本地文件存储中拥有一个世界可读的临时文件(getFilesDir()
)。下载第一个块,解密它,将其写为一个完整的世界可读的 MP3 文件(但具有适当模糊的目录/路径),然后将其交给MediaPlayer
via setDataSource()
。当播放时,您下载/解密并设置第二个MediaPlayer
例如,第一个结束后立即开始播放,以实现尽可能无缝的过渡。然后你重置第一个MediaPlayer
并将其与第三个块一起重复使用,在两个块之间进行乒乓球运动。
相关的解决方案将在 jleedev 的评论中。这几乎是一样的事情,除了你提供了一个FileDescriptor
via a ContentProvider
。它有一个选项可以让你使用套接字,may让您避免临时文件。但是,那ContentProvider
其本身必须是可公开访问的,因此具有模糊目录的临时文件实际上可能更加私密。
如果您担心这些东西可以被其他进程读取,请理解MediaPlayer
它本身(或者更确切地说,OpenCORE 子系统)处于另一个进程中。此外,您建议的 HTTP 服务器在设备上也是可读的。因此,如果您想让MediaPlayer
进行解码。
AFAIK,NDK 不授予对 OpenCORE 的访问权限,尽管我承认我的 NDK 经验有限,所以我可能是错的。当然还有其他可用的 MP3 解码器(ffmpeg
/mplayer
等),但如何将它们转换为 NDK 库尚不清楚。
所以,这实际上取决于你要防守的对象。如果您试图防御用户,您可能必须以某种方式自己对其进行解码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)