Android oboe c ++ Некоторые звуки искажаются при воспроизведении

Я использую библиотеку гобоя Android для высококачественного звука в музыкальной игре.

В папке assets у меня есть 2 файла .raw (48000 Гц, 16 бит PCM wavs и около 60 КБ).
std_kit_sn.raw
std_kit_ht.raw

Они загружаются в память как SoundRecordings и добавляются в микшер. kSampleRateHz составляет 48000:

stdSN= SoundRecording::loadFromAssets(mAssetManager, "std_kit_sn.raw");
stdHT= SoundRecording::loadFromAssets(mAssetManager, "std_kit_ht.raw");
mMixer.addTrack(stdSN);
mMixer.addTrack(stdFT);

// Create a builder
AudioStreamBuilder builder;
builder.setFormat(AudioFormat::I16);
builder.setChannelCount(1);
builder.setSampleRate(kSampleRateHz);
builder.setCallback(this);
builder.setPerformanceMode(PerformanceMode::LowLatency);
builder.setSharingMode(SharingMode::Exclusive);
LOGD("After creating a builder");

// Open stream
Result result = builder.openStream(&mAudioStream);
if (result != Result::OK){
LOGE("Failed to open stream. Error: %s", convertToText(result));
}
LOGD("After openstream");

// Reduce stream latency by setting the buffer size to a multiple of the burst size
mAudioStream->setBufferSizeInFrames(mAudioStream->getFramesPerBurst() * 2);

// Start the stream
result = mAudioStream->requestStart();
if (result != Result::OK){
LOGE("Failed to start stream. Error: %s", convertToText(result));
}
LOGD("After starting stream");

Они вызываются соответствующим образом, чтобы поиграть со стандартным кодом (согласно учебникам Google) в требуемое время:

stdSN->setPlaying(true);
stdHT->setPlaying(true); //Nasty Sound

Аудио обратный вызов является стандартным (согласно учебникам Google):

DataCallbackResult SoundFunctions::onAudioReady(AudioStream *mAudioStream, void *audioData, int32_t numFrames) {

// Play the stream
mMixer.renderAudio(static_cast<int16_t*>(audioData), numFrames);
return DataCallbackResult::Continue;

}

Std_kit_sn.raw играет нормально. Но std_kit_ht.raw имеет неприятные искажения. Оба играют с низкой задержкой. Почему один играет хорошо, а другой имеет неприятные искажения?

1

Решение

Я загрузил ваш пример проекта, и я считаю, что искажение, которое вы слышите, вызвано обрывом / обтеканием во время микширования звуков.

Mixer Объект из образца представляет собой суммирующий смеситель. Он просто складывает значения каждой дорожки вместе и выводит сумму.

Вам нужно добавить некоторый код, чтобы уменьшить громкость каждой дорожки, чтобы избежать превышения пределов int16_t (хотя вы можете сообщить об ошибке в проекте oboe, и я постараюсь добавить это в следующей версии). Если вы превысите этот предел, вы получите обход, который вызывает искажение.

Кроме того, ваше приложение жестко запрограммировано на скорость 22050 кадров / с. Это приведет к неоптимальной задержке на большинстве мобильных устройств, поскольку поток вынужден повышать частоту до собственной частоты кадров аудиоустройства. Лучшим подходом было бы оставить частоту дискретизации неопределенной при открытии потока — это даст вам оптимальную частоту кадров для текущего аудиоустройства — затем использовать ресэмплер в ваших исходных файлах для подачи звука с такой частотой кадров.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]