【HarmonyOS实战开发】鸿蒙分布式媒体会话-使用投播组件

播控特性简介

使用媒体播控,可以简单高效地将音视频投放到其他HarmonyOS设备上播放,如在手机上播放的音视频,可以投到2in1设备上继续播放。

HarmonyOS提供了统一的应用内音视频投播功能设计,通过使用系统提供的投播组件和接口,应用只需要设置对应的资源信息、监听投播中的相关状态,以及应用主动控制的行为(如:播放、暂停)。其他动作包括图标切换、设备的发现、连接、认证等,均由系统完成。

基本概念

  • 媒体会话(AVSession)

    音视频管控服务,用于对系统中所有音视频行为进行统一的管理。

    本地播放时,应用需要向媒体会话提供播放的媒体信息(如正在播放的歌曲、歌曲的播放状态等),并接收和响应播控中心发出的控制命令(如暂停、下一首等)。具体请参考本地媒体会话。

    投播时,通过AVSession,应用可以进行投播能力的设置和查询,并创建投播控制器。

    应用可以在启动内容显示(比如:视频播放)时,获取支持投播的扩展屏设备并注册监听,当存在扩展屏时,可在扩展屏上全屏绘制要投播的内容。

  • 投播组件(AVCastPicker)

    系统级的投播组件,可嵌入应用界面的UI组件。当用户点击该组件后,系统将进行设备发现、连接、认证等流程,应用仅需要通过接口获取投播中相关的回调信息。

  • 投播控制器(AVCastController)

    在投播后,由应用发起的用于控制远端播放的接口,包括播放、暂停、调节音量、设置播放模式、设置播放速度等能力。

  • 后台长时任务

    应用实现后台播放,需申请后台长时任务,避免应用在投播后被系统后台清理或冻结。具体参考长时任务。

运作机制

image.png

  • 发现和连接设备

    用户在应用界面上点击AVCastPicker组件,触发系统发现可用于投播的设备。用户在设备列表中选择对应设备后,系统连接对应设备。应用无需关注设备的发现连接过程,仅需关注设备在远端是否可用。

    应用需要接入AVSession,才可以使用系统提供的统一投播能力,由系统进行设备发现和管理。

  • 进入远端投播

    应用通过AVSession监听设备的连接情况,监听到设备已连接后,可通过AVSession获取一个AVCastController对象用于发送控制命令(如播放、暂停、下一首等)。

    应用在进入远端投播时,应停止本地的播放器,避免本端和远端设备同时播放的情况。同时,建议应用重新绘制应用界面,比如界面变更为一个遥控器,来控制远端播放。

  • 在本端控制播放

    在本端(包括应用内和播控中心)控制播放时,控制命令将通过AVCastController发送,系统将完成数据传输和信息同步,然后更新远端系统预置播放器的状态。

  • 在远端控制播放

    用户同样可以在远端直接控制播放,会直接修改远端播放器的状态。

  • 远端播放器状态回调

    当远端播放器状态变更后,会触发回调,将状态信息返回到本端。应用可以通过AVCastController监听到远端播放器的状态变化。

投播组件开发指导

通过本开发指导,完成一次音视频跨设备投播。

约束与限制

需同时满足以下条件,才能使用该功能:

  • 设备限制

    本端设备:HarmonyOS NEXT Developer Preview0及以上版本的手机设备

    远端设备:HarmonyOS NEXT Developer Preview0及以上版本的2in1设备/华为智慧屏HarmonyOS3.1及以上版本

  • 使用限制

    • 双端设备打开蓝牙和WIFI,并可访问网络。

接口说明

在开发具体功能前,请先查阅参考文档,获取详细的接口说明。

  • AVCastPicker:投播组件,提供设备发现认证连接的统一入口。
  • AVCastController:投播控制器,用于投播场景下,完成播放控制、远端播放状态监听等操作。

说明
AVCastController由系统获取并返回,在设备连接成功后获取,在设备断开后不能继续使用,否则会抛出异常。

支持在线DRM视频资源投播能力,需注册DRM许可证请求回调函数,获取许可证后,调用处理许可证响应函数。

image.png

开发步骤

  1. 创建播放器,并创建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}`);
}
  1. 设置媒体资源信息。

说明
需要在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值