MediaPlayer中访问音频缓冲区

3

我正在从事一个Android项目,其中必须在频域中分析音频信号。实际上,我有一个准备好的模块,它可以从设备麦克风读取信号并进行处理(FFT、可视化等),这种类型的信号我没有任何问题。

现在,我正在尝试分析存储在设备上的mp3文件的音频信号。通常情况下,我播放MediaPlayer对象中的音频时没有任何问题。不幸的是,我在获取由我的播放器播放的数据缓冲区方面遇到了一些问题,我需要用到它来进行频谱计算。

您有什么建议可以让我获得对音频缓冲区的访问吗?使用MediaPlayer是否可能,还是应该采用其他方法解决这个问题?

2个回答

4
据我所知,无法直接使用 MediaPlayer 访问缓冲区。
但是,如果您使用的是 API >= 16 (Android 4.1),则可以使用内置的MediaCodec类将MP3文件解码为原始PCM流。您可以对数据执行分析,然后将其传递给 AudioTrack 输出。此博客文章展示了如何解码并发送到音频轨道的示例。
如果必须支持较低的API级别,则可以以相同的方式使用第三方库。我过去使用过JLayer,但其性能高度依赖于硬件。在某些低端设备上,您将无法实时解码。

谢谢您的建议。不幸的是,我必须支持API >= 8(Android 2.2),所以我不能使用MediaCodec。 - Gie
我会建议试试JLayer。它在大多数硬件上都很好用。 - Geobits
嗨@Geobits,我回到这个项目中,实际上遇到了一些与使用JLayer和AudioTrack有关的问题。我已经在另一个问题中描述了它:http://stackoverflow.com/questions/21801644/use-audiotrack-with-jlayer-decoder 你有什么建议吗? - Gie

0

Generic Holiday Name的答案是正确的,即无法访问MediaPlayer的缓冲区,但还有其他选项不需要第三方库。我提到这些是为了完整性的缘故,因为前面提到的JLayer库可能是更简单的解决方案。

第一种方法是在设备上编写一个简单的服务器,并将MediaPlayer连接到本地主机地址。您可以在发送数据到MediaPlayer之前处理数据。这种方法的缺点是您需要某种方式将数据从mp3解码为PCM以便于通用使用。

第二个选择是使用本地代码和OpenSL,尽管对它的支持仅限于API 9及以上版本。构建一个简单的播放器相对简单,您可以轻松获得对PCM数据的直接访问。


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