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