1# 空间音频管理 2 3空间音频是一种能够将传统的立体声体验扩展到三维空间的音频技术,在单声道、立体声、环绕声基础上,增加高度感知,营造全方位的听音体验的音频技术。空间音频为用户提供沉浸的、有互动的、有空间感的“声”临其境的音频体验。 4 5AudioVivid是全球首个基于AI技术的音频编解码标准,由世界超高清视频产业联盟(UWA)与数字音视频编解码技术标准工作组(AVS)联合制定,共同发布。包含音频PCM数据以及元数据的音频格式,相比传统立体声音源,AudioVivid包含音频内容源的元数据信息,能够还原物理和感知世界中的真实挺赶,打造极致的沉浸式视觉体验。 6 7空间音频支持播放多声道、立体声、AudioVivid等格式音源,并在耳机实现双耳空间音频渲染重放。搭配AudioVivid格式音源的空间音频渲染,能够将音乐中的人声和各种乐器作为独立的声音对象,重新定义各种声音对象的位置、移动轨迹和声音大小、远近等要素,实现声音在听众四周及上方全面萦绕,实现更佳的空间音频沉浸式体验,获得影院、音乐厅等的临场感与艺术体验。当设备支持空间音频且空间音频开关被打开时,下发AudioVivid格式音源可以得到更加沉浸的音频体验。关于如何播放AudioVivid音源,可参考[播放AudioVivid音源](using-ohaudio-for-playback.md#播放audiovivid格式音源)。 8 9## 使用说明 10 11对于播放音频类的应用,开发者可以查询到设备是否有支持空间音频的能力,以及当前设备空间音频的开关状态。 12 13### 创建空间音频示例 14 15应用开发者在使用AudioSpatializationManager的API前,需要先用[getSpatializationManager](../../reference/apis-audio-kit/js-apis-audio.md#getspatializationmanager18)创建一个AudioSpatializationManager实例。 16 17 ```ts 18 import { audio } from '@kit.AudioKit'; 19 20 let audioManager = audio.getAudioManager(); 21 let audioSpatializationManager = audioManager.getSpatializationManager(); 22 ``` 23 24### 查询设备是否支持空间音频渲染能力 25 26应用开发者可以使用[AudioDeviceDescriptor](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptor)的spatializationSupported属性获取指定设备是否具有空间音频渲染的能力,需要通过音频框架中其他接口来获取当前已连接设备或当前发声设备的AudioDeviceDescriptor。 27 28 ```ts 29 import { audio } from '@kit.AudioKit'; 30 import { BusinessError } from '@kit.BasicServicesKit'; 31 32 const deviceDescriptors: audio.AudioDeviceDescriptors = audioRoutingManager.getDevicesSync(audio.DeviceFlag.OUTPUT_DEVICES_FLAG); 33 for (let i = 0; i < deviceDescriptors.length; i++) { 34 console.info('deviceDescriptor deviceRole: ${deviceDescriptors[i].deviceRole}'); 35 console.info('deviceDescriptor deviceType: ${deviceDescriptors[i].deviceType}'); 36 console.info('deviceDescriptor name: ${deviceDescriptors[i].name}'); 37 console.info('deviceDescriptor spatializationSupported: ${deviceDescriptors[i].spatializationSupported}'); 38 } 39 ``` 40 41### 查询当前发声设备的空间音频渲染效果开关状态 42 43应用开发者可以通过[isSpatializationEnabledForCurrentDevice](../../reference/apis-audio-kit/js-apis-audio.md#isspatializationenabledforcurrentdevice18)接口查询当前设备的空间音频渲染效果开关状态。<br> 44- 该接口返回true表示当前设备空间音频渲染开启,返回false表示当前设备空间音频渲染关闭。<br> 45- 该状态仅为开关状态,实际是否生效还需依赖当前设备是否支持空间音频渲染。 46 47 ```ts 48 import { audio } from '@kit.AudioKit'; 49 50 let isSpatializationEnabledForCurrentDevice: boolean = audioSpatializationManager.isSpatializationEnabledForCurrentDevice(); 51 console.info(`AudioSpatializationManager isSpatializationEnabledForCurrentDevice: ${isSpatializationEnabledForCurrentDevice}`); 52 ``` 53 54**订阅当前发声设备空间音频渲染效果的开关状态变化事件** 55 56应用开发者可以通过[on('spatializationEnabledChangeForCurrentDevice')](../../reference/apis-audio-kit/js-apis-audio.md#onspatializationenabledchangeforcurrentdevice18)接口订阅当前空间音频渲染效果的开关状态变化事件。 57- 该接口返回true表示空间音频渲染被开启,返回false表示空间音频渲染被关闭。 58 59 ```ts 60 import { audio } from '@kit.AudioKit'; 61 62 audioSpatializationManager.on('spatializationEnabledChangeForCurrentDevice', (isSpatializationEnabledForCurrentDevice: boolean) => { 63 console.info(`isSpatializationEnabledForCurrentDevice: ${isSpatializationEnabledForCurrentDevice}`); 64 }); 65 ``` 66 67**取消订阅当前发声设备空间音频渲染效果的开关状态变化事件** 68 69应用开发者可以通过[off('spatializationEnabledChangeForCurrentDevice')](../../reference/apis-audio-kit/js-apis-audio.md#offspatializationenabledchangeforcurrentdevice18)接口取消订阅空间音频渲染效果的开关状态变化事件。 70 71 ```ts 72 import { audio } from '@kit.AudioKit'; 73 audioSpatializationManager.off('spatializationEnabledChangeForCurrentDevice'); 74 ```