APP下载

Android的音频延迟问题变得更糟了Android8系统音频架构带来的新问题Gabor(szantog)

消息来源:baojiabao.com 作者: 发布时间:2024-05-02

报价宝综合消息Android的音频延迟问题变得更糟了Android8系统音频架构带来的新问题Gabor(szantog)

  • 原文地址:Android Audio Latency Problem Just Got Worse,作者Gabor (@szantog)。
    本文介绍了Android 8系统带来的音频系统BUG导致的延迟问题。前文可参阅[Doc]Link=00006276[/Doc],文章内容不代表本站观点。

不,Android 8.0,告诉我这不是真的!

当坏消息发言人很不爽,但在Android 8.0下,安卓的10毫秒问题变得更为严重。你没看错:Android 8.0的音频延迟比Android 7.0更高了。如果你在为安卓平台开发以下类型的互动式音频程序集成,例如:AR/VR、语音助手、VOIP应用、语音会议应用、电子乐器、数字音频工具、卡拉OK等等,这些应用程序的性能将受到负面影响。

本文概要

我们的测试表明在Android 8.0下,当音频输入不是单声道时,音频回路的延迟性能比以前的Android版本显著变差。我们向谷歌的音频开发组分享了研究结果并更新了我们的延迟测试APP。数据和测试方法见下文。

*有趣*的是,某位Android音频开发组的推广部员工,公开表示我们的观点是错误的,认为Android 8.0的延迟并没有恶化——只要按照他的“妙招”——程序猿将录音从双声道改成单声道模式就没问题[因为这是谷歌在Android快速音频模式中的一个BUG]。

技术背景

在几周前,Android音频组的一个成员向我们告知,我们的Superpowered音频延迟测量APP在Android 8下出现工作异常。延迟测量步骤之间的误差太大,而且测试结果比谷歌自己的测量方式更高。现在有两款可以测量安卓音频回路延迟的应用。谷歌自己的“Rick"O"Rang APP”和Superpowered"s Latency Test,这两款应用均完全开源。它们的测试方式并不相同,但结果同场近似,实际上基本接近一致。

3.5mm的音频环回适配器流程图和样品

谷歌的Rick"O"Rang应用需要一个被称为音频环回适配器的特殊3.5mm插头并接上手机的耳机界面,使音频出现回路反馈噪音[拉尔森效应]。这个应用通过回路噪音的周期计算音频回路的延迟。应用还能测量“音频连续性”来检测故障。

Superpowered Latency Test应用则无需特殊硬件即可运行。它可通过手机内置麦克风和外放喇叭、USB声卡、回路器或其它音频设备。应用在音频通道输出一个特定信号,然后开始计时至音频输入通道接收到信号。 测试会重复10次以滤除测试误差和其它因素。

再次强调,两款APP的测试结果在过去是相似的,几乎完全一致,因此形成了相互制衡的作用,直到Android 8出现……通过在我们手上的Nexus 6P运行的应用中加入一些主要异常信息日志的显示,作为谷歌在音频延迟改进的部分,在Android 4.4和7之间的版本中,使用OpenSL ES音频API在应用端需要的输入和输出缓冲器只需要1[一个]。输入和输回调所填充或消耗的缓冲总是处于一个接一个的单列排队:

输入,输出,输入,输出,输入,输出……

但在Nexus 6P[Android 8.0下]表现得极为不同:

输入,输入,输入,输入,输出,输出,输出,输出,输入,输入,输入,输出,输出,输出,输出……

连续输入和输出的数量在3~5间波动,这种行为是意外和异常的。这实在是出乎意料,谷歌和Superpowered的延迟测试程序仅用了1个缓存器。 但一个缓存不足以覆盖5次工作,因此所有的测试变得不稳定和不准确。 由于音频IO在非单调调度中可能会出现连续输入,程序无法在下一次回调时对输入缓存做出响应,最终导致音频回路的延迟增加。

在Superpowered Latency Test修复之前,由于我们的应用出现了延迟值的波动,所有在安卓8上运行的用户都可以马上看到一些不对头,但谷歌的应用显示了良好、合理的而且更低的延迟值。虽然谷歌的故障测试表明有问题,但许多用户只是无视了这些。因为故障检测不像延迟测试那样“亦可赛艇”[是一个单独的功能]。故障的数量应该为零,但在运行Andorid 9的Nexus 6P上,每次测试都有两到三个。

我们已经修改了延迟测试程序使其能处理缓存的异常,最多到128个缓存区[非常高的数值],我们的实现方式并不是针对Andorid 8的。我们的目标是使其可以不经过任何调整而在每一个版本的安卓上运行。我们已经在多个设备上进行了详细的测试,以确保它仍然可以提供相同、可信的测试数值。

在过去几年里,我们的延迟测试应用已经收集了世界上最大的移动音频延迟数据库,在将近8000个不同的设备型号/系统版本中有超过320000个测试数据,所以我们有大量的数据来衡量基准。

谷歌会修正吗?

我们已经把这些发现发送到谷歌的Rick"O"Rang的app作者,在谷歌的app修正后我们会在本文更新[译者注:并没有]。

快速模式发生了什么?

低延迟音频效果的一个重要功能是所谓的“Android快速混音器”。如果一个程序选择快速音频路由[而且设备支持],音频的延迟就会好得多得多。在Android 8以前Nexus 6P高兴地完成了快速路径。但现在我们看到了:


OpenSL ES AAudio
音频输入 FLAG_FAST 成功, frameCount 192 FLAG_FAST 成功, frameCount 1536
音频输出 FLAG_FAST 拒绝, frameCount 1536 FLAG_FAST 拒绝, frameCount 1536

快速混音器被拒绝用于音频输入,仅能适用于AAudio模式下的音频输出,但帧数[译者注:并非显示中的帧率,音频子系统能处理的帧数是固定的,帧数越高会导致延迟越大]太高,相当于非快速模式下的帧数。值得注意的是,AAudio并没有通过独占模式中的“快速混音器”[我们正在用],而是直接与HAL对话。

Android 8.0没做好

当我们修复了延迟测量应用后,许多人会好奇,Android 8.0能有多大进步?呃,其实并没有改善,而是更糟了……


音频回路延迟[使用OpenSL ES] 内置麦克风和喇叭Android 7 内置麦克风和喇叭Android 8 性能提升百分比
Nexus 6P 33ms 68ms -106%
Pixel XL 29ms 60ms -107%


音频回路延迟[使用OpenSL ES] 回路器Android 7 回路器Android 8 性能提升百分比
Nexus 6P 17ms 60ms -253%
Pixel XL 16ms 40ms -250%

很明显,Android音频系统的内部发生了一些事情。

新的AAudio API

Android 8带来了新的API,AAudio,它比老旧的OpenSL ES界面更优秀。AAudio更容易理解,更容易使用而且生成的代码更为紧凑和精简。这个API的公告吹牛称Android 8的音频能力更加优秀。让我们看看它的实际能力如何:


音频回路延迟[Nexus 6P] OpenSL ESAndroid 8 AAudio,Android 8 OpenSL ESAndroid 7
内置麦克风和外放 68ms 60ms 33ms
回路器 60ms 40ms 17ms

在Nexus 6P上你可以在Android 7系统得到好得多的延迟表现,无论Android 8用什么音频API。

使用单声道!

在向谷歌告知这些测试的之后,他们提醒了我们一个关于谷歌的内部代码BUG,如果输入通道数量减少至1(单声道),那么快速标签就会在音频输入中可以通过,而且延迟得到改善:


音频回路延迟[Nexus 6P] OpenSL ES,Android 8单声道 AAudio,Android 8单声道 OpenSL ES,Android 7
内置麦克风和外放 36ms 38ms 33ms
回路器 20ms 21ms 17ms

重申一次:这个方法只有在单声道输入时有效。在Android 7下是没有效果的。

谷歌视图说服我们,单声道是一个很好的解决方案,但我们并不认同。一些应用中并没有单声道的选项[类似多声道录音或录像工具、DJ等],但更重要的是:你Y认真的???

AAudio和旧版Android?

如果你只使用AAudio库开发,应用在Android旧版本上会崩溃。目前还没有“官方”途径说明如何构建AAudio和旧版本安卓兼容应用的方法。

在Superpowered延迟测试应用中,我们展示了一种构建能与旧版Android兼容应用的方法,我们的方案还可以免于维护两个不同版本的本机库和代码库。简而言之,解决的方案是:虽然CMakeLists.txt将创建两个不同的库[一个有AAudio,一个没有],但两个库的源代码是相同的。

AAudio缓存大小警告

如果你使用AAudio开发,请时刻注意每一次音频回调的缓存大小是不一致的。在Nexus 6P上通常看起来会是这种序列:192,128,64,192。这对于音频开发者来说并不是未知数,然而对于常规的应用开发序猿而言则是非常惊人的意外。

Superpowered针对Android音频开发者的建议和调整

在技术背景章节中展示了Android 8下的OpenSL ES出现了一个严重的问题。我们的建议如下:

如果你已经在OpenSL ES写了“1缓存”在音频IO代码中,那你应当立即更新程序,因为Android 8下它会导致输出乱码音频,接收到的也是乱码音频。

如果你使用SuperpoweredAndroidAudioIO作为音频IO,那么你将是完全安全的,它有一个不受到这个问题影响的机制,会正常工作。

推迟AAudio使用,直到我们能看到它在非谷歌设备的Android 8系统上如何工作,以及谷歌如何解决Nexus 6P和Pixel XL的延迟问题。

截至2017年10月,SuperpoweredAndroidAudioIO不会支持AAudio,但我们会密切关注形势,如果得到了改善,我们就会加入支持。

SAPA乙烷

中断一下我们的公告,我们在Superpowered延迟测试应用已经移除了SAPA(三星专业音频SDK)的支持,因为它最新的更新也没有支持64位系统。

为了SAPA维护一套单独的32位代码库已经没有任何价值,实际上对于大多数开发商来说,这样做的代价太高了。SAPA曾经是三星试图解决安卓音频延迟问题的一个有趣实践,但不幸的是它从没有真正发布过,我们已经尽所能来长时间维持了。Vaya con Dios老伙计!

前进的道路依然不明晰

谷歌长期一直在试图满足专业音频开发商的需求,从2011年起每年都定期发布公告。Google Play的音乐类应用远远落后于App Store,没错,Google Play在音乐类相关收入普遍于苹果。但音乐类应用收入远远低于预期,Android音频的技术问题占了主要贡献。

我们大多数人都希望事情能逐步向前发展,有朝一日为Android创建专业音频应用也能和iOS一样变得非常有价值,我们想像中的发展指数曲线是这样的:

想像中的音频技术发展

或者说,大多数企业家都在思考:

  • “情况正变得越来越好,专业的安卓音频设备数量正在积累,对我而言在Android专业音频上做一些投入是有意义的,我在密切关注它能如何发展。”

然而我们得到的却是这个:

现实中的音频技术发展

Android 7.0.1在CPU调度中存在严重缺陷,使得高负载处理的音频应用会在后台模式下产生严重的音频丢失。现在我们得到了Android 8,又大幅增加了一些设备的音频延迟。这把我们带到了:

  • “情况总体上在好转,但发展道路上主要的槽点在阻止专业安卓音频设备的积累,这导致影响了我在Andorid专业音频做一些投入的价值。不幸的是,很多老Android设备并不会升级系统,在更新7.0.1或8.0来之前就已经停止更新或者被遗忘了。我在密切关注它能如何发展。”

我们将继续尽我们所能帮助谷歌,也将继续提供专业的音频工具,使专业Android音频项目成为可能。我们真挚希望能在将来某一天Android能与iOS的音频性能相匹配,为这个平台带来工具和几十亿美元的机遇。




2018-08-06 20:32:00

相关文章