1# 分布式音频播放(仅对系统应用开放) 2<!--Kit: Audio Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @songshenke--> 5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang--> 6<!--Tester: @Filger--> 7<!--Adviser: @zengyawen--> 8 9通过分布式音频播放的能力,用户可以将音频投播远端设备播放,实现音频在组网中不同设备之间流转。 10 11开发者可以通过分布式音频播放,将当前设备播放的所有音频投放到指定的远端设备播放,或将设备播放的某个音频流投放到指定的远端设备播放。 12 13## 开发步骤及示例 14 15在将音频投播到组网内其他设备前,需要先获取组网内的设备列表,并监听设备连接状态的变化,具体开发步骤请参考[音频输出设备管理](audio-output-device-management.md)。 16 17在获取组网内的设备列表时,可以通过指定DeviceFlag,筛选出需要的设备。 18 19| 名称 | 说明 | 20| -------- | -------- | 21| NONE_DEVICES_FLAG<sup>9+</sup> | 无设备。此接口为系统接口。 | 22| OUTPUT_DEVICES_FLAG | 本地输出设备。 | 23| INPUT_DEVICES_FLAG | 本地输入设备。 | 24| ALL_DEVICES_FLAG | 本地输入输出设备。 | 25| DISTRIBUTED_OUTPUT_DEVICES_FLAG<sup>9+</sup> | 分布式输出设备。 此接口为系统接口。 | 26| DISTRIBUTED_INPUT_DEVICES_FLAG<sup>9+</sup> | 分布式输入设备。 此接口为系统接口。 | 27| ALL_DISTRIBUTED_DEVICES_FLAG<sup>9+</sup> | 分布式输入输出设备。 此接口为系统接口。 | 28 29具体接口说明请参考[AudioRoutingManager API文档](../../reference/apis-audio-kit/arkts-apis-audio-AudioRoutingManager.md)。 30 31### 投播所有音频 32 331. [获取输出设备信息](audio-output-device-management.md#获取输出设备信息)。 34 352. 创建AudioDeviceDescriptor对象,用于指定音频输出设备。 36 373. 调用selectOutputDevice,将当前设备播放的所有音频投放到指定的远端设备播放。 38 39```ts 40import { audio } from '@kit.AudioKit'; 41import { BusinessError } from '@kit.BasicServicesKit'; 42 43let audioManager = audio.getAudioManager(); 44let audioRoutingManager = audioManager.getRoutingManager(); 45let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 46 deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 47 deviceType: audio.DeviceType.SPEAKER, 48 id: 1, 49 name: "", 50 address: "", 51 sampleRates: [44100], 52 channelCounts: [2], 53 channelMasks: [0], 54 networkId: audio.LOCAL_NETWORK_ID, 55 interruptGroupId: 1, 56 volumeGroupId: 1, 57 displayName: "" 58}]; 59 60async function selectOutputDevice(): Promise<void> { 61 audioRoutingManager.selectOutputDevice(outputAudioDeviceDescriptor, (err: BusinessError) => { 62 if (err) { 63 console.error(`Invoke selectOutputDevice failed, code is ${err.code}, message is ${err.message}`); 64 } else { 65 console.info('Invoke selectOutputDevice succeeded.'); 66 } 67 }); 68} 69``` 70 71### 投播指定音频流 72 731. [获取输出设备信息](audio-output-device-management.md#获取输出设备信息)。 74 752. 创建AudioRendererFilter对象,通过uid指定应用,通过rendererId指定音频流。 76 773. 创建AudioDeviceDescriptor对象,用于指定音频输出设备。 78 794. 调用selectOutputDeviceByFilter,将当前设备播放的指定音频流投放到指定的远端设备播放。 80 81```ts 82import { audio } from '@kit.AudioKit'; 83import { BusinessError } from '@kit.BasicServicesKit'; 84 85let audioManager = audio.getAudioManager(); 86let audioRoutingManager = audioManager.getRoutingManager(); 87let outputAudioRendererFilter: audio.AudioRendererFilter = { 88 uid: 20010041, 89 rendererInfo: { 90 usage: audio.StreamUsage.STREAM_USAGE_MUSIC, // 音频流使用类型:音乐。根据业务场景配置,参考StreamUsage。 91 rendererFlags: 0 // 音频渲染器标志。 92 } as audio.AudioRendererInfo, 93 rendererId: 0 94}; 95 96let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 97 deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 98 deviceType: audio.DeviceType.SPEAKER, 99 id: 1, 100 name: "", 101 address: "", 102 sampleRates: [44100], 103 channelCounts: [2], 104 channelMasks: [0], 105 networkId: audio.LOCAL_NETWORK_ID, 106 interruptGroupId: 1, 107 volumeGroupId: 1, 108 displayName: "" 109}]; 110 111async function selectOutputDeviceByFilter(): Promise<void> { 112 audioRoutingManager.selectOutputDeviceByFilter(outputAudioRendererFilter, outputAudioDeviceDescriptor, (err: BusinessError) => { 113 if (err) { 114 console.error(`Invoke selectOutputDeviceByFilter failed, code is ${err.code}, message is ${err.message}`); 115 } else { 116 console.info('Invoke selectOutputDeviceByFilter succeeded.'); 117 } 118 }); 119} 120``` 121