【问题标题】:Access to audio buffer in MediaPlayer访问 MediaPlayer 中的音频缓冲区
【发布时间】:2013-12-16 18:58:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: android audio fft android-mediaplayer spectrum


    【解决方案1】:

    据我所知,没有办法使用MediaPlayer 直接访问缓冲区。

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

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

    【讨论】:

    • 感谢您的建议。不幸的是,我必须支持 API >= 8 (Android 2.2),所以我不能使用 MediaCodec。
    • 我会说给 JLayer 一个机会。在大多数硬件上都可以。
    • 嗨@Geobits,我回到这个项目,实际上有一些与使用JLayer 和AudioTrack 有关的问题。我已经在其他问题中描述过:stackoverflow.com/questions/21801644/…你有什么建议吗?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多