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 以改善声学质量,例如降噪、低音增强等)
我知道这个问题已经很老了,所以很可能不再相关,但我很想听听你的进展情况。
在我的 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 以改善声学质量,例如降噪、低音增强等)
我知道这个问题已经很老了,所以很可能不再相关,但我很想听听你的进展情况。