1# 分布式音频播放(仅对系统应用开放) 2 3通过分布式音频播放的能力,用户可以将音频投播远端设备播放,实现音频在组网中不同设备之间流转。 4 5开发者可以通过分布式音频播放,将当前设备播放的所有音频投放到指定的远端设备播放,或将设备播放的某个音频流投放到指定的远端设备播放。 6 7## 开发步骤及示例 8 9在将音频投播到组网内其他设备前,需要先获取组网内的设备列表,并监听设备连接状态的变化,具体开发步骤请参考[音频输出设备管理](audio-output-device-management.md)。 10 11在获取组网内的设备列表时,可以通过指定DeviceFlag,筛选出需要的设备。 12 13| 名称 | 说明 | 14| -------- | -------- | 15| NONE_DEVICES_FLAG<sup>9+</sup> | 无。此接口为系统接口。 | 16| OUTPUT_DEVICES_FLAG | 本地输出设备。 | 17| INPUT_DEVICES_FLAG | 本地输入设备。 | 18| ALL_DEVICES_FLAG | 本地输入输出设备。 | 19| DISTRIBUTED_OUTPUT_DEVICES_FLAG<sup>9+</sup> | 分布式输出设备。 此接口为系统接口。 | 20| DISTRIBUTED_INPUT_DEVICES_FLAG<sup>9+</sup> | 分布式输入设备。 此接口为系统接口。 | 21| ALL_DISTRIBUTED_DEVICES_FLAG<sup>9+</sup> | 分布式输入输出设备。 此接口为系统接口。 | 22 23具体接口说明请参考[AudioRoutingManager API文档](../reference/apis/js-apis-audio.md#audioroutingmanager9)。 24 25### 投播所有音频 26 271. [获取输出设备信息](audio-output-device-management.md#获取输出设备信息)。 28 292. 创建AudioDeviceDescriptor对象,用于指定音频输出设备。 30 313. 调用selectOutputDevice,将当前设备播放的所有音频投放到指定的远端设备播放。 32 33```ts 34import audio from '@ohos.multimedia.audio'; 35import { BusinessError } from '@ohos.base'; 36 37let audioManager = audio.getAudioManager(); 38let audioRoutingManager = audioManager.getRoutingManager(); 39let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 40 deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 41 deviceType: audio.DeviceType.SPEAKER, 42 id: 1, 43 name: "", 44 address: "", 45 sampleRates: [44100], 46 channelCounts: [2], 47 channelMasks: [0], 48 networkId: audio.LOCAL_NETWORK_ID, 49 interruptGroupId: 1, 50 volumeGroupId: 1, 51 displayName: "" 52}]; 53 54async function selectOutputDevice(): Promise<void> { 55 audioRoutingManager.selectOutputDevice(outputAudioDeviceDescriptor, (err: BusinessError) => { 56 if (err) { 57 console.error(`Invoke selectOutputDevice failed, code is ${err.code}, message is ${err.message}`); 58 } else { 59 console.info('Invoke selectOutputDevice succeeded.'); 60 } 61 }); 62} 63``` 64 65### 投播指定音频流 66 671. [获取输出设备信息](audio-output-device-management.md#获取输出设备信息)。 68 692. 创建AudioRendererFilter对象,通过uid指定应用,通过rendererId指定音频流。 70 713. 创建AudioDeviceDescriptor对象,用于指定音频输出设备。 72 734. 调用selectOutputDeviceByFilter,将当前设备播放的指定音频流投放到指定的远端设备播放。 74 75```ts 76import audio from '@ohos.multimedia.audio'; 77import { BusinessError } from '@ohos.base'; 78 79let audioManager = audio.getAudioManager(); 80let audioRoutingManager = audioManager.getRoutingManager(); 81let outputAudioRendererFilter: audio.AudioRendererFilter = { 82 uid: 20010041, 83 rendererInfo: { 84 content: audio.ContentType.CONTENT_TYPE_MUSIC, 85 usage: audio.StreamUsage.STREAM_USAGE_MEDIA, 86 rendererFlags: 0 } as audio.AudioRendererInfo, 87 rendererId: 0 }; 88 89let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 90 deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 91 deviceType: audio.DeviceType.SPEAKER, 92 id: 1, 93 name: "", 94 address: "", 95 sampleRates: [44100], 96 channelCounts: [2], 97 channelMasks: [0], 98 networkId: audio.LOCAL_NETWORK_ID, 99 interruptGroupId: 1, 100 volumeGroupId: 1, 101 displayName: "" 102}]; 103async function selectOutputDeviceByFilter(): Promise<void> { 104 audioRoutingManager.selectOutputDeviceByFilter(outputAudioRendererFilter, outputAudioDeviceDescriptor, (err: BusinessError) => { 105 if (err) { 106 console.error(`Invoke selectOutputDeviceByFilter failed, code is ${err.code}, message is ${err.message}`); 107 } else { 108 console.info('Invoke selectOutputDeviceByFilter succeeded.'); 109 } 110 }); 111} 112``` 113