3

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

现在我正在尝试分析作为 mp3 文件存储在设备上的音频信号。一般来说,我从 MediaPlayer 对象播放它没有任何问题。不幸的是,我在访问我的播放器播放的数据缓冲区时遇到了一些问题,我可以用它来计算频谱。

您对我如何访问音频缓冲区有什么建议吗?MediaPlayer 是否有可能,或者我应该使用其他方法来解决这个问题?

4

2 回答 2

4

据我所知,没有办法直接使用MediaPlayer.

但是,如果您使用 API >= 16 (Android 4.1),您可以使用内置MediaCodec类将 MP3 文件解码为原始 PCM 流。您可以对数据执行分析,然后将其传递给 anAudioTrack以输出。这篇博文展示了如何解码和发送到音轨的示例。

如果您必须支持较低的 API 级别,则可以以相同的方式使用 3rd 方库。我过去使用过JLayer,但它的性能高度依赖于硬件。在某些低端设备上,您将无法实时解码。

于 2013-12-16T19:10:31.527 回答
0

通用假日名称的答案是正确的,无法访问 的缓冲区MediaPlayer,但还有其他选项不需要 3rd 方库。为了完整起见,我提到这些,因为前面提到的 JLayer 库可能是更简单的解决方案。

首先是在设备上编写一个简单的服务器并将其连接MediaPlayer到本地主机地址。您可以在将数据发送到MediaPlayer. 这种方法的缺点是您需要一些方法来将数据从 mp3 解码为 PCM 才能普遍使用。

第二种选择是使用本机代码和 OpenSL,尽管对它的支持只能追溯到 API 9。构建一个简单的播放器相对简单,您可以轻松地直接访问 PCM 数据。

于 2013-12-17T02:45:01.637 回答