HarmonyOS 鸿蒙Next 跨页面视频播放场景无法实现无缝转场如何解决

【问题现象】

在跨页面视频播放场景下,更换XComponent 后新的surfaceId无法和已有AVPlayer实例绑定,导致多个XComponent无法公用一个AVPlayer实现无缝转场。

【背景知识】

录像(ArkTS) 录像实现方案(ArkTS) 【解决方案】

可以通过动态切换surface,实现跨页面视频播放无缝转场。具体操作步骤如下:

(1)在page1页面,通过GlobalContext将AVPlayer当做全局单例变量放到Map<string, media.AVPlayer>里面。

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

代码示例如下:

import { media } from '@kit.MediaKit';
export class GlobalContext {
    private constructor() {}
    private static instance: GlobalContext;
    private _objects = new Map<string, media.AVPlayer>();

    public static getContext(): GlobalContext {
        if (!GlobalContext.instance) {
            GlobalContext.instance = new GlobalContext();
        }
        return GlobalContext.instance;
    }

    getObject(value: string): media.AVPlayer | undefined {
        return this._objects.get(value);
    }

    setObject(key: string, objectClass: media.AVPlayer): void {
        this._objects.set(key, objectClass);
    }
}

onJumpClick(): void {
    router.replaceUrl({
        url: 'pages/player' // 目标url
    }, (err) => {
        if (err) {
            console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
            return;
        }
        console.info('Invoke pushUrl succeeded.');
    })
}

(3)将AVPlayer放进全局map中,AVPlayer指定相应组件的surfaceId即可完成播放无缝切换。

代码示例如下:

//将AVPlayer放进全局map
if (this.player) {
    GlobalContext.getContext().setObject('value', this.player);
}

.onLoad(() => {
    this.mXComponentController.setXComponentSurfaceSize({ surfaceWidth: this.xComponentWidth, surfaceHeight: this.xComponentHeight });
    this.surfaceID=this.mXComponentController.getXComponentSurfaceId();
    console.info('onLoad '+this.surfaceID)

    //取出全局map里面的AVPlayer
    avPlayer=GlobalContext.getContext().getObject('value');
    if (avPlayer) {
        avPlayer.surfaceId=this.surfaceID;
    }
})

更多关于HarmonyOS 鸿蒙Next 跨页面视频播放场景无法实现无缝转场如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 跨页面视频播放场景无法实现无缝转场如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next跨页面视频播放场景无法实现无缝转场的问题,以下是一些可能的解决方案:

  1. 优化视频解码和渲染:优先使用硬件解码器进行视频解码,选择经过优化的解码库,并合理配置解码参数。同时,使用高效的渲染引擎,优化渲染流程,实现并发解码与渲染,以减少转场时的卡顿。
  2. 合理管理内存:确保视频播放时内存管理得当,避免内存泄漏和过度占用内存的情况。可以预加载部分视频数据到内存中,以减少播放时的缓冲时间,提升转场流畅度。
  3. 使用高级模板化转场:HarmonyOS提供了基于场景化封装的相关高级模板化转场,如导航转场、模态转场、共享元素转场等。开发者可以根据具体需求选择合适的转场模板,以实现更平滑的页面过渡效果。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部