Библиотека Android Oboe отстает на нескольких устройствах - PullRequest
0 голосов
/ 17 ноября 2018

В своем приложении для Android я использую библиотеку Oboe и библиотеку Vorbisfile для извлечения, обработки и перенаправления аудиосэмплов на аудиовыход.

Для простоты, вот краткий обзор того, что я делал (на примере hello-oboe здесь ):

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 аудиофайла одновременно (так что я могу играть их одновременно), , в то время как тот же код работает без проблем на менее мощных устройствах, таких как Nokia 1 .

Я также пытался установить для mBufferSizeSelection значение 4 или даже 8, но никаких изменений не произошло.

Кто-нибудь испытывал нечто подобное? Я что-то пропустил?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 07 декабря 2018

Во-первых, вы не должны делать извлечение и декодирование внутри звукового обратного вызова, потому что это будет блокировать звуковой обратный вызов до тех пор, пока не произойдет декодирование, которое будет вызывать постоянные потери.

Вместо этого выполните декодирование после настройки потока (после вызова AudioStreamBuilder::openStream).Таким образом, ваши данные PCM будут готовы сразу же, когда произойдет звуковой обратный вызов.

Во-вторых, что вы подразумеваете под "довольно медленным"?Существует несколько источников задержки в пути прохождения сигнала, в том числе:

  • Время, необходимое для сенсорных событий для достижения приложения
  • Время, необходимое для запуска первого звукового обратного вызова, если вызапускаете ваш поток из другого потока
  • Время, необходимое для декодирования vorbis
  • Время, необходимое для того, чтобы аудио кадры пришли на аудиоустройство
  • Время, необходимое для визуализацииаудио для достижения динамика или наушников (может быть DSP на выходном тракте, чтобы улучшить акустические качества, например, подавление шума, усиление басов и т. д.)

Я понимаю, что этот вопрос довольно старый, поэтому, скорее всего, больше не будетактуально, но было бы интересно услышать, как вы поживаете.

...