HarmonyOS 应用开发-边缓存边播放案例

介绍

OhosVideoCache是一个支持边播放边缓存的库,只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器,

OhosVideoCache就可以一边下载音视频数据并保存在本地,一边读取本地缓存返回给播放器,使用者无需进行其他操作。

效果图预览

使用说明

  1. 进入页面,自动播放视频,点击暂停,视频停止播放,点击播放,视频继续播放。
  2. 视频播放完成之后,点击播放按钮,视频重新播放。

实现思路

边缓存播放功能主要是通过Xcomponent组件、@ohos.multimedia.media以及OhosVideoCache三方库实现,XComponent组件主要用于绘制

视频播放的窗口,页面进来初始化服务器然后利用XComponent组件的onLoad函数来调用 VideoPlayerManager

中的initPlayer方法创建一个音视频管理实例,并通过setAVPlayerCallback函数和cacheAndPlayVideo函数来实现视频状态的监听以及边缓存边播放功能。

  1. XComponent组件绘制视频播放窗口。

    XComponent({
    id: 'xcomponent',
    type: 'surface',
    controller: this.componentController
    })
    .height(${this.xComponentHeight}px)
    .width(${this.xComponentWidth}px)
    .onLoad(() => {
    // 设置XComponent持有Surface的宽度和高度
    this.componentController.setXComponentSurfaceSize({
    surfaceWidth: SURFACE_WIDTH,
    surfaceHeight: SURFACE_HEIGHT
    });
    this.surfaceId = this.componentController.getXComponentSurfaceId();
    // 创建音视频播放实例
    AvPlayManager.getInstance()
    .initPlayer(getContext(this) as common.UIAbilityContext, this.surfaceId, (avPlayer: media.AVPlayer) => {
    avPlayer.on('timeUpdate', (time: number) => {
    this.currentTime = time;
    });
    this.videoDuration = handleTime(avPlayer.duration);
    this.total = avPlayer.duration;
    })
    })

  2. 初始化代理服务器,页面一进来需要使用setServer方法来初始化代理服务器,以便后续调用此服务器处理url。

    import common from '@ohos.app.ability.common';
    import { HttpProxyCacheServer } from '@ohos/video-cache';

    const CONTEXT_STR: string = 'context';
    const SERVER_STR: string = 'server';

    export default class GlobalProxyServer {
    private static instance: GlobalProxyServer | null = null;
    private objects: Map<string, Object | null> = new Map<string, Object | null>();

    public static getInstance(): GlobalProxyServer {
    if (!GlobalProxyServer.instance) {
    GlobalProxyServer.instance = new GlobalProxyServer();
    }
    return GlobalProxyServer.instance;
    }
    /**
    * 获取上下文信息
    * @returns
    /
    getContext(): common.UIAbilityContext {
    return this.objects.get(CONTEXT_STR) as common.UIAbilityContext;
    }
    /
    *
    * 设置上下文信息
    * @param context
    */
    setContext(context: common.UIAbilityContext): void {
    this.objects.set(CONTEXT_STR, context);
    }

    /**
    * 获取服务器
    * @returns
    */
    getServer(): HttpProxyCacheServer {
    return this.objects.get(SERVER_STR) as HttpProxyCacheServer;
    }

    /**
    * 设置服务器
    * @param objectClass
    */
    setServer(objectClass: HttpProxyCacheServer): void {
    try {
    const currentServer: HttpProxyCacheServer = this.getServer();
    currentServer.shutdown();
    } catch (err) {
    }
    this.objects.set(SERVER_STR, objectClass);
    }
    }

  3. media.createAVPlayer()创建播放管理类,用于管理和播放媒体资源。

    async initPlayer(context: common.UIAbilityContext, surfaceId: string,
    callback: (avPlayer: media.AVPlayer) => void): Promise<void> {
    logger.info(TAG, initPlayer==initCamera surfaceId== ${surfaceId});
    this.surfaceID = surfaceId;
    try {
    // 创建avPlayer实例对象
    this.avPlayer = await media.createAVPlayer();
    // 创建状态机变化回调函数
    await this.setAVPlayerCallback(callback);
    // 边缓存边播放
    this.cacheAndPlayVideo(context);
    } catch (err) {
    logger.error(TAG, initPlayer initPlayer err:${JSON.stringify(err)});
    }
    }

  4. 边播放边缓存,MyCacheListener监听缓存进度,getProxyUrl(ORIGIN_URL)获取视频播放地址并设置给播放器。

    /**
    * 边缓存边监听函数
    * @param context 上下文信息
    * @returns
    */
    async cacheAndPlayVideo(context: common.UIAbilityContext): Promise<void> {
    logger.info(TAG, cacheAndPlayVideo start);

    复制代码
     // TODO:知识点:监听缓存进度
     class MyCacheListener implements CacheListener {
       onCacheAvailable(cacheFilePath: string, url: string, percentsAvailable: number): void {
         AppStorage.setOrCreate('currentCachePercent', percentsAvailable);
       }
     }
    
     GlobalProxyServer?.getInstance()?.getServer()?.registerCacheListener(new MyCacheListener(), ORIGIN_URL);
     // TODO:知识点:将原始的音视频url交给OhosVideoCache
     let proxyUrl: string | undefined = await GlobalProxyServer?.getInstance()?.getServer()?.getProxyUrl(ORIGIN_URL);
     // 由于avplayer不支持直接加载本地文件路径 这里需要转化为fd的路径
     if (proxyUrl.startsWith(context.cacheDir)) {
       const file = fs.openSync(proxyUrl, fs.OpenMode.READ_ONLY);
       proxyUrl = `fd://${file.fd}`;
     }
     logger.info(TAG, `proxyUrl ${proxyUrl}`);
     // 将处理之后的url设置给播放器
     this.avPlayer.url = proxyUrl;

    }

高性能知识点

不涉及。

工程结构&模块类型

复制代码
videocache                                         // har类型
|---model
|   |---GlobalProxyServer.ets                      // 模型层-服务器管理
|   |---VideoPlayerManager.ets                     // 模型层-音视频管理
|---utils
|   |---utils.ets                                  // 工具
|---view
|   |---VideoCacheView.ets                         // 视图层-应用主页面

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
猫头虎12 分钟前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy
一只大侠的侠13 分钟前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos
芷栀夏14 分钟前
CANN 仓库实战:用 DrissionPage 构建高效、稳定的 UI 自动化测试框架
ui·aigc·transformer·cann
盐焗西兰花15 分钟前
鸿蒙学习实战之路-Reader Kit自定义字体最佳实践
学习·华为·harmonyos
_waylau40 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
charlotte102410241 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
Zaralike1 小时前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络
一只大侠的侠1 小时前
【Harmonyos】Flutter开源鸿蒙跨平台训练营 Day 2 鸿蒙跨平台开发环境搭建与工程实践
flutter·开源·harmonyos
G***技1 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
云姜.1 小时前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议