From d0fa0e48978f2aff710d4cdec6bea4aec758e4ad Mon Sep 17 00:00:00 2001 From: zengyawen Date: Mon, 3 Jul 2023 20:58:18 +0800 Subject: [PATCH] update docs Signed-off-by: zengyawen --- zh-cn/application-dev/media/Readme-CN.md | 3 +- .../media/avcastpicker-overview.md | 55 ++++ .../figures/cast-interaction-diagram.png | Bin 0 -> 79270 bytes .../media/using-avcastpicker.md | 237 ++++++++++++++ .../media/using-avsession-avcast.md | 307 ------------------ .../reference/apis/js-apis-avcastpicker.md | 37 --- .../reference/arkui-ts/Readme-CN.md | 2 + .../reference/arkui-ts/ohos-avcastpicker.md | 55 ++++ 8 files changed, 351 insertions(+), 345 deletions(-) create mode 100644 zh-cn/application-dev/media/avcastpicker-overview.md create mode 100644 zh-cn/application-dev/media/figures/cast-interaction-diagram.png create mode 100644 zh-cn/application-dev/media/using-avcastpicker.md delete mode 100644 zh-cn/application-dev/media/using-avsession-avcast.md delete mode 100644 zh-cn/application-dev/reference/apis/js-apis-avcastpicker.md create mode 100644 zh-cn/application-dev/reference/arkui-ts/ohos-avcastpicker.md diff --git a/zh-cn/application-dev/media/Readme-CN.md b/zh-cn/application-dev/media/Readme-CN.md index 17a59c5d2d..9052923e44 100755 --- a/zh-cn/application-dev/media/Readme-CN.md +++ b/zh-cn/application-dev/media/Readme-CN.md @@ -49,7 +49,8 @@ - [分布式媒体会话概述](distributed-avsession-overview.md) - [使用分布式媒体会话](using-distributed-avsession.md) - 音视频投播 - - [使用音视频投播](using-avsession-avcast.md) + - [音视频投播概述](avcastpicker-overview.md) + - [使用音视频投播](using-avcastpicker.md) - 相机 - [相机开发概述](camera-overview.md) - 相机开发指导 diff --git a/zh-cn/application-dev/media/avcastpicker-overview.md b/zh-cn/application-dev/media/avcastpicker-overview.md new file mode 100644 index 0000000000..231312539f --- /dev/null +++ b/zh-cn/application-dev/media/avcastpicker-overview.md @@ -0,0 +1,55 @@ +# 音视频投播概述 + +OpenHarmony提供了统一的应用内音视频投播功能设计,通过提供投播组件和标准的接口,帮助开发者可以简单高效地实现将音视频资源投放到其他设备播放,即实现跨端投播。 + +同时,系统提供默认投播协议Cast+,可以有效提升投播体验。 + +使用系统提供的投播组件和接口,应用只需要设置对应的资源信息、监听投播中的相关状态,以及应用主动控制的行为(如:播放、暂停)。其他动作包括图标切换、设备的发现、连接、认证等,均由系统完成。 + +## 基本概述 + +- **媒体会话(AVSession)** + + 音视频管控服务,用于对系统中所有音视频行为进行统一的管理。 + + 本地播放时,应用需要向媒体会话提供播放的媒体信息(如正在播放的歌曲、歌曲的播放状态等),并接收和相应播控中心发出的控制命令(如暂停、下一首等)。具体请参考[本地媒体会话](using-avsession-developer.md)。 + + 投播时,通过AVSession,应用可以投播能力的设置和查询,并创建投播控制器。 + +- **投播组件[AVCastPicker](../reference/arkui-ts/ohos-avcastpicker.md)** + + 系统级的投播组件,可嵌入应用界面的UI组件。当用户点击该组件后,系统将进行设备发现、连接、认证等流程,应用仅需要通过接口获取投播中相关的回调信息。 + +- **投播控制器[AVCastController](../reference/apis/js-apis-avsession.md#avcastcontroller10)** + + 在投播后,由应用发起的对远端播放控制的接口,包括播放、暂停、调节音量、设置播放模式、设置播放速度等能力。 + +- **后台长时任务** + + 应用实现后台播放,需申请后台长时任务,避免应用在投播后被系统后台清理或冻结。具体参考[长时任务开发指导](../task-management/continuous-task-dev-guide.md)。 + +## 分布式投播交互过程 + +![](figures/cast-interaction-diagram.png) + +1. 用户在应用界面上点击AVCastPicker组件,触发系统发现可用于投播的设备。用户在设备列表中选择对应设备后,系统连接对应设备。 +2. 应用通过AVSession监听设备的连接情况,监听到设备已连接后,创建一个AVCastController用于发送控制命令(如播放、暂停、下一首等)。 +3. 在本端(包括应用内和播控中心)控制播放时,控制命令将通过AVCastController发送,本端和远端基于Cast+的能力进行数据传输和信息同步。然后更新远端系统预置播放器的状态。 +4. 用户同样可以在远端直接控制播放,将直接修改远端播放器的状态。 +5. 当远端播放器状态变更后,将触发回调,将状态信息返回到本端。应用可以通过AVCastController监听到远端播放器状态变化。 + +## 接入说明 + +### 基本原则 + +应用需要接入AVSession,才可以使用系统提供的统一投播能力,由系统进行设备发现和管理。系统不额外提供音视频设备发现的接口给应用进行选择和切换设备。 + +使用系统提供的统一投播组件,应用无需关注设备的发现连接过程,仅需关注设备在远端是否可用。当用户通过投播组件,选择了某个远端设备并连接成功,应用将通过回调获取到信息,然后可以创建一个AVCastController,用于控制远端设备的播放。 + +当进入到远端设备投播状态时,应用也可以对应用界面进行重新绘制,比如界面变更为一个遥控器,可控制远端播放。建议应用在进入远端投播时,停止本地的播放器,避免本端和远端设备同时播放的情况,提升用户体验。 + +### 音视频投播与分布式媒体会话的关联与差异 + +1. 分布式会话是基于分布式软总线的能力在双端设备之间进行会话信息的同步;投播能力基于Cast+的能力进行数据传输和信息同步,支持的设备类型更丰富。 +2. 分布式会话投播音频,需要由用户先进行双端设备的连接;投播成功后,应用在本端设备的控制和本地播放类似,而投播能力支持在远端设备进行播放的展示,体验上会更有优势。 +3. 分布式会话仅支持音频投播,不支持视频投播;投播能力后续会扩展,将支持视频投播。 \ No newline at end of file diff --git a/zh-cn/application-dev/media/figures/cast-interaction-diagram.png b/zh-cn/application-dev/media/figures/cast-interaction-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..e8644144a00b747d3508244e81059e1388e301be GIT binary patch literal 79270 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: void | 获取远端投播时的控制接口。| +| on(type: 'outputDeviceChange', callback: (state: ConnectionState, device: OutputDeviceInfo) => void): void | 注册设备变化的回调,同时包含了设备的连接状态。| +| sendControlCommand(command: AVCastControlCommand, callback: AsyncCallback\): void | 投播会话的控制接口,用于进行投播中的各种播控指令 | +| prepare(item: AVQueueItem, callback: AsyncCallback\): void | 准备播放,进行资源加载和缓冲,不会触发真正的播放 | +| start(item: AVQueueItem, callback: AsyncCallback\): void | 开始播放媒体资源 | +| on(type: 'playbackStateChange', filter: Array\ \| 'all', callback: (state: AVPlaybackState) => void) | 注册播放状态变化的回调 | +| on(type: 'mediaItemChange', callback: AsyncCallback\): void | 注册当前播放内容更新的回调,返回当前播放的内容的信息。| + +>**说明:** +> +> AVCastController由系统获取并返回,在设备连接成功后获取,在设备断开后不能继续使用,否则会抛出异常。 + +## 开发步骤 + +1. 创建播放器,并创建AVSession。 + + 通过AVSessionManager创建并激活媒体会话。 + + ```ts + import AVSessionManager from '@ohos.multimedia.avsession'; //导入AVSession模块 + + // 创建session + async createSession() { + let session: AVSessionManager.AVSession = await AVSessionManager.createAVSession(this.context, 'SESSION_NAME', 'audio'); + session.activate(); + console.info(`session create done : sessionId : ${session.sessionId}`); + } + ``` + +2. 在需要投播的播放界面创建投播组件AVCastPicker。 + + ```ts + // 创建组件,并设置大小 + build() { + Row() { + Column() { + AVCastPicker() + .width('40vp') + .height('40vp') + .border({ width: 1, color: Color.Red }) + } + } + } + ``` + +3. 设置AVSession的信息,注册AVSession的回调。用于感知投播连接。 + + ```ts + async setListenerFromController() { + let session: AVSessionManager.AVSession = ALLREADY_CREATE_A_SESSION; + + // 对于应用来说,可以在每次更新资源的时候,设置设备过滤器,以通知系统进行设备选择界面的呈现 + // 如果应用不需要,或者不设置,系统会按照默认的设备策略进行展示 + // 设备过滤,一般是由应用根据播放的资源指定能够支持的投播设备 + // 通过extras 的 deviceFilter 设置设备过滤条件 + let extras = { + deviceFilter: AVCastDeviceCategory.DEVICE_CAPABILITY_CAST_STREAM; + } + await session.setExtras(extras).then(() => { + console.info(`Set extras successfully`); + }).catch((err) => { + console.error(`Failed to set extras. Code: ${err.code}, message: ${err.message}`); + }) + + // 监听设备连接状态的变化 + session.on("outputDeviceChange", (state, device) => { + if (state == AVCastState.STATE_CONNECTED) { // 设备连接成功 + global.avcastcontroller = avsession.getAVCastController(); + console.info('get a cast controller successfully'); + console.info(`device connected ` + ${JSON.stringify(device)}); + + // 设置播放参数,开始播放 + var playItem = { + itemId: 0, + description: { + mediaId: '12345', + mediaName: 'song1', + mediaType: 'AUDIO', + mediaUri: 'http://resource1_address', + mediaSize: 12345, + startPosition: 0, + duration: 0, + artist: 'mysong', + albumTitle: 'song1_title', + albumCoverUri: "http://resource1_album_address", + lyricUri: "http://resource1_lyric_address", + iconUri: "http://resource1_icon_address", + appName: 'MyMusic' + } + }; + // 准备播放,这个不会触发真正的播放,会进行加载和缓冲 + global.avcastcontroller.prepare(playItem, () => { + console.info('prepare done'); + }); + // 启动播放 + global.avcastcontroller.start(playItem, () => { + console.info('play done'); + }); + + // 列表里的第一首歌曲投播的时候,本端的Player要停止 + this.localplayer.stop(); + + // 本端投播后的应用界面由应用进行专辑图、歌手等信息的刷新 + + // 远端状态的回调,这个回调需要应用进行界面刷新,而不需要执行控制操作 + // 回调包括播放状态,播放位置,播放速度,播放模式等 + global.avcontroller.on('playbackStateChange', filter: 'all', (state) => { + console.info('playbackStateChange ' + state); + }); + // 用于响应远端进行上一首、下一首 + global.avcontroller.on('playNext', () => { + // 应用根据列表顺序,更新新的资源进行播放 + var nextPlayItem = { + itemId: 2, + description: { + mediaId: '12345', + mediaName: 'song2', + mediaType: 'AUDIO', + mediaUri: 'http://resource2_address', + mediaSize: 12345, + startPosition: 0, + duration: 0, + artist: 'mysong', + albumTitle: 'song2_title', + albumCoverUri: "http://resource2_album_address", + lyricUri: "http://resource2_lyric_address", + iconUri: "http://resource2_icon_address", + appName: 'MyMusic' + } + }; + // 准备播放 + global.avcastcontroller.prepare(nextPlayItem, () => { + console.info('prepare done'); + }); + // 启动播放 + global.avcastcontroller.start(nextPlayItem, () => { + console.info('play done'); + }); + }); + } + } + + // 可以通过getOutputDevice接口主动查询连接的设备 + session.getOutputDevice((device) => { + console.info(`current routing device` + ${JSON.stringify(device)}); + }); + } + ``` + +4. 通过AVSession获取投播控制器AVCastController,用于控制应用内的播放。 + + ```ts + async sendCommandToSessionByController() { + // 记录从avsession获取的远端控制器 + // 下发播放命令 + let avCommand: AVSessionManager.AVCastControlCommand = {command:'play'}; + global.avcontroller.sendControlCommand(avCommand); + + // 下发暂停命令 + let avCommand: AVSessionManager.AVCastControlCommand = {command:'pause'}; + global.avcontroller.sendControlCommand(avCommand); + + // 播放、暂停等的操作,可以通过状态的回调接口获取到,然后进行本端界面的刷新 + } + ``` + +5. 申请投播长时任务,避免应用在投播进入后台时被系统冻结,导致无法持续投播。 + + ```ts + import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager'; + import wantAgent from '@ohos.app.ability.wantAgent'; + + function startContinuousTask() { + let wantAgentInfo = { + // 点击通知后,将要执行的动作列表 + wants: [ + { + bundleName: "com.example.myapplication", + abilityName: "EntryAbility", + } + ], + // 点击通知后,动作类型 + operationType: wantAgent.OperationType.START_ABILITY, + // 使用者自定义的一个私有值 + requestCode: 0, + // 点击通知后,动作执行属性 + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] + }; + + // 通过wantAgent模块的getWantAgent方法获取WantAgent对象 + try { + wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { + try { + backgroundTaskManager.startBackgroundRunning(mContext, + backgroundTaskManager.BackgroundMode.MULTI_DEVICE_CONNECTION, wantAgentObj).then(() => { + console.info("Operation succeeded"); + }).catch((error) => { + console.error(`Operation failed. code is ${error.code} message is ${error.message}`); + }); + } catch (error) { + console.error(`Operation failed. code is ${error.code} message is ${error.message}`); + } + }); + } catch (error) { + console.error(`Operation getWantAgent failed. code is ${error.code} message is ${error.message}`); + } + } + ``` + +6. 音频焦点的处理。请参考[多音频并发处理](audio-playback-concurrency.md)。 + + 在应用进入投播后,当前应用需要去注册焦点处理,以免被其他应用的焦点申请而影响。 + + **当前投播支持全局切换,后续如果规格变更,再同步调整方案说明。** + +7. 结束投播。 + + 当远端设备断开的时候,应用会收到事件,系统会自动断开连接。 + + 应用也可以使用断开投播的接口,主动进行投播连接的断开。 + + ```ts + async release() { + // 一般来说,应用退出时,而不希望继续投播,可以主动结束 + await global.avsession.stopCast(); + } + ``` diff --git a/zh-cn/application-dev/media/using-avsession-avcast.md b/zh-cn/application-dev/media/using-avsession-avcast.md deleted file mode 100644 index 2d33da6d87..0000000000 --- a/zh-cn/application-dev/media/using-avsession-avcast.md +++ /dev/null @@ -1,307 +0,0 @@ -# 音视频投播开发 - -鸿蒙提供了统一的应用内音视频投播功能设计,通过提供投播组件和标准的接口,使得应用进行跨端投播音视频资源变得简单便捷。同时,系统默认支持Cast+协议,有效提升了投播体验。使用系统提供的投播组件和接口后,应用仅需要负责进行资源信息的设置,投播中部分状态的监听,以及应用主动控制的行为,如播放、暂停、切换资源等,其他动作包括图标切换,设备的发现、连接、认证等,都由系统统一负责完成。 - - -## 基本概念 - -- 媒体会话(AVSession):本地播放时用于进行媒体播放中的信息的更新和对系统播控中心的控制响应,[媒体会话提供方接入参考](using-avsession-developer.md)。 在投播时,AVSession用于在本地播放和投播之间切换的“枢纽”接口,把二者联系起来,即在本地播放时,如果接收到远端设备的连接状态,则应用感知到远端投播场景,进入到远端投播状态。通过AVSession可以进行应用投播能力的设置和查询,并进行投播控制器的创建。 -- 投播组件[AVCastPicker](../reference/apis/js-apis-avcastpicker.md):应用用于创建系统级的投播组件,嵌入在应用内界面,当用户点击后,由系统负责进行设备发现、连接、认证,应用只需要通过接口获取到投播中的状态回调。 -- 投播控制器[AVCastController](../reference/apis/js-apis-avsession.md):在投播后,由应用发起的对远端播放控制的接口,包括播放、暂停、调节音量、设置播放模式、设置播放速度等能力。 -- 后台长时任务:进行投播时应用后台任务的申请,避免应用在投播后被系统后台清理或冻结。后台长时任务[开发参考](../task-management/continuous-task-dev-guide.md)。 - -## 接入说明 - -- 基本原则 - -应用需要接入AVSession才可以使用系统提供的统一投播能力。系统不额外提供音视频设备发现的接口由应用选择和切换,需要通过系统提供的接口进行音视频的投播接入。 - -- 详细说明 - -鸿蒙系统把本地播控和远端投播融合归一到AVSession中,体现了系统的统一设计。使用系统提供的统一投播组件,应用可以减少对设备发现连接的关注,而只需要关注连接设备是否在远端进行。当用户通过投播组件,选择了某个远端设备并连接成功,应用会通过回调接口获取到该设备连接成功的事件,然后可以创建一个“远端遥控器” AVCastController,从而实现对远端设备播放的控制操作。当进入到远端设备投播状态时,应用也可以对应用界面进行重新绘制,比如呈现遥控器状态。一个比较好的体验是,在进入远端投播时,本地的播放器最好停止,以防止本端和投播端设备同时播放的情形。 - -对于本端和远端设备的场景的区分,参考 AVCastCategory 的定义: - -```ts -/** - * The default cast type "local", media can be routed on the same device, - * including internal speakers or audio jacks on the device itself, A2DP devices. - */ -CATEGORY_LOCAL = 0, - -/** - * The remote category indicating the media is presenting on a different device - * the application need get an AVCastController to control remote playback. - */ -CATEGORY_REMOTE = 1, -``` - -本次的投播能力和已有的分布式会话有什么关联和区别? - -1. 分布式会话是基于分布式软总线的能力在双端设备之间进行会话信息的同步,投播能力基于Cast+的能力进行数据传输和信息同步,支持的设备类型更丰富; -2. 分布式会话投播音频投播成功后,远端无对应信息展示,仅有声音会传输到对端设备;而投播能力支持在远端设备进行播放的展示,体验上会更有优势; -2. 投播能力当前支持音频,长期会支持视频,这个是分布式会话不支持的; -3. 分布式会话能力长期会融入到投播能力中,由系统提供统一的接口包装,更容易接入和使用。 - -## 接口说明 - -接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。 - -### 投播组件接口 - -更多API说明请参见[API文档](../reference/apis/js-apis-avcastpicker.md)。 - -| 接口 | 说明 | -| -------- | -------- | -| AVCastPicker |投播组件的定义 | - -### 投播相关的主要接口 - -更多API说明请参见[API文档](../reference/apis/js-apis-avsession.md)。 - -| 接口定义 | 说明 | -| -------- | -------- | -| getAVCastController(callback: AsyncCallback\): void; | 获取远端投播时的控制接口。| -| on(type: 'outputDeviceChange', callback: (state: ConnectionState, device: OutputDeviceInfo) => void): void; | 注册设备变化的回调,同时包含了设备的连接状态。| -| sendControlCommand(command: AVCastControlCommand, callback: AsyncCallback\): void; | 投播会话的控制接口,用于进行投播中的各种播控指令 | -| prepare(item: AVQueueItem, callback: AsyncCallback): void | 准备播放,进行资源加载和缓冲,不会触发真正的播放 | -| start(item: AVQueueItem, callback: AsyncCallback): void | 开始播放媒体资源 | -| on(type: 'playbackStateChange', filter: Array\ \| 'all', callback: (state: AVPlaybackState) => void) | 注册播放状态变化的回调 | -| on(type: 'mediaItemChange', callback: AsyncCallback\): void; | 注册当前播放内容更新的回调,返回当前播放的内容的信息。| - -Note: - -*AVCastController由系统获取并返回,在设备连接成功后获取,在设备断开后不能继续使用,否则会抛出异常* - - -## 应用开发步骤 - -应用接入投播功能,分为如下几步: - -1. 创建AVSession,既可以用于本地,也用于投播的实现 -2. 在需要投播的播放界面绘制投播组件 -3. 向AVSession注册设备投播过程状态的回调,感知投播连接 -4. 通过AVSession获取投播控制器,进行投播中的播放控制 -5. 投播启动后,应用需要进行长时任务的申请 -6. 投播结束后,销毁过程对象 - -### 接入效果展示 - -![Cast Demo](figures/cast-demo.png) - -### 应用接入示意 - -![Cast Interaction Diagram](figures/cast-interaction-diagram.png) - -### 进入投播和远端控制响应 - -1. 创建播放器,并创建AVSession,通过AVSessionManager的方法创建并激活媒体会话。 - -```ts -import AVSessionManager from '@ohos.multimedia.avsession'; //导入AVSession模块 - -// 创建session -async createSession() { - let session: AVSessionManager.AVSession = await AVSessionManager.createAVSession(this.context, 'SESSION_NAME', 'audio'); - session.activate(); - console.info(`session create done : sessionId : ${session.sessionId}`); -} -``` - -2. 在播放页面创建投播组件。 - -```ts -// 创建组件,并设置大小 -build() { - Row() { - Column() { - AVCastPicker() - .width('40vp') - .height('40vp') - .border({ width: 1, color: Color.Red }) - } - } -} -``` - -3. 设置AVSession的信息,注册AVSession的回调: - -```ts -async setListenerFromController() { - let session: AVSessionManager.AVSession = ALLREADY_CREATE_A_SESSION; - - // 对于应用来说,可以在每次更新资源的时候,设置设备过滤器,以通知系统进行设备选择界面的呈现 - // 如果应用不需要,或者不设置,系统会按照默认的设备策略进行展示 - // 设备过滤,一般是由应用根据播放的资源指定能够支持的投播设备 - // 通过extras 的 deviceFilter 设置设备过滤条件 - let extras = { - deviceFilter: AVCastDeviceCategory.DEVICE_CAPABILITY_CAST_STREAM; - } - await session.setExtras(extras).then(() => { - console.info(`Set extras successfully`); - }).catch((err) => { - console.error(`Failed to set extras. Code: ${err.code}, message: ${err.message}`); - }) - - // 监听设备连接状态的变化 - session.on("outputDeviceChange", (state, device) => { - if (state == AVCastState.STATE_CONNECTED) { // 设备连接成功 - global.avcastcontroller = avsession.getAVCastController(); - console.info('get a cast controller successfully'); - console.info(`device connected ` + ${JSON.stringify(device)}); - - // 设置播放参数,开始播放 - var playItem = { - itemId: 0, - description: { - mediaId: '12345', - mediaName: 'song1', - mediaType: 'AUDIO', - mediaUri: 'http://resource1_address', - mediaSize: 12345, - startPosition: 0, - duration: 0, - artist: 'mysong', - albumTitle: 'song1_title', - albumCoverUri: "http://resource1_album_address", - lyricUri: "http://resource1_lyric_address", - iconUri: "http://resource1_icon_address", - appName: 'MyMusic' - } - }; - // 准备播放,这个不会触发真正的播放,会进行加载和缓冲 - global.avcastcontroller.prepare(playItem, () => { - console.info('prepare done'); - }); - // 启动播放 - global.avcastcontroller.start(playItem, () => { - console.info('play done'); - }); - - // 列表里的第一首歌曲投播的时候,本端的Player要停止 - this.localplayer.stop(); - - // 本端投播后的应用界面由应用进行专辑图、歌手等信息的刷新 - - // 远端状态的回调,这个回调需要应用进行界面刷新,而不需要执行控制操作 - // 回调包括播放状态,播放位置,播放速度,播放模式等 - global.avcontroller.on('playbackStateChange', filter: 'all', (state) => { - console.info('playbackStateChange ' + state); - }); - // 用于响应远端进行上一首、下一首 - global.avcontroller.on('playNext', () => { - // 应用根据列表顺序,更新新的资源进行播放 - var nextPlayItem = { - itemId: 2, - description: { - mediaId: '12345', - mediaName: 'song2', - mediaType: 'AUDIO', - mediaUri: 'http://resource2_address', - mediaSize: 12345, - startPosition: 0, - duration: 0, - artist: 'mysong', - albumTitle: 'song2_title', - albumCoverUri: "http://resource2_album_address", - lyricUri: "http://resource2_lyric_address", - iconUri: "http://resource2_icon_address", - appName: 'MyMusic' - } - }; - // 准备播放 - global.avcastcontroller.prepare(nextPlayItem, () => { - console.info('prepare done'); - }); - // 启动播放 - global.avcastcontroller.start(nextPlayItem, () => { - console.info('play done'); - }); - }); - } - } - - // 可以通过getOutputDevice接口主动查询连接的设备 - session.getOutputDevice((device) => { - console.info(`current routing device` + ${JSON.stringify(device)}); - }); -} -``` - -4. 使用AVCastController进行应用内的播放控制: - -```ts -async sendCommandToSessionByController() { - // 记录从avsession获取的远端控制器 - // 下发播放命令 - let avCommand: AVSessionManager.AVCastControlCommand = {command:'play'}; - global.avcontroller.sendControlCommand(avCommand); - - // 下发暂停命令 - let avCommand: AVSessionManager.AVCastControlCommand = {command:'pause'}; - global.avcontroller.sendControlCommand(avCommand); - - // 播放、暂停等的操作,可以通过状态的回调接口获取到,然后进行本端界面的刷新 -} -``` - -5. 申请投播长时任务,避免应用在投播进入后台时被系统冻结,导致无法持续投播 - -```ts -import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager'; -import wantAgent from '@ohos.app.ability.wantAgent'; - -function startContinuousTask() { - let wantAgentInfo = { - // 点击通知后,将要执行的动作列表 - wants: [ - { - bundleName: "com.example.myapplication", - abilityName: "EntryAbility", - } - ], - // 点击通知后,动作类型 - operationType: wantAgent.OperationType.START_ABILITY, - // 使用者自定义的一个私有值 - requestCode: 0, - // 点击通知后,动作执行属性 - wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] - }; - - // 通过wantAgent模块的getWantAgent方法获取WantAgent对象 - try { - wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { - try { - backgroundTaskManager.startBackgroundRunning(mContext, - backgroundTaskManager.BackgroundMode.MULTI_DEVICE_CONNECTION, wantAgentObj).then(() => { - console.info("Operation succeeded"); - }).catch((error) => { - console.error(`Operation failed. code is ${error.code} message is ${error.message}`); - }); - } catch (error) { - console.error(`Operation failed. code is ${error.code} message is ${error.message}`); - } - }); - } catch (error) { - console.error(`Operation getWantAgent failed. code is ${error.code} message is ${error.message}`); - } -} -``` - -6. 音频焦点的处理 - -在应用进入投播后,当前应用需要去注册焦点处理,以免被其他应用的焦点申请而影响。 -**当前投播支持全局切换,后续如果规格变更,再同步调整方案说明** - -7. 结束投播 - -当远端设备断开的时候,应用会收到事件,系统会自动断开连接。 - -应用也可以使用断开投播的接口,主动进行投播连接的断开。 - -```ts -async release() { - // 一般来说,应用退出时,而不希望继续投播,可以主动结束 - await global.avsession.stopCast(); -} -``` \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis/js-apis-avcastpicker.md b/zh-cn/application-dev/reference/apis/js-apis-avcastpicker.md deleted file mode 100644 index 8b8402a2c8..0000000000 --- a/zh-cn/application-dev/reference/apis/js-apis-avcastpicker.md +++ /dev/null @@ -1,37 +0,0 @@ -# @ohos.avcastpicker (AVCastPicker) - -本模块提供创建投播组件的功能,提供了设备发现连接的统一入口。 - -> **说明:** -> -> 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 -> -> 示例效果请以真机运行为准,当前IDE预览器不支持。 - -## 导入模块 - -```js -import { AVCastPicker} from '@ohos.avcastpicker'; -``` - -**系统能力:** SystemCapability.Multimedia.AVSession - -**示例:** -```ts -import { AVCastPicker } from '@ohos.avcastpicker' - -@Entry -@Component -struct Index { - build() { - Row() { - Column() { - AVCastPicker() - .width('40vp') - .height('40vp') - .border({ width: 1, color: Color.Red }) - }.height('50%') - }.width('50%') - } -} -``` diff --git a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md index f0170225f5..7607178d54 100644 --- a/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md +++ b/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md @@ -156,6 +156,8 @@ - [OffscreenCanvas](ts-components-offscreencanvas.md) - [OffscreenCanvasRenderingContext2D对象](ts-offscreencanvasrenderingcontext2d.md) - [Path2D对象](ts-components-canvas-path2d.md) +- 高级组件 + - [@ohos.avcastpicker (投播组件)](ohos-avcastpicker.md) - 动画 - [属性动画](ts-animatorproperty.md) - [显式动画](ts-explicit-animation.md) diff --git a/zh-cn/application-dev/reference/arkui-ts/ohos-avcastpicker.md b/zh-cn/application-dev/reference/arkui-ts/ohos-avcastpicker.md new file mode 100644 index 0000000000..557059562d --- /dev/null +++ b/zh-cn/application-dev/reference/arkui-ts/ohos-avcastpicker.md @@ -0,0 +1,55 @@ +# @ohos.avcastpicker (投播组件) + +本模块提供创建投播组件AVCastPicker的功能,提供设备发现连接的统一入口。 + +> **说明:** +> +> - 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 +> - 示例效果请以真机为准,当前不支持使用IDE预览器。 + +## 导入模块 + +```js +import { AVCastPicker} from '@ohos.avcastpicker'; +``` + +## 接口 + +AVCastPicker() + +投播组件,可用于将音视频资源投放到其它设备播放。 + +该组件为自定义组件,开发者在使用前需要先了解[@component](../../quick-start/arkts-create-custom-components.md)。 + +**系统能力:** SystemCapability.Multimedia.AVSession + +## 属性 + +支持[通用属性](ts-universal-attributes-size.md)。 + +## 事件 + +支持[通用事件](ts-universal-events-click.md)。 + +## 示例 + +投播功能的示例说明请参考[音视频投播](avcastpicker-overview.md)。 + +```ts +import { AVCastPicker } from '@ohos.avcastpicker' + +@Entry +@Component +struct Index { + build() { + Row() { + Column() { + AVCastPicker() + .width('40vp') + .height('40vp') + .border({ width: 1, color: Color.Red }) + }.height('50%') + }.width('50%') + } +} +``` -- GitLab