在移动应用开发中,音频焦点管理一直是个痛点:传统方案要么全局独占,要么混音混乱。HarmonyOS 6.1.1(API 24)Audio Kit 引入了流级别的独立音频会话策略,允许单个 AudioRenderer 或 AudioCapturer 实例绕过应用默认规则,实现精细的并发与打断控制。同时,新增的 OH_MIDI Native C-API 为外置乐器提供极低延迟的指令通道。本文通过一个实战控制舱项目,演示如何安全调用新 API,并总结避坑要点。
新特性核心能力
1. setIndependentAudioSessionStrategy:针对每个音频流设置独立的并发模式(混音/独占)和打断行为(静音/中断)。调用后必须重新 start() 才能生效。
2. OH_MIDI C-API:支持设备热插拔回调、零拷贝读写,适合音乐创作类应用。
防御性接口注入:解决 Beta SDK 符号缺失
由于 Beta 版 d.ts 可能未包含新方法,可以通过结构化重叠接口安全调用:
- import { audio } from '@kit.AudioKit';
- interface AudioRendererExt {
- getState(): audio.AudioState;
- setIndependentAudioSessionStrategy?(
- strategy: audio.AudioSessionStrategy,
- behavior: number
- ): void;
- }
复制代码
核心实战:独立音频会话控制舱
以下代码展示了初始化 AudioRenderer、动态设置会话策略并触发热重启的完整流程。关键点:必须检测当前状态,在 RUNNING 时调用 start() 使策略生效。
- async initAudioRendererInstance() {
- let audioStreamInfo: audio.AudioStreamInfo = {
- samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100,
- channels: audio.AudioChannel.CHANNEL_2,
- sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
- encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
- };
- let audioRendererInfo: audio.AudioRendererInfo = {
- usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
- rendererFlags: 0
- };
- let audioRendererOptions: audio.AudioRendererOptions = {
- streamInfo: audioStreamInfo,
- rendererInfo: audioRendererInfo
- };
- this.audioRenderer = await audio.createAudioRenderer(audioRendererOptions);
- }
- applySessionStrategy() {
- if (!this.audioRenderer) return;
- const selectedMode = this.useMixOthers
- ? audio.AudioConcurrencyMode.CONCURRENCY_MIX_WITH_OTHERS
- : audio.AudioConcurrencyMode.CONCURRENCY_DEFAULT;
- let targetStrategy: audio.AudioSessionStrategy = {
- concurrencyMode: selectedMode
- };
- let behaviorMask: number = this.useMuteWhenInterrupted
- ? audio.AudioSessionBehaviorFlags.MUTE_WHEN_INTERRUPTED
- : 0;
- const extendedRenderer = this.audioRenderer as unknown as AudioRendererExt;
- if (extendedRenderer.setIndependentAudioSessionStrategy) {
- extendedRenderer.setIndependentAudioSessionStrategy(targetStrategy, behaviorMask);
- // 热重启生效
- const currentState = this.audioRenderer.getState();
- if (currentState === audio.AudioState.STATE_RUNNING) {
- this.audioRenderer.start(); // 强制触发底层管道重配置
- }
- }
- }
复制代码
界面部分包含两个开关:混音共存模式(useMixOthers)和物理静音阻尼(useMuteWhenInterrupted),一个启动/停止按钮,以及一个触发策略应用的按钮。运行日志显示策略生效过程。
运行效果验证
真机测试:先启动网易云音乐播放,再启动 Demo 的音频流。默认情况下 Demo 会抢占焦点打断音乐。勾选“混音共存模式”并点击“强制热装填独立会话策略”后,日志输出“[EFFECTIVE] 重整成功!”,此时 Demo 音频与网易云音乐同时播放,互不干扰。
避坑指南
1. 必须二次调用 start():调用 setIndependentAudioSessionStrategy 后,若流处于 RUNNING 状态,需立即重新 start() 才能让策略生效,否则配置会“哑火”。
2. 避免滥用独占模式:通知音、按钮音等短音效应使用 MIX_WITH_OTHERS,只有核心通话或全屏视频才使用 CONCURRENCY_DEFAULT,否则会造成音频碎片化。
3. OH_MIDI 热插拔句柄回收:在 C++ 层收到 DEVICE_REMOVED 回调后,必须立即关闭文件描述符并释放资源,防止 USB 控制器锁死。
总结
HarmonyOS 6.1.1 的独立音频会话策略为应用提供了流级别的音频焦点控制力,结合 OH_MIDI Native API,既能实现优雅的混音共存,又能支撑专业音乐创作。掌握这两把钥匙,可以让你的鸿蒙应用在音频体验上领先一步。 |