我在Android项目中工作,在这个项目中我必须在频域中分析音频信号。实际上我有准备好的模块,从设备麦克风读取信号,并处理它(快速傅立叶变换,可视化等)我对这种信号没有任何问题。
现在我正在尝试分析音频信号,它以mp3文件的形式存储在设备上。一般来说,我在MediaPlayer对象中播放它不会有任何问题。不幸的是,我在访问我的播放器播放的数据缓冲区时遇到了一些问题,我可以用它来进行频谱计算。
你有什么建议吗?怎样才能访问音频缓冲区?有没有可能使用MediaPlayer,或者我应该使用其他方法来解决这个问题?
发布于 2013-12-17 03:10:32
据我所知,没有办法使用MediaPlayer直接访问缓冲区。
但是,如果您使用的是APIPCM16(Android4.1),则可以使用内置的MediaCodec类将MP3文件解码为原始的>=流。您可以对数据执行分析,然后将其传递给AudioTrack进行输出。This blog post展示了如何解码和发送到音轨的示例。
如果您必须支持较低的API级别,则可以以相同的方式使用第三方库。我过去使用过JLayer,但它的性能高度依赖于硬件。在一些低端设备上,你将无法实时解码。
发布于 2013-12-17 10:45:02
Generic Holiday Name的答案是正确的,没有办法访问MediaPlayer的缓冲区,但还有其他不需要第三方库的选项。我提到这些是为了完整性,因为前面提到的JLayer库可能是更简单的解决方案。
第一种方法是在设备上编写一个简单的服务器,并将MediaPlayer连接到本地主机地址。您可以在将数据发送到MediaPlayer之前对其进行处理。这种方法的缺点是,您需要某种方法将数据从mp3解码到PCM,以使其具有通用性。
第二种选择是使用原生代码和OpenSL,尽管对它的支持只能追溯到API9。构建一个简单的播放器相对简单,您可以轻松地直接访问PCM数据。
https://stackoverflow.com/questions/20618667
复制相似问题