Android 双簧管库在一些设备上滞后

Android Oboe library is laggy on a few devices

在我的 Android 应用程序中,我使用 Oboe 库和 Vorbisfile 库来提取、处理音频样本并将其重定向到音频输出。

为简单起见,这里是我一直在做的事情的快速概述(使用 hello-oboe 示例 here):

oboe::DataCallbackResult PlayAudioEngine::onAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames)
{
    // init:
    if (mBufferSizeSelection != kBufferSizeAutomatic && audioStream->getBufferSizeInFrames() != mBufferSizeSelection * mFramesPerBurst)
    {
        audioStream->setBufferSizeInFrames(mBufferSizeSelection * mFramesPerBurst);
    }

    // audio extraction:
    if (audioStream->getFormat() == oboe::AudioFormat::Float)
    {
        // extract audio samples using vorbisfile...
        // put the extracted audio samples in audioData...
    }
    else
    {
        // extract audio samples using vorbisfile...
        // put the extracted audio samples in audioData...
    }
    return oboe::DataCallbackResult::Continue;
}

这段代码在大多数设备上都非常有效(我在 10 多台设备上测试过它,包括 Galaxy S3 mini 或 Nokia 1 等低端设备),没有任何延迟。

问题是:在某些设备上(Archos 55 Cobalt (API 23) 和 OnePlus One (API 23)),声音是非常慢,特别是如果我同时提取 2 个音频文件(这样我可以同时播放它们),而完全相同的代码在诺基亚 1 等功能较弱的设备上运行没有任何问题 .

我也试过把mBufferSizeSelection设置成4甚至8,但是一点变化都没有。

有没有人经历过类似的事情?我错过了什么吗?

感谢您的帮助。

首先,您不应该在音频回调中进行提取和解码,因为这会阻止音频回调,直到解码发生,这将导致持续的欠载。

而是在设置流后(调用 AudioStreamBuilder::openStream 后)进行解码。这样,您的 PCM 数据将在音频回调发生时立即准备就绪。

其次,"quite laggy"是什么意思?信号路径中有许多延迟源,包括:

  • 触摸事件到达应用所用的时间
  • 如果您从另一个线程开始您的流,则第一个音频回调开始所花费的时间
  • 发生 vorbis 解码所用的时间
  • 音频帧到达音频设备所用的时间
  • 渲染的音频到达扬声器或耳机所花费的时间(输出路径上可以有 DSP 以改善声学质量,例如降噪、低音增强等)

我知道这个问题已经很老了,所以很可能不再相关,但我很想听听你的进展情况。