HarmonyOS鸿蒙Next中不同组件间切换时,无法实现无缝续播如何解决

HarmonyOS鸿蒙Next中不同组件间切换时,无法实现无缝续播如何解决

【问题现象】

在列表里每个item是一个视频,当视频可见时候会自动播放,点击进入详情页面的视频也会自动播放,但是进入到详情页面时会发生断层,无法实现播放器的无缝续播。

【背景知识】

视频播放组件AVPlayer使用详见指南

【定位思路】

列表和详情的视频播放是两个不同的视频播放组件,直接切换会有卡顿。

【解决方案】

对于每一个视频,都可以创建一个AVPlayer。

然后通过动态切换surface,实现同视频跨页面播放的无缝转场效果。

具体操作步骤如下:

  1. 在page1页面通过GlobalContext将AVPlayer当做全局单例变量放到Map<string, media.AVPlayer>里面。
  2. 通过Navigation的NavPathStack跳转到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 {
    pageStack.pushPathByName("page2", "Page2 Param")
}
  1. 将AVPlayer放进全局map中:
// 将AVPlayer放进全局map
if (this.player) {
    GlobalContext.getContext().setObject('value', this.player);
}
  1. 将XComponent的surfaceId提供给avPlayer:
XComponent({
    id: '',
    type: XComponentType.SURFACE,
    libraryname: '',
    controller: this.xComponentController
})
.onLoad(() => {
    this.xComponentController.setXComponentSurfaceSize({
        surfaceWidth: 1920,
        surfaceHeight: 1080
    });
    this.surfaceID = this.xComponentController.getXComponentSurfaceId();
    // 取出全局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中实现不同组件切换时的无缝续播

在HarmonyOS鸿蒙Next中,不同组件间切换时无法实现无缝续播,通常是由于组件间的状态管理和数据传递机制未正确配置。鸿蒙系统提供了AbilityPage的生命周期管理机制,开发者需要确保在组件切换时,媒体播放状态和数据能够被正确保存和恢复。

1. 使用AbilityPage生命周期方法

onInactive()onBackground()方法中保存当前播放状态(如播放位置、播放状态等),并在onActive()onForeground()方法中恢复这些状态。

2. 使用Want对象传递数据

在组件切换时,通过Want对象将播放状态数据传递给下一个组件。接收组件在onStart()onActive()方法中解析Want对象并恢复播放状态。

3. 使用DataAbilityDistributedData进行数据共享

如果组件间需要共享播放状态,可以使用DataAbilityDistributedData来存储和获取播放状态数据,确保不同组件能够访问到相同的状态信息。

4. 使用ServiceAbility进行后台播放

如果需要在后台继续播放,可以将播放逻辑放在ServiceAbility中,并通过ServiceAbilityconnectAbility()方法在不同组件间共享播放状态。

5. 使用EventHub进行事件通知

通过EventHub发布和订阅播放状态变化事件,确保组件切换时能够及时获取到最新的播放状态。

通过以上方法,可以在HarmonyOS鸿蒙Next中实现不同组件切换时的无缝续播。

回到顶部