跳转至

Harmony播放器SDK集成


本文档主要介绍如何在鸿蒙系统(HarmonyOS Next)集成芒果自研播放器SDK,包含本播放sdk集成综述开发环境搭建播放器SDK能力介绍集成指南API参考Demo实例、[FAQ]等章节。为开发者提供一站式的音视频播放app开发指导。

本播放sdk集成综述

提示

在当前播放sdk的接入之前,建议开发者先了解音视频播放相关概念及知识,希望开发者对harmony next系统有一定认知,对ArkTs语言及DevEco Studio中工程架构有一定研发能力。

在开发音乐、视频播放功能之前,建议了解流媒体播放的相关概念包括但不限于:
- 播放过程:网络协议 > 容器格式 > 音视频编解码及系统支持情况
- 网络协议:比如HLS、HTTP/HTTPS
- 容器格式:比如mp4,mkv,mpeg-ts,webm,m3u8
- 编码格式:比如h264/h265
- 图形/音频渲染方案:系统渲染/openGL/vulkan

在开发harmony os app之前,建议了解华为harmony os的相关概念包括但不限于:
- harmony os:基于AOSP的市面上已发布的harmony 2.0/3.0系统,基于js内核的harmony4.0/4.1系统
- arkTs:javascript > typescript > arkTs
- artUI:基于arkTs的ui系统
- harmony os app project工程架构:sdk的引用模式 > har/hsp

开发环境搭建

1、HarmonyOS Next开发者资质获取

需要自行在华为开发者官网注册华为开发者账号,并提供给华为工作人员开通HarmonyOS Next开发权限。

2、下载IDE+SDK

需要在开发者货架下载对应开发环境IDE+SDK的zip包。

3、环境变量配置

提示

鸿蒙开发环境需要nodejs环境,调试logcat输出需要hdc环境,需要配置以下环境变量,以macOS为例,在.bash_profile或者.zshrc文件中添加以下命令:

#deveco 
export PATH=$PATH:/Users/lusiyuan/Library/Huawei/sdk/openharmony/10/toolchains
export CLASSPATH
HDC_SERVER_PORT=7035
export HDC_SERVER_PORT
export NODE_PATH=/Users/lusiyuan/nodejs
export PATH=$NODE_PATH/bin:${PATH}
#deveco

4、真机调试

提示

HarmonyOS Next当前未面向用户发布,且DevEco Studio中模拟器也暂不可使用,只能使用华为方提供的开发板(烧录HarmonyOS Next系统的设备)进行真机调试,且真机os与IDE\SDK版本需一一对应。当前自研播放器sdk对应的环境版本:

IDE version: DevEco Studio 4.0 Release Build Version: 4.0.3.700, built on November 19, 2023  
真机OS version: 4.0.600

播放器SDK能力介绍

已支持 开发/完善中 未规划
播放内核 鸿蒙系统播放器、芒果自研播放器 / /
文件格式 m3u8、mp4、mp3 / /
编码格式 h264、h265 / /
网络协议 http/https/hls / /
解码方式 软解码 硬解码 /
视频渲染类型 surface component /
本地播放 raw资源、本地file media资源 / /
播放质量上报 ppv/pvv/pend/perr / /
流量上报 自研播放器已实现 / /
播放远程开关 解码方式、渲染类型、播放内核 / /

集成指南

Step1. 需要引用播放器sdk的module的 oh-package.json5 文件中配置

 "dependencies": {
    "player-core": "file:libs/playercore.har" // player-core 为项目别名,可自定义
 }
Step2. module.json5 文件中申请权限
"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET" // 网络播放权限,一般必须添加
  },
  {
    "name": "ohos.permission.GET_WIFI_INFO"// 获取网络状态权限,一般必须添加
  },
  {
    "name": 'ohos.permission.READ_MEDIA'// 读本地媒资权限,有本地播放业务则必须添加
  },
  {
    "name": 'ohos.permission.WRITE_MEDIA'// 写本地媒资权限,有缓存到本地并且从本地播放的业务则必须添加
  },
  {
    "name": 'ohos.permission.GET_BUNDLE_INFO'// 查询指定应用信息,一般必须添加
  }
]

Step3.冷启动进程(一般为应用启动EntryAbility.ets)中初始化播放器sdk

MgPlayerSdkStarter.get(getContext(this)).init(channel?: string, did?: string);

Step4.加载芒果播放器控件到ets页面

@Builder
  InitVodComponent() {
    // 构造播放器控件,传起播设置及参数
    MgtvComponent({
      videoUrl: url, // 网络播放链接
      fileDescriptor: this.fileDescriptor, // 本地播放file
      playSpeed: PlaySpeed.SPEED_FORWARD_1_00_X,
      isLoop: playconfig?.isLoop,
      isMute: false,
      isAudio: playconfig?.isAudio,
      // isUseP2p: true, // todo??
      isAutoPlay: playconfig?.isAutoPlay,// 是否自动播放
      currentVideoScaleType: playconfig?.scaletype,// 播放画幅比例
      videoPlayerController: this.playerController,// 播放controller

      businessType: playconfig?.useSystemPlayer ? BusinessType.BUSINESS_TYPE_SIMPLE : BusinessType.BUSINESS_TYPE_VOD,
      callback: (event: string, mgplayer: MgVideoPlayer) => { // 所有回调事件
        if (event != PlayEvent.TIME_UPDATE && event != PlayEvent.CACHED_DURATION && event != PlayEvent.BUFFER_PERCENT) {
          Logger.info('************lusiyuan************', 'get event from module : ' + event);
        }
        switch (event) {
          case PlayEvent.TIME_UPDATE: // 自研播放器没有这个事件
          // this.currentTime = mgplayer.currentTime;
            break;
          case PlayEvent.STATE_IDLE:
            break;
          case PlayEvent.STATE_INIT:
            this.setReportParams() // 模拟设置上报
            break
          case PlayEvent.STATE_PREPARED:
            this.durationTime = mgplayer.duration;
            break
          case PlayEvent.STATE_PLAYING:
            this.doTimeTickTask(false)
            break
          case PlayEvent.STATE_PUASED:
            this.doTimeTickTask(true)
            break
          case PlayEvent.STATE_COMPLETED:
            this.doTimeTickTask(true)
            break
          case PlayEvent.START_RENDER_FRAME:
            this.doTimeTickTask(false)
            break
          case PlayEvent.AUDIO_INTERRUPT:
            break
          case PlayEvent.VIDEOSIZE_CHANGE:
            this.per = mgplayer.width / mgplayer.height;
            this.setVideoWH();
            break
          case PlayEvent.STATE_ERROR:
            this.doTimeTickTask(true)
            break
          case PlayEvent.BUFFER_START:
            break
          case PlayEvent.BUFFER_END:
            break
        }
      }
    })
  }

  build() {
      Stack() {
        Column() {
          this.InitVodComponent()
        }
      }
  }


API参考


DEMO下载链接

demo工程仓库:ssh://git@git.btd.com:443/mgtv/mgtvplayer2.0_ohosdemo.git

提示

请联系芒果播放技术部开发获取自研播放器sdk demo仓库访问权限,获取最新播放器sdk及demo工程