1

我在音频 android 应用程序中使用 Oboe 1.2。当我调用给出端点缓冲区大小的 getFramesPerBurst() 时,如果输出通道数设置为 2,我会得到预期的结果(240 帧)。但是,当我设置 4 个输出通道时,getFramesPerBurst() 返回的值大约是960(!)。这正常吗?这是硬件的限制吗(我在 4 个不同的设备上进行了测试,但操作系统版本不同)?双簧管的限制?我还注意到这个值与 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

1 回答 1

1

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

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

为了获得最低延迟,在创建流时始终保持未指定通道数,然后在您自己的应用程序中进行任何通道数转换。这里有一个例子

于 2019-09-04T14:13:34.963 回答