HarmonyOS 鸿蒙Next 播放视频,多个XComponent公用一个AVPlayer
多个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
目前支持动态切换surface,实现跨页面视频播放无缝转场,可参考以下示例
1.在page1页面通过GlobalContext将AVPlayer当做全局单例变量放到Map<string, media.AVPlayer>里面
2.通过router跳转到page2页面,通过Map<string, media.AVPlayer>获取单例AVPlayer,将page2页面的Xcomponent的SurfaceId设置给AVPlayer
更多关于HarmonyOS 鸿蒙Next 播放视频,多个XComponent公用一个AVPlayer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,若需实现多个XComponent共用一个AVPlayer播放视频,可遵循以下步骤:
-
AVPlayer实例管理:创建一个全局或应用级别的AVPlayer实例,而非在每个XComponent中分别创建。这可通过服务或全局变量实现,确保所有XComponent能访问到同一AVPlayer实例。
-
视频播放控制:设计一套机制来控制AVPlayer的播放状态,包括播放、暂停、停止等。这可以通过消息传递(如Event Bus)或依赖注入等方式实现,确保当某个XComponent需要控制视频播放时,能正确调用AVPlayer的相关方法。
-
视图同步:确保各个XComponent的UI组件(如视频播放窗口)能正确反映AVPlayer的播放状态。这可能需要自定义UI组件或监听AVPlayer的状态变化,实时更新UI。
-
资源管理:注意AVPlayer的生命周期管理,包括释放资源等,避免内存泄漏或资源占用。
-
权限处理:确保应用已获取视频播放所需的权限,如访问存储、网络等。
通过以上步骤,可实现多个XComponent共用一个AVPlayer播放视频。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html