gpt4 book ai didi

android - onPeriodicNotification() 在*一些*设备上有抖动

转载 作者:行者123 更新时间:2023-11-29 14:08:18 25 4
gpt4 key购买 nike

为什么 onPeriodicNotification() 的行为如此不稳定?

背景
我正在开发适用于 Android 的音频可视化工具,它使用 AudioRecord.read()(16 位单声道)从麦克风中采样。我已经对 setPositionNotificationPeriod() 的采样率和帧周期进行了大量测试。最后,我决定:
采样率:8000
帧周期:采样率 * 41/1000 = 328
缓冲区大小: 5 * 采样率

我选择的帧周期为 41 毫秒,因为我希望我的可视化工具每秒约 24 帧。

起初我认为以这种速度绘制到 Canvas 上会是个问题,但在 DroidX 和 Nexus One 上进行测试后,我获得了惊人的性能。我可以将这些设备上的延迟降低到 20 毫秒而不会出现缓冲区溢出,但我没有必要这样做。

一旦我开始在 Galaxy S 和 Nexus S 上进行测试,我的性能就下降了。这看起来很奇怪,因为 Nexus S 在很大程度上优于这两种设备。在排除绘图和计算问题后,我将定时调用放在 onPeriodicNotification() 中。我能够确认问题是由于此回调以任意时间间隔调用而导致的,我不明白为什么。

创建公平基准
作为一个公平的测试,我将我所有的音频处理和绘制都从循环中取出,这样我的应用程序所做的就是在循环中读取音频并在 onPeriodicNotification() 中记录数据。我将帧周期设置为 100 毫秒并使用了以下计时代码:

currentTime = SystemClock.elapsedRealtime();
Log.v(TAG, "time since last record update: " + (currentTime - lastTime));
lastTime = currentTime;

最后,我在每台设备上采样了 5 分钟的数据。在 DroidX 上,我得到了我所期望的:
# 积分: 3008
最小值: 92
最大值: 105
平均: 100
标准差:6.64

这似乎是合理的,我愿意忍受这一点。在 Galaxy S 上,我得到这个:
# 积分: 3004
最小值: 0!
最大值: 274
平均: 100.05
StdDev: 126.30?!?

StdDev 为 126,这意味着后续的一组计时调用通常看起来像这样 [253, 0, 1, 258, 1, 0, 263]。

结论和其他杂项数据
在执行这些测试时,我一直在关注 CPU 使用情况。我的进程徘徊在 2-3% 的 CPU 使用率上,有大量的开销需要处理。我注意到,如果我将通知之间的延迟增加到 250 毫秒左右,Galaxy S 就会开始像我预期的那样运行(stddev 下降到 6-7 左右)。不幸的是,250 毫秒远不是音频可视化的可用延迟。

在输入所有这些之后,我不禁觉得这更适合一些错误报告,但话又说回来,我们正在谈论的是三星,我们知道他们有 no internet android bug reporting presence :(

非常感谢备选方案、见解和经验。

最佳答案

最终这似乎归结为音频驱动程序。我发现三星的音频实现导致难以置信的高延迟,而摩托罗拉、HTC 和其他公司的延迟足够低,我没有注意到。

低延迟音频已在 bug list 上很长一段时间,所以也许这并不奇怪。如果您正在进行实时音频可视化,请准备好对三星设备感到失望:(

关于android - onPeriodicNotification() 在*一些*设备上有抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5400239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com