适用于 Android 的低延迟音频 API?

Posted

技术标签:

【中文标题】适用于 Android 的低延迟音频 API?【英文标题】:Low latency audio api for Android? 【发布时间】:2009-09-19 14:19:34 【问题描述】:

我有哪些选择可以在 android 设备上以最少的延迟同时播放音频?我是否会从罐装 SDK 中得到任何半体面的东西,还是要求太多?文档声称 SoundPool 类能够以相对较好的性能同时播放多个声音,但是在模拟器和物理设备上运行一些测试后,它似乎很弱。它可能有一个技巧,还是我必须为这种事情去一个低得多的API?我尝试使用加载多个样本的单个声音池,并且尝试了多个声音池,每个声音池管理一个样本。我正在预加载所有内容,因此当我尝试播放时,除了调用 SoundPool.play() 之外,我没有执行其他代码。

【问题讨论】:

【参考方案1】:

许多人对 Andriod 上的低延迟音频感兴趣。以下是我关注的主题:

wave 涵盖今年 I/O 会议的音频相关主题。 关于在 NDK 中支持低延迟音频的 Android issue。

post 表明 Android 设备具有 ALSA 驱动程序(能够提供低延迟音频)——但似乎低延迟功能并未通过 NDK 暴露给应用程序。

我对 Android 没有直接经验,但据我所知,低延迟(小于

【讨论】:

【参考方案2】:

Android 2.3 现在支持对低延迟应用程序的音频 API(通过 OpenSL)进行本机访问。

但是,并非所有硬件设备都具有低延迟音频功能配置文件。因此,需要低延迟音频的应用程序应该通过在清单中指定以下内容来过滤 Android 市场中不支持它的设备:

<uses-feature android:name="android.hardware.audio.low_latency"/>

【讨论】:

我现在有一部 2.2 和 1Ghz CPU 的手机,我已经看到一堆应用程序做得不错。在做了一些研究之后,我很确定他们正在从音频文件中解码 PCM 数据并将其直接写入 AudioTrack,这对于基本的音频音序器/播放器来说已经足够低了 @Rich:我尝试过使用 2.2 和 1GHz 手机,Audiotrack 在 8kHz 单声道中给我的最小缓冲区大小是 1400。那是 175 毫秒。对于我想要的功能,这太慢了。 这是一种营销噱头——让人们认为这是“跟上苹果的步伐”。它应该被称为“中等延迟”。我认为没有太多用例可以从 50 毫秒延迟中受益。它对于正确的音频响应来说太慢了,而且对其他任何东西都是不必要的要求。 如果是噱头,那就不是很成功。直到最近,还没有任何设备支持该功能。【参考方案3】:

我没有任何 Android 经验,但我为 Windows Mobile 写过类似的东西。这些设备本身当然能够以低延迟(低于 25 毫秒)实时混合多个声音,尽管“多个”我的意思可能是 4 或 5 个(而不是 30 到 40 个)。但是,我只能通过编写自己的代码在内部进行混合并访问低级音频播放 API 来播放最终混合输出,从而令人满意地实现这一点。在 .Net Compact Framework 中播放声音的高级方法理论上可以进行复音,但实际上它们的效果很糟糕(很多故障、卡顿和失真)。

我怀疑Android音频SDK也有同样的问题,所以你可能得自己写。

【讨论】:

我愿意尝试您在此处建议的低延迟音频录制/播放。但我认为我需要比当前答案更多的方向。您能否详细描述一下您为 WinPhone 所做的工作?【参考方案4】:

请看我对Android: sound API (deterministic, low latency)的回复。

Android 设备的延迟较少取决于 API,而更多地取决于该特定设备的硬件和驱动程序。启用低延迟播放会消耗更多功率并增加音频故障的可能性,因此许多 OEM 会有意扩大其播放缓冲区。

【讨论】:

以上是关于适用于 Android 的低延迟音频 API?的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 的 Adob​​e 原生扩展以播放声音

音频无法在适用于 iOS 的 Corona SDK 上运行

通过 Youtube live API 的低延迟广播选项

是否可以直接从 OpenSL ES(适用于 Android)中的音频资产获取字节缓冲区?

我正在使用适用于 Agora.io 的 Android SDK 并尝试实现实时音频广播。出现错误

适用于所有 API 级别的 Android 剪贴板代码