文章目录
- 一、报错信息
- 二、解决方案
在 Android 8.0 以上的机型中 , Oboe 播放器调用的是 AAudio 播放器 API ;
在 Android 8.0 以上的机型中 , Oboe 播放器调用的是 OpenSL ES 播放器 API ;
本博客中涉及的 Android 系统版本是 9 , 10 , 11 , 因此 Oboe 本质上调用的播放器都是 AAudio 播放器 ;
参考 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 ) 博客 ;
一、报错信息
在 Android 应用中使用 Oboe 播放器 , 启动了两个进程 , 每个进程中创建了一个 Oboe 播放器进行发音操作 ;
Oboe 播放器使用 , 参考 【Android 高性能音频】Oboe 开发流程 ( Oboe 完整代码示例 ) 博客 ;
两个 Oboe 播放器在 Android 10 , Android 9 中运行良好 , 但在 Android 11 的设备中出现如下报错 ;
启动了两个 Oboe 播放器 , 后启动的 Oboe 播放器会抢占扬声器设备 , 将先启动的 Oboe 播放器关闭 ;
对应的播放器报错如下 :
代码语言:javascript复制2021-05-05 13:51:06.545 16722-16933/kim.hsl.oboe I/ELEVOC_NS_FRONT: cycle task init 0x7319b81b00
2021-05-05 13:51:06.551 16722-16932/kim.hsl.oboe W/AudioStreamInternal_Client: onEventFromServer - AAUDIO_SERVICE_EVENT_DISCONNECTED - FIFO cleared
2021-05-05 13:51:06.564 16722-16947/kim.hsl.oboe E/AAudioStream: setState(1) tried to set to 9 but already DISCONNECTED
2021-05-05 13:51:06.565 16722-16947/kim.hsl.oboe E/AAudioStream: joinThread() - but has no thread
2021-05-05 13:51:06.565 16722-16947/kim.hsl.oboe E/AAudioStream: setState(1) tried to set to 11 but already CLOSING
2021-05-05 13:51:06.586 16722-16933/kim.hsl.oboe W/AudioTrack: Use of stream types is deprecated for operations other than volume control
2021-05-05 13:51:06.586 16722-16933/kim.hsl.oboe W/AudioTrack: See the documentation of AudioTrack() for what to use instead with android.media.AudioAttributes to qualify your playback use case
2021-05-05 13:51:06.588 16722-16933/kim.hsl.oboe I/th_note_stage_: The app match pkg failed
2021-05-05 13:51:06.588 16722-16933/kim.hsl.oboe I/ELEVOC_NS_FRONT: cycle start task... 0x7319b81b00
没有报错的 Oboe 播放器日志信息 :
代码语言:javascript复制2021-05-05 13:52:58.923 17109-17348/kim.hsl.oboe I/ELEVOC_NS_FRONT: cycle task init 0x7319c52100
2021-05-05 13:52:58.954 17109-17348/kim.hsl.oboe W/AudioTrack: Use of stream types is deprecated for operations other than volume control
2021-05-05 13:52:58.955 17109-17348/kim.hsl.oboe W/AudioTrack: See the documentation of AudioTrack() for what to use instead with android.media.AudioAttributes to qualify your playback use case
2021-05-05 13:52:58.956 17109-17348/kim.hsl.oboe I/th_note_stage_: The app match pkg failed
2021-05-05 13:52:58.956 17109-17348/kim.hsl.oboe I/ELEVOC_NS_FRONT: cycle start task... 0x7319c52100
二、解决方案
参考 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 ) 博客 , Oboe 音频流需要设置相关参数 ;
在 Android 9 , 10 系统中 , 即使设置了音频流的模式为独占模式 , 也能启动两个 Oboe 播放器 ;
代码语言:javascript复制 // 1. 音频流构建器
oboe::AudioStreamBuilder builder = oboe::AudioStreamBuilder();
// 设置音频流方向
builder.setDirection(oboe::Direction::Output);
// 设置性能优先级
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
// 设置共享模式 , 独占
builder.setSharingMode(oboe::SharingMode::Exclusive);
// 设置音频采样格式
builder.setFormat(oboe::AudioFormat::Float);
// 设置声道数 , 单声道/立体声
builder.setChannelCount(oboe::ChannelCount::Stereo);
// 设置采样率
builder.setSampleRate(48000);
// 设置回调对象 , 注意要设置 AudioStreamCallback * 指针类型
builder.setCallback(&myCallback);
但是 Android 系统升级到 Android 11 之后 , Oboe 播放器要求更加严格 , 如果设置独占模式 , 则只能有一个音频流能访问扬声器设备 , 如果使用两个 Oboe 音频流访问扬声器 , 则需要设置 共享模式 oboe::SharingMode::Shared
;
// 设置共享模式 , 共享
builder.setSharingMode(oboe::SharingMode::Shared);