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;})})
  1. 初始化代理服务器,页面一进来需要使用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);}
}
  1. 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)}`);}}
  1. 边播放边缓存,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交给OhosVideoCachelet 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.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OneFlow深度学习框架:技术优势与功能特点

文章目录 一、概要二、核心技术优势2.1、分布式训练2.2、极致性能2.3、端到端的智能数据平台2.4、开放灵活的算法支持2.5、跨平台支持 三、功能特点四、OneFlow与TensorFlow对比四、安装OneFlow五、总结 一、概要 OneFlow是一款基于Python的开源深度学习框架&#xff0c;旨在实…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

Go协程池gopool源码解析

1、gopool简介 Repository&#xff1a;https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

Astra深度相机在Ubuntu18.04系统下实现相机标定

问题&#xff1a; 当使用Astra相机的启动的指令启动相机后&#xff0c;使用rviz查看相机所发布的rgb数据时&#xff0c;在终端会出现如下的提示信息&#xff1a; Camera calibration file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml not found. Camera calibration fil…

HarmonyOS实战开发-如何实现跨应用数据共享实例。

介绍 本示例实现了一个跨应用数据共享实例&#xff0c;分为联系人&#xff08;数据提供方&#xff09;和联系人助手&#xff08;数据使用方&#xff09;两部分&#xff1a;联系人支持联系人数据的增、删、改、查等功能&#xff1b;联系人助手支持同步联系人数据&#xff0c;当…

Dubbo 序列化

Dubbo 序列化 1、什么是序列化和反序列化 序列化&#xff08;serialization&#xff09;在计算机科学的资料处理中&#xff0c;是指将数据结构或对象状态转换成可取用格式&#xff08;例如存成文件&#xff0c;存于缓冲&#xff0c;或经由网络中发送&#xff09;&#xff0c;…

HiveSQL之lateral view

lateral view是hiveQL中的一个高级功能&#xff0c;用于和表生成函数一起&#xff0c;来处理嵌套数组和结构的数据&#xff0c;特别是在处理复杂的数据结构如JSON或数组内嵌套数组时特别有用。它允许用户在每一行上应用TGF&#xff08;表生成函数&#xff09;&#xff0c;将生成…

蓝桥杯刷题--RDay5

清理水域--枚举 8.清理水域 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2413/learning/?page1&first_category_id1&second_category_id3&tags2023 小蓝有一个n m大小的矩形水域&#xff0c;小蓝将这个水域划分为n行m列&#xff0c;行数从1…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

CSS层叠样式表学习(基础选择器)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS&#xff08;2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…

Java前置一些知识

文章目录 搭建Java环境安装path环境变量Java技术体系 Java执行原理JDK组成跨平台 IDEA管理Java程序 搭建Java环境 安装 oralce官网下载 JDK17 Windows 傻瓜式的点下一步就行&#xff0c;注意&#xff1a;安装目录不要有空格、中文 java 执行工具 javac 编译工具 类名和文件…

如何监控特权帐户,保护敏感数据

IT基础设施的增长导致员工可以访问的凭据和资源数量急剧增加。每个组织都存储关键信息&#xff0c;这些信息构成了做出关键业务决策的基石。与特权用户共享这些数据可以授予他们访问普通员工没有的凭据的权限。如果特权帐户凭证落入不法分子之手&#xff0c;它们可能被滥用&…