1# 响应音频流输出设备变更 2 3开发者可以了解音频流输出设备变更信息,并完成相应适配,确保应用在设备发生变更时的用户体验。 4 5开发者可使用AudioRenderer的[outputDeviceChangeWithInfo](../../reference/apis-audio-kit/js-apis-audio.md#onoutputdevicechangewithinfo11),用于监听音频流输出设备变化及原因。当系统出现音频输出设备的上下线、用户强选、设备抢占或设备选择策略变更等情况,导致音频流输出设备变更时,系统将通过该接口通知应用当前音频流设备变更信息,包含当前音频流输出设备信息和设备变更原因。 6 7## 音频流输出设备信息 8 9在[outputDeviceChangeWithInfo](../../reference/apis-audio-kit/js-apis-audio.md#onoutputdevicechangewithinfo11)返回的音频流设备变更信息中,包含当前音频流输出设备信息,以数组形式发送,一般该列表仅包含一个设备信息,具体可参考[AudioDeviceDescriptors](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptors)(设备信息列表)。 10 11## 音频流输出设备变更原因 12> **说明:** 13当发生下述四种情况([AudioStreamDeviceChangeReason](../../reference/apis-audio-kit/js-apis-audio.md#audiostreamdevicechangereason11))时,系统将向应用发送设备变更回调。 14 15- **REASON_NEW_DEVICE_AVAILABLE**:新设备可用。 16 17 **触发场景:** 18 19 普通蓝牙设备(耳机、眼镜、音箱、车机等)连接、支持佩戴检测的蓝牙设备(耳机、眼镜等)佩戴、有线设备(3.5mm耳机、Type-C耳机、USB耳机、USB音箱等)插入、分布式设备上线等。 20 21- **REASON_OLD_DEVICE_UNAVAILABLE**:旧设备不可用。 22 23 当报告此原因时,应用程序应考虑暂停音频播放。 24 25 **触发场景:** 26 27 普通蓝牙设备(耳机、眼镜、音箱、车机等)断开、支持佩戴检测的蓝牙耳机双耳摘下、支持佩戴检测的蓝牙眼镜摘下、有线设备(3.5mm耳机、Type-C耳机、USB耳机、音箱等)拔出、分布式设备下线等。 28 29 针对此场景,常用业务场景的**处理建议**如下: 30 31 - 游戏场景:不暂停 32 - 听书场景:暂停 33 - 音乐场景:暂停 34 - 视频场景:暂停 35 36- **REASON_OVERRODE**:用户强制选择设备。 37 38 **触发场景:** 39 40 用户从界面选择切换音频流输出设备、从外设选择接听蜂窝或VoIP来电。 41 42- **REASON_UNKNOWN**:未知原因。 43 44## 参考示例 45 46 ```ts 47 import router from '@ohos.router'; 48 import { audio } from '@kit.AudioKit'; 49 import { BusinessError } from '@kit.BasicServicesKit'; 50 51 let audioRenderer: audio.AudioRenderer | undefined = undefined; 52 let audioStreamInfo: audio.AudioStreamInfo = { 53 samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率 54 channels: audio.AudioChannel.CHANNEL_2, // 通道 55 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式 56 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式 57 }; 58 let audioRendererInfo: audio.AudioRendererInfo = { 59 usage: audio.StreamUsage.STREAM_USAGE_MUSIC, // 音频流使用类型 60 rendererFlags: 0 // 音频渲染器标志 61 }; 62 let audioRendererOptions: audio.AudioRendererOptions = { 63 streamInfo: audioStreamInfo, 64 rendererInfo: audioRendererInfo 65 }; 66 67 // 创建AudioRenderer实例 68 audio.createAudioRenderer(audioRendererOptions).then((data) => { 69 audioRenderer = data; 70 console.info('AudioFrameworkRenderLog: AudioRenderer Created : Success : Stream Type: SUCCESS'); 71 }).catch((err: BusinessError) => { 72 console.error(`AudioFrameworkRenderLog: AudioRenderer Created : ERROR : ${err}`); 73 }); 74 75 if (audioRenderer) { 76 // 订阅监听音频流输出设备变化及原因 77 (audioRenderer as audio.AudioRenderer).on('outputDeviceChangeWithInfo', async (deviceChangeInfo: audio.AudioStreamDeviceChangeInfo) => { 78 switch (deviceChangeInfo.changeReason) { 79 case audio.AudioStreamDeviceChangeReason.REASON_OLD_DEVICE_UNAVAILABLE: 80 // 响应设备不可用事件,如果应用处于播放状态,应暂停播放,更新UX界面。 81 // await audioRenderer.pause(); 82 break; 83 case audio.AudioStreamDeviceChangeReason.REASON_NEW_DEVICE_AVAILABLE: 84 // 应用根据业务情况响应设备可用事件。 85 break; 86 case audio.AudioStreamDeviceChangeReason.REASON_OVERRODE: 87 // 应用根据业务情况响应设备强选事件。 88 break; 89 case audio.AudioStreamDeviceChangeReason.REASON_UNKNOWN: 90 // 应用根据业务情况响应未知原因事件。 91 break; 92 } 93 }); 94 } 95 ```