gpt4 book ai didi

android - Android 上的 MP3 解码

转载 作者:IT老高 更新时间:2023-10-28 21:56:33 24 4
gpt4 key购买 nike

我们正在为 Android 手机实现一个程序,该程序可以播放来自互联网的音频流。以下是我们的大致做法:

  1. 下载自定义加密格式。
  2. 解密以获得常规 MP3 数据 block 。
  3. 将 MP3 数据解码为内存缓冲区中的原始 PCM 数据。
  4. 将原始 PCM 数据通过管道传输到 AudioTrack

到目前为止,我们的目标设备是 Droid 和 Nexus One。在 Nexus One 上一切正常,但在 Droid 上 MP3 解码太慢了。如果我们将 Droid 置于负载下,音频播放就会开始跳过。我们不允许将 MP3 数据解码到 SD 卡,但我知道这不是我们的问题。

我们没有编写自己的 MP3 解码器,而是使用了 MPADEC (http://sourceforge.net/projects/mpadec/)。它是免费的,并且很容易与我们的程序集成。我们用 NDK 编译它。

在使用各种分析工具进行详尽分析后,我们确信是这个解码器落后了。

以下是我们正在考虑的选项:

  1. 找到另一个我们可以使用 Android NDK 编译的 MP3 解码器。此 MP3 解码器必须进行优化以在移动 ARM 设备上运行,或者可能使用仅整数数学或其他一些优化来提高性能。

  2. 由于内置的​​ Android MediaPlayer 服务将获取 URL,我们或许可以在我们的程序中实现一个小型 HTTP 服务器,并为 MediaPlayer 提供解密的 MP3。这样我们就可以利用内置的 MP3 解码器。

  3. 通过 NDK 访问内置 MP3 解码器。我不知道这是否可能。

有人对我们可以做些什么来加快 MP3 解码有任何建议吗?

--罗伯斯

最佳答案

执行此操作的正确方法是构建您自己的固件并作为自定义 OpenCORE 编解码器的一部分进行解密。当然,这会将您限制在可以安装该固件的设备上。

请记住,剩下的部分是推测性的。我实际上需要做一些类似于你所描述的事情,但我没有时间留出几个月来解决这个问题。所以,我将以我如何解决问题的方式来描述这一点。

一种解决方案是 twk 的答案中描述的解决方案。您不必使用 SD 卡,但您可能必须在应用程序本地文件存储 (getFilesDir()) 中有一个全局可读的临时文件。下载第一个 block ,解密,将它写成一个完整的世界可读的 MP3 文件(但有一个适当模糊的目录/路径),然后通过 setDataSource() 将它交给 MediaPlayer 。在播放时,您下载/解密并设置第二个 MediaPlayer 实例,该实例会在第一个实例结束后立即开始播放,以实现尽可能无缝的过渡。然后您重置第一个 MediaPlayer 并将其与您的第三个 block 重用,在两者之间进行乒乓球。

jleedev 的评论中有一个相关的解决方案。除了您通过 ContentProvider 提供 FileDescriptor 之外,几乎相同。这有一个选项让您使用套接字,可能让您避免临时文件。但是,ContentProvider 本身必须是可公开访问的,因此临时文件具有不明显的目录,实际上可能更私密。

如果您担心这些东西可以被其他进程读取,请理解 MediaPlayer 本身(或者更确切地说,OpenCORE 子系统)在另一个进程中。此外,您建议的 HTTP 服务器在设备上也是全局可读的。因此,如果您打算让 MediaPlayer 进行解码,那么通过隐匿来确保安全是您唯一可行的选择。

AFAIK,NDK 不授予对 OpenCORE 的访问权限,尽管我承认 NDK 经验有限,所以我可能错了。当然还有其他可用的 MP3 解码器(ffmpeg/mplayer 等),不过这些转换成 NDK 库的难易程度尚不清楚。

因此,这真的归结为您要防御的对象。如果你想保护用户,你可能不得不自己解码,不知何故。

关于android - Android 上的 MP3 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com