前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何保证Android音频低延迟

如何保证Android音频低延迟

作者头像
阿利民
发布2022-05-16 13:04:02
1.9K0
发布2022-05-16 13:04:02
举报
文章被收录于专栏:阿利民阿利民

为了更好的理解Android音频延迟产生的原因,最好将总的环路延迟分为以下两个部分:

  • 应用延迟。Android开发者有很多能够降低延迟的方法,后面会逐步介绍
  • 系统延迟。这部分开发者无能为力,但是OEM可以。

应用延迟

这包括Andorid应用本身、应用程序框架以及第三方或原生API,如OpenSL ES。为了降低延迟,Android开发者应该谨记以下原则:

  1. 不要使用Java代码处理音频,应该尽可能使用C/C++实现。
  2. 使用JNI接口实现Java和原生代码之间的通讯。
  3. 不要依赖Android提供的音频能力,因为Android音频功能实现极不稳定、也无法预测,这取决于不同的设备实现。
  4. CPU调度错误会导致音频数据丢失,所以应该想办法保证音频线程的调度优先级。
  5. 不同的音频链路有不同延迟时间,比如内建麦克风、耳麦、蓝牙耳机之间的延迟都是不一样的,需要针对这些场景进行不同的处理。
  6. 使用蓝牙耳机至少增加100毫秒的延迟。

必要的处理

最大限度缩短输入延迟时间

本部分的建议有助于您在使用内置麦克风或外部耳机麦克风录音时缩短音频输入延迟时间。

  • 你的应用应该尽可能让用户使用耳机(例如,第一次运行时在屏幕上显示“建议使用头戴式耳机”)。仅使用耳机无法保证实现尽可能最短的延迟,你还需要保证音频链路上不存在任何不需要的信号处理操作(例如,在录音时使用VOICE_RECOGNITION预设值)。
  • 使用系统原生的采样率,通常是44.1k或48k,当然也有其他情况,但是较少。可以通过下面方法获取原生采样率:
代码语言:javascript
复制
AudioManager#PROPERTY_OUTPUT_SAMPLE_RATE
  • 使用系统原生的缓冲区大小,通常是96、128、160、192、240、256 或 512。可以通过下面方法获取:
代码语言:javascript
复制
AudioManager#PROPERTY_OUTPUT_FRAMES_PER_BUFFER

验证应用是否使用低延迟音轨

  1. 启动应用,然后运行下列命令:
代码语言:javascript
复制
adb shell ps | grep your_app_name
  1. 记下应用的进程 ID。
  2. 现在,从应用中播放一些音频。您大约有三秒钟的时间可以从终端运行下列命令:
代码语言:javascript
复制
adb shell dumpsys media.audio_flinger
  1. 扫描进程 ID。如果您在“Name”列看到“F”,表示它在低延迟音轨上(F 代表快速音轨)。

最大限度缩短预热延迟时间

第一次将音频数据加入队列时,设备音频电路需要少量但仍不短的一段时间来预热。为了避免这种预热延迟,可以将无声音频数据的缓冲区加入队列,这能够有效的提升音频性能。

系统延迟

Android系统是所有驱动程序所在的地方,这些不能由应用程序开发人员直接修改。

对于系统中延迟的根本原因,存在许多误解。它们通常被认为与硬件相关、Linux 音频相关或 ALSA 驱动程序相关。

其中一大原因在于ALSA和AudioFlinger的通信方式。具体来说AudioFlinger将音频缓冲区“推送”到 ALSA。“推送”会导致调度问题,从而无法保证音频质量。所有专业音频、低延迟系统都使用“拉”机制。

开发者能做什么?

不可否认的是,在系统层面的东西开发者确实很被动。虽然开发人员不能直接影响 Android 音频延迟,但他们可以游说 OEM 和设备制造商降低音频延迟,或者跟他们合作,以使用他们的内部API,这些API能够提供优秀的音频延迟性能,比如华米OV跟一些大公司有相关合作。

-- END --

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿利民 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档