安卓上MP3解码速度慢

3
我一直在从这个 tutorial 开始研究 Android 上的 MP3 解码。但是在我的情况下,对于4分30秒的歌曲来说,解码需要超过1分钟的时间,这完全不能接受。我一直在尝试找出问题所在,并寻找提高速度的方法。我已经在互联网上搜索了几天,但由于资源很有限,仍然无法找出原因。我认为我完全陷入了困境,因为无法从研究中得到任何东西。
有人可以指出在 Android 中处理 MP3 文件的任何信息吗?我正在使用 Libmad 解码 MP3 文件,并使用 NDK 将其移植到 Android 上。也许有人可以指出 MP3 解码的任何替代方案。我非常感谢关于此的任何信息,非常感谢。

我是Android的新手,正在开发一个应用程序,需要将多个mp3文件拼接在一起。你能帮我解码两个或更多的mp3文件并编码成一个文件吗?我已经搜索了很多,但没有找到有用的信息。你说过你在Android上完成了mp3编码和解码。你能分享一下代码片段吗?这将是一个巨大的帮助。谢谢。 - Harsh
1个回答

1

你所寻找的答案已经在教程页面上了。

正如他在文章中解释的那样,所需时间似乎很正常:

我用工具乐队的歌曲“Schism”进行了测试,这首歌长达6分47秒,编码为192kbps。文件大小为9.31mb,对于mp3来说相当大...没有任何优化(拇指代码,-O0,-DFPM_DEFAULT ==标准固定点数学在libmad中,没有arm汇编优化fp数学),在我的Milestone上解码完整文件需要184秒。

然后他解释了如何进行优化。你应该按照同样的步骤进行:

天哪,蝙蝠侠!如果我消除buffer.get(samples)调用,那么时间就缩短到了44秒!太不可思议了。现在我仍然认为这太慢了,所以我开始添加优化。我做的第一件事是编译成直接的arm代码,而不是拇指代码。你可以通过将以下内容放入Android.mk文件中告诉NDK工具链这样做:

LOCAL_ARM_MODE := arm

启用此功能后解码需要36秒。接下来我通过-O3作为CFLAG进行了激进的优化。只节省了2秒,所以没什么好写的。最后一个优化是针对libmad的特定优化。我上面链接的config.h文件没有定义libmad应该使用的固定点数学模式。现在,当您查看libmad的fixed.h时,可以看到许多用于固定点数学的选项。还有一个专门针对arm处理器的选项,它使用一些漂亮的arm汇编代码来处理重量级工作。您可以通过将-DFPM_ARM作为CFLAG传递来启用此选项。这真是太神奇了!现在,对于解码407秒的mp3编码音频,我只需要20秒。这大约是实时的20倍,这对我来说完全可以接受。我选择的歌曲是我下一个音频游戏项目中要处理的歌曲长度谱系的极端端点。用户使用的歌曲将被处理一次,等待那20秒对我来说没问题。

“我恐怕不会公开移植音频框架的源代码”,因为它有点混乱,需要一些整理工作。

评论区里很多人抱怨这个库,并表示他们放弃了它,转而使用libmpg123


我实际上跟随他所做的一切,但没有任何改变。因为网络上没有其他参考资料,所以这个教程是我的唯一来源,我跟随了所有步骤。我甚至使用比他更快的Android设备,因此在我的机器上解码技术上应该更快。 - Steven Pongidin
额外说明,他的案例和我的略有不同。他的案例似乎是独立的音频应用程序,而我的则是应用程序内的子应用程序。我不确定这是否会影响我的处理速度。 - Steven Pongidin
1
也许你可以尝试增加缓冲区大小并检查是否有所改善。 - Caner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接