Android 访问MediaPlayer中的音频缓冲区

Android 访问MediaPlayer中的音频缓冲区,android,audio,fft,android-mediaplayer,spectrum,Android,Audio,Fft,Android Mediaplayer,Spectrum,我正在从事Android项目,在这个项目中,我必须在频域中分析音频信号。事实上,我已经准备好了从设备麦克风读取信号并对其进行处理(FFT、可视化等)的模块,我对这种信号没有任何问题 现在我试图分析音频信号,它作为mp3文件存储在设备上。一般来说,从MediaPlayer对象播放它不会有任何问题。不幸的是,我在访问我的播放器播放的数据缓冲区时遇到了一些问题,我可以用它来计算频谱 你有什么建议我怎样才能访问音频缓冲区?MediaPlayer是否有可能,或者我是否应该使用其他方法解决此问题?据我所知,

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

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


你有什么建议我怎样才能访问音频缓冲区?MediaPlayer是否有可能,或者我是否应该使用其他方法解决此问题?

据我所知,无法使用
MediaPlayer直接访问缓冲区

但是,如果您使用的是API>=16(Android 4.1),则可以使用内置类将MP3文件解码为原始PCM流。您可以对数据进行分析,然后将其传送到
音轨
以输出数据。显示如何解码并发送到音频曲目的示例


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

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

第一种方法是在设备上编写一个简单的服务器,并将
MediaPlayer
连接到本地主机地址。您可以在将数据发送到
MediaPlayer
之前对其进行处理。这种方法的缺点是,您需要某种方法来将数据从mp3解码到PCM,这样才能普遍使用


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

谢谢您的建议。不幸的是,我必须支持API>=8(Android 2.2),所以我不能使用MediaCodec。我想让JLayer试一试。这在大多数硬件上都很好。嗨@Geobits,我回到了这个项目,实际上在使用JLayer和AudioTrack时遇到了一些问题。我在另一个问题中描述过:你有什么建议吗?