安卓双簧管c++播放时有些声音失真



我在音乐游戏中使用安卓双簧管库来获得高性能音频。

在资产文件夹中,我有2个原始文件(均为48000Hz 16位PCM波形和约60kB(std_kit_sn.rawstd_kit_ht.原始

这些声音作为录音带加载到内存中,并添加到混音器中。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");

他们被适当地调用,以便在需要的时间玩标准代码(根据谷歌教程(:

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

音频回调是标准的(根据谷歌教程(:

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有一个严重的失真。两者都具有较低的延迟。为什么一个打得很好,另一个却有严重的失真?

我加载了你的样本项目,我相信你听到的失真是由声音混合过程中的剪辑/环绕引起的。

样本中的Mixer对象是一个求和混合器。它只是将每个轨道的值加在一起并输出总和。

你需要添加一些代码来减少每个音轨的音量,以避免超过int16_t的限制(尽管欢迎你在oboe项目中提交一个bug,我会在即将发布的版本中尝试添加它(。如果你超过这个限制,你会被包裹,这是造成扭曲的原因。

此外,你的应用程序被硬编码为以22050帧/秒的速度运行。这将导致大多数移动设备的次优延迟,因为流被迫向上采样到音频设备的本地帧速率。更好的方法是在打开流时不定义采样率-这将为您提供当前音频设备的最佳帧速率-然后在源文件上使用重采样器以该帧速率提供音频。

最新更新