1

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

关于我的实现 - 我需要低延迟,所以我在 OpenSL ES 回调中处理我的音频,并使用 128 个样本的相当小的缓冲区大小将缓冲区排入队列。我在回调期间进行 mp3 解码,但由于我的环形缓冲区大小,我不需要在每个回调周期中解码。

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

  • 配备 Android 4.4 的三星 Galaxy S4 - 没有音频播放问题
  • 配备 Android 4.3 的三星 Galaxy S4 - 用户在锁定/解锁设备时会遇到音频中断/卡顿
  • 三星 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 回答 1

0

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

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

但是另一种获得音频记录最小缓冲区大小的方法是:

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);

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

于 2014-03-19T11:05:53.383 回答