• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> | 分布式输出设备。&nbsp;此接口为系统接口。 |
20| DISTRIBUTED_INPUT_DEVICES_FLAG<sup>9+</sup> | 分布式输入设备。&nbsp;此接口为系统接口。 |
21| ALL_DISTRIBUTED_DEVICES_FLAG<sup>9+</sup> | 分布式输入输出设备。&nbsp;此接口为系统接口。 |
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