HarmonyOS 鸿蒙Next 播放视频,多个XComponent公用一个AVPlayer

发布于 1周前 作者 yibo5220 最后一次编辑是 5天前 来自 鸿蒙OS

多个XComponent如何公用一个AVPlayer? 更换XComponent 后 新的surfaceId无法和已有AVPlayer实例绑定。 现在我的做法是用一个实例:AVPlayer

A页面代码片段:

XComponent({
  id: 'xComponentId',
  type: XComponentType.SURFACE,
  controller: this.xComponentController
})
  .width('100%')
  .height('100%')
  .visibility(Visibility.Hidden)
  .onLoad(() => {
    AdLog.info('AdSplashClickEyeView', 'buildVideoImpl onLoad')
    let surfaceId = this.xComponentController.getXComponentSurfaceId()
    AdMediaPlayer.instance.bindSurfaceId(surfaceId)
    AdMediaPlayer.instance.prepare(adBeanBase.videoUrl)
  })

B页面代码片段:

XComponent({
  id: 'xComponentId',
  type: XComponentType.SURFACE,
  controller: this.xComponentController
})
  .width('100%')
  .height('100%')
    // .visibility(Visibility.Hidden)
  .onLoad(() => {
    AdLog.info('AdSplashClickEyePage', 'buildVideoImpl onLoad')
    let surfaceId = this.xComponentController.getXComponentSurfaceId()
    AdMediaPlayer.instance.bindSurfaceId(surfaceId)
    AdMediaPlayer.instance.play(adBeanBase.videoUrl)
  })

AVPlayer代码片段:

async bindSurfaceId(surfaceId: string) {
  hilog.error(0x0000, TAG, `bindSurfaceId surfaceId=${surfaceId}`)
  this.surfaceId = surfaceId
  if (this.player) {
    this.player.surfaceId = this.surfaceId;
  }
}

// 状态机变化回调函数

player.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
  switch (state) {
    case 'idle': // 成功调用reset接口后触发该状态机上报
      hilog.info(0x0000, TAG, 'callback idle state')
      break;
    case 'initialized': // avplayer 设置播放源后触发该状态上报
      hilog.info(0x0000, TAG, 'callback initialized state')
      player.surfaceId = this.surfaceId; // 设置显示画面,当播放的资源为纯音频时无需设置
      player.prepare();
      break;
  }
})

更多关于HarmonyOS 鸿蒙Next 播放视频,多个XComponent公用一个AVPlayer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

目前支持动态切换surface,实现跨页面视频播放无缝转场,可参考以下示例

1.page1页面通过GlobalContextAVPlayer当做全局单例变量放到Map<string, media.AVPlayer>里面

2.通过router跳转到page2页面,通过Map<string, media.AVPlayer>获取单例AVPlayer,将page2页面的XcomponentSurfaceId设置给AVPlayer

更多关于HarmonyOS 鸿蒙Next 播放视频,多个XComponent公用一个AVPlayer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,若需实现多个XComponent共用一个AVPlayer播放视频,可遵循以下步骤:

  1. AVPlayer实例管理:创建一个全局或应用级别的AVPlayer实例,而非在每个XComponent中分别创建。这可通过服务或全局变量实现,确保所有XComponent能访问到同一AVPlayer实例。

  2. 视频播放控制:设计一套机制来控制AVPlayer的播放状态,包括播放、暂停、停止等。这可以通过消息传递(如Event Bus)或依赖注入等方式实现,确保当某个XComponent需要控制视频播放时,能正确调用AVPlayer的相关方法。

  3. 视图同步:确保各个XComponent的UI组件(如视频播放窗口)能正确反映AVPlayer的播放状态。这可能需要自定义UI组件或监听AVPlayer的状态变化,实时更新UI。

  4. 资源管理:注意AVPlayer的生命周期管理,包括释放资源等,避免内存泄漏或资源占用。

  5. 权限处理:确保应用已获取视频播放所需的权限,如访问存储、网络等。

通过以上步骤,可实现多个XComponent共用一个AVPlayer播放视频。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部