播控特性简介
使用媒体播控,可以简单高效地将音视频投放到其他HarmonyOS设备上播放,如在手机上播放的音视频,可以投到2in1设备上继续播放。
HarmonyOS提供了统一的应用内音视频投播功能设计,通过使用系统提供的投播组件和接口,应用只需要设置对应的资源信息、监听投播中的相关状态,以及应用主动控制的行为(如:播放、暂停)。其他动作包括图标切换、设备的发现、连接、认证等,均由系统完成。
基本概念
-
媒体会话(AVSession)
音视频管控服务,用于对系统中所有音视频行为进行统一的管理。
本地播放时,应用需要向媒体会话提供播放的媒体信息(如正在播放的歌曲、歌曲的播放状态等),并接收和响应播控中心发出的控制命令(如暂停、下一首等)。具体请参考本地媒体会话。
投播时,通过AVSession,应用可以进行投播能力的设置和查询,并创建投播控制器。
应用可以在启动内容显示(比如:视频播放)时,获取支持投播的扩展屏设备并注册监听,当存在扩展屏时,可在扩展屏上全屏绘制要投播的内容。
-
投播组件(AVCastPicker)
系统级的投播组件,可嵌入应用界面的UI组件。当用户点击该组件后,系统将进行设备发现、连接、认证等流程,应用仅需要通过接口获取投播中相关的回调信息。
-
投播控制器(AVCastController)
在投播后,由应用发起的用于控制远端播放的接口,包括播放、暂停、调节音量、设置播放模式、设置播放速度等能力。
-
后台长时任务
应用实现后台播放,需申请后台长时任务,避免应用在投播后被系统后台清理或冻结。具体参考长时任务。
运作机制
-
发现和连接设备
用户在应用界面上点击AVCastPicker组件,触发系统发现可用于投播的设备。用户在设备列表中选择对应设备后,系统连接对应设备。应用无需关注设备的发现连接过程,仅需关注设备在远端是否可用。
应用需要接入AVSession,才可以使用系统提供的统一投播能力,由系统进行设备发现和管理。
-
进入远端投播
应用通过AVSession监听设备的连接情况,监听到设备已连接后,可通过AVSession获取一个AVCastController对象用于发送控制命令(如播放、暂停、下一首等)。
应用在进入远端投播时,应停止本地的播放器,避免本端和远端设备同时播放的情况。同时,建议应用重新绘制应用界面,比如界面变更为一个遥控器,来控制远端播放。
-
在本端控制播放
在本端(包括应用内和播控中心)控制播放时,控制命令将通过AVCastController发送,系统将完成数据传输和信息同步,然后更新远端系统预置播放器的状态。
-
在远端控制播放
用户同样可以在远端直接控制播放,会直接修改远端播放器的状态。
-
远端播放器状态回调
当远端播放器状态变更后,会触发回调,将状态信息返回到本端。应用可以通过AVCastController监听到远端播放器的状态变化。
投播组件开发指导
通过本开发指导,完成一次音视频跨设备投播。
约束与限制
需同时满足以下条件,才能使用该功能:
-
设备限制
本端设备:HarmonyOS NEXT Developer Preview0及以上版本的手机设备
远端设备:HarmonyOS NEXT Developer Preview0及以上版本的2in1设备/华为智慧屏HarmonyOS3.1及以上版本
-
使用限制
- 双端设备打开蓝牙和WIFI,并可访问网络。
接口说明
在开发具体功能前,请先查阅参考文档,获取详细的接口说明。
- AVCastPicker:投播组件,提供设备发现认证连接的统一入口。
- AVCastController:投播控制器,用于投播场景下,完成播放控制、远端播放状态监听等操作。
说明
AVCastController由系统获取并返回,在设备连接成功后获取,在设备断开后不能继续使用,否则会抛出异常。
支持在线DRM视频资源投播能力,需注册DRM许可证请求回调函数,获取许可证后,调用处理许可证响应函数。
开发步骤
-
创建播放器,并创建AVSession。
通过AVSessionManager创建并激活媒体会话。
示例中的context的获取方式请参见获取UIAbility的上下文信息。
import { avSession } from '@kit.AVSessionKit'; // 导入AVSession模块
// 声明全局的session对象,此写法是加在class类外的声明,如果需要在class类内申明全局变量,需要去掉 export let
export let session: avSession.AVSession;
// 创建session
async createSession(context: Context) {
session = await avSession.createAVSession(context, 'video_test', 'video'); // 'audio'代表音频应用,'video'代表视频应用
await session.activate();
// 需要将应用加入支持投播的应用名单中,才能成功投播。
session.setExtras({
requireAbilityList: ['url-cast'],
});
console.info(`Session created. sessionId: ${session.sessionId}`);
}
- 设置媒体资源信息。
说明
需要在AVCastPicker中仅显示支持DRM资源投播的设备时,应在AVMetaData设置明确的drmSchemes。
// 与session声明不在同一文件时,需要import
import { session } from './xxx'; // session声明的文件
public setAVMetadata(playInfo: avSession.AVMediaDescription): Promise<void> {
const metadata: avSession.AVMetadata = {
assetId: playInfo.assetId, // 需要配置实际id
title: playInfo.title, // 播放媒体资源的标题
subtitle: playInfo.subtitle,// 播放媒体资源的副标题
// 发现Cast+ Stream 和 DLNA协议设备,TYPE_CAST_PLUS_STREAM为默认必选。
filter: avSession.ProtocolType.TYPE_CAST_PL