San*_*rag 5 android oboe android-audio-streams
我目前正在开发一个需要低延迟音频的项目,因此我决定使用 Oboe(谷歌库)来处理它。
我已阅读该文档,但其中出现了多个问题。
首先,一旦我使用构建器模式创建流、打开流并请求流启动,我如何捕获从麦克风传入的数据?
我知道有两种方法:使用读取函数或回调。
问题:
但是,如果我使用读取函数,如何确保只要流启动就正在调用它?
如何使用回调来获取数据并进行处理?
我将在下面留下我的代码
void HelloOboeEngine::start() {
isRecording = true;
oboe::Result result = createStream();
if (result != oboe::Result::OK) {
closeStream(mRecordingStream);
}
result = mRecordingStream->requestStart();
if (result != oboe::Result::OK) {
closeStream(mRecordingStream);
}
}
oboe::Result HelloOboeEngine::createStream() {
oboe::AudioStreamBuilder builder;
return builder.setPerformanceMode(oboe::PerformanceMode::LowLatency)
->setDirection(oboe::Direction::Input)
->setFormat(mFormat)
->setFormatConversionAllowed(true)
->setChannelConversionAllowed(true)
->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)
->openStream(mRecordingStream);
}
void HelloOboeEngine::closeStream(std::shared_ptr<oboe::AudioStream> &stream) {
if (stream) {
oboe::Result result = stream->stop();
if (result != oboe::Result::OK) {
LOGW("Error stopping stream: %s", oboe::convertToText(result));
}
result = stream->close();
if (result != oboe::Result::OK) {
LOGE("Error closing stream: %s", oboe::convertToText(result));
} else {
LOGW("Successfully closed stream");
}
stream.reset();
}
}
Run Code Online (Sandbox Code Playgroud)
您需要首先扩展您的类以覆盖头文件中的回调并获取数据,如下所示:
class AndroidAudioDeviceManager : public oboe::AudioStreamCallback {
Run Code Online (Sandbox Code Playgroud)
在类的构建器中设置回调,如下所示:
oboe::AudioStreamBuilder *AndroidAudioDeviceManager::setupPlaybackStreamParameters(
oboe::AudioStreamBuilder *builder) {
builder->setDataCallback(this)
->setErrorCallback(this)
->setDeviceId(mPlaybackDeviceId)
->setDirection(oboe::Direction::Output)
->setChannelCount(mOutputChannelCount);
return setupCommonStreamParameters(builder);
}
Run Code Online (Sandbox Code Playgroud)
并编写您的实现,覆盖该方法:
oboe::DataCallbackResult AndroidAudioDeviceManager::onAudioReady(
oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) {
oboe::DataCallbackResult callbackResult = oboe::DataCallbackResult::Continue;
int32_t actualFramesRead = 0;
// Silence the output.
int32_t numBytes = numFrames * outputStream->getBytesPerFrame();
memset(audioData, 0 /* value */, numBytes);
// YOUR CODE ...
return callbackResult;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |