在屏幕锁定/唤醒期间体验Android音频卡顿

时间:2014-03-17 15:30:55

标签: android audio opensl

我正在研发以音频播放为中心的Android应用,并且我遇到了一些我怀疑可能是某些设备,操作系统版本或本机缓冲区固有的不稳定行为(音频卡顿和打嗝)设备的大小。

关于我的实现 - 我需要低延迟,因此我在OpenSL ES回调中处理我的音频,并使用128个样本的相当小的缓冲区大小来排队缓冲区。我在回调期间进行mp3解码,但是在我的环形缓冲区大小的情况下,我不需要在每个回调周期内进行解码。

我使用远程测试服务来衡量各种设备和操作系统版本的音频播放质量,以及我发现的一些不一致的例子。

  • 三星Galaxy S4 w / Android 4.4 - 没有音频播放问题
  • Samsung Galaxy S4 w / Android 4.3 - 用户在锁定/取消锁定设备时遇到音频辍学/断断续续现象
  • 三星Galaxy Note 2 w / Android 4.1.2 - 没有问题
  • 三星Galaxy Note 2 w / Android 4.3 - 播放期间的音频丢失和锁定/解锁屏幕时的断断续续。

就个人而言,我有一个带有4.1.2的Galaxy S3和带有4.4的Nexus 5,并且没有遇到过这些问题。我也有一些较旧的2.3.7设备,这些问题没有发生(2010 Droid Incredible,LG Optimus Elite)。

我相信我不会过度使用处理器,因为我可以在较旧的Gingerbread设备上运行它。

我的问题:

  1. 如果我将基本SDK提升到4.2,我可以从硬件中检测本机缓冲区大小,并在缓冲区队列回调期间使用其中的一些。如果口吃和辍学有问题,特别是在屏幕锁定期间,这会产生很大的不同吗?
  2. Android 4.3中是否存在已知的错误,其中音频播放受到影响, 尤其是在屏幕锁定操作期间这可能只是一个三星问题吗?
  3. 是否有其他方法可以提高性能以避免此问题?我的应用程序绝对需要OpenSL ES。
  4. 感谢。

1 个答案:

答案 0 :(得分:0)

增加缓冲区大小可解决有关失真和噪声的一些问题。是的,当SDK高于4.2时,您可以从硬件中检测本机缓冲区大小:

String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);

但另一种获取Audio Record最小缓冲区大小的方法是:

int minForAudioRecord = AudioRecord.getMinBufferSize(8000,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT);

对于音频播放:

int minForAudioTrack = AudioTrack.getMinBufferSize(8000,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT);

如果您的SDK版本大于或等于4.2,那么您可以获得音频的首选采样率。

String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);

我发现三星设备在处理这些事情时是最糟糕的,因为每个设备都有不同的处理音频驱动程序的方法。