如何使用双簧管在多声道音频应用程序中获得更小的缓冲区大小

How to get smaller buffer size in multi-channel audio application with Oboe

我在音频 android 应用程序中使用 Oboe 1.2。当我调用给出端点缓冲区大小的 getFramesPerBurst() 时,如果输出通道数设置为 2,我将获得预期结果(240 帧)。但是,当我设置 4 个输出通道时,getFramesPerBurst() 返回的值约为960(!)。那是正常的吗?这是硬件的限制吗(我在 4 种不同的设备上测试过,os 版本不同)?双簧管的局限性?我还注意到这个值不同于 AudioService 中 AudioManager 的 属性 PROPERTY_OUTPUT_FRAMES_PER_BUFFER 给出的值。

oboe::AudioStreamBuilder builder;
if (!oboe::AudioStreamBuilder::isAAudioRecommended()){
    builder.setAudioApi(oboe::AudioApi::OpenSLES);
}
builder.setSharingMode(oboe::SharingMode::Exclusive);
builder.setFormat(oboe::AudioFormat::Float);
builder.setChannelCount(4);
builder.setCallback(&_oboeCallback);
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);

oboe::Result result = builder.openStream(&_stream);

if (result == oboe::Result::OK) {
    int framePerBurst = _stream->getFramesPerBurst(); // gives value around 960 for 4 channels, 240 for 2 channels
    _stream->setBufferSizeInFrames(2*framePerBurst);
}

除非您连接的音频设备实际上有 4 个独立通道(例如 USB 音频接口或 DJ 控制器 like this one),否则您的 4 通道流将需要混合到 N 通道流中N 是音频设备中的通道数。这可能是 2(立体声)用于耳机或 1(单声道)用于内置扬声器。

混音器引入了延迟和更大的缓冲区大小。这是您请求 2 通道数与 4 通道时看到的缓冲区大小差异。

为了实现最低延迟,在创建流时始终不指定频道数,然后在您自己的应用内进行任何频道数转换。 There's an example of this here