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.mzph.cn/news/800789.shtml

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

相关文章

Android Telephony框架

目录 一、简介二、应用层(Application)三、框架层(Framework)四、本地 RIL 层(RIL)五、驱动层(Modem)六、整体框架 一、简介 无论手机发展到如何智能的程度&#xff0c;最关键和重要的功能仍然是通讯&#xff0c;具体来说就是打电话、发短信、上网功能的使用。而整个 Android …

Centos 7 安装通过yum安装google浏览器

在CentOS 7上使用yum安装Google Chrome浏览器稍微复杂一些&#xff0c;因为Chrome并不直接包含在默认的Yum仓库中。按照以下步骤来操作&#xff1a; 1、添加Google Chrome仓库 首先&#xff0c;您需要手动添加Google Chrome的Yum仓库。打开终端&#xff0c;并使用文本编辑器&a…

【HDFS】 写数据报 NOT_ENOUGH_STORAGE_SPACE

一、问题描述 对测试集群做压测,实验配置如下: 10个Client、每个Client使用550线程去写80000个文件,每个文件10KB。 在测试的过程中,客户端侧报了很多写入失败的异常日志,如下所示。 提示信息显示3台运行的datanode都被exclude了,因此选不出节点写入导致写入失败。 13…

MySQL高可用搭建方案MHA

MHA架构介绍 MHA是Master High Availability的缩写&#xff0c;它是目前MySQL高可用方面的一个相对成熟的解决方案&#xff0c;其核心是使用perl语言编写的一组脚本&#xff0c;是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求&#xff0c;那么这个网站&#xff08;autoregex.xyz&#xff09;一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则&#xff0c;不用选择。 输入框中输入描述&#xff0c;点击 ”GO“ 按钮。 等待一会儿&#xff0c;即可生…

get请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

mos管开关出现尖峰的原理? mos管开关的时候cs会出现尖峰,请问这是什么原因?

MOS管在开关过程中出现尖峰现象&#xff0c;通常是由于电路中的寄生参数和快速电压变化引起的。以下是一些导致尖峰出现的主要原因和原理&#xff1a; 寄生电容 在MOS管的源极&#xff08;S&#xff09;和漏极&#xff08;D&#xff09;之间存在寄生电容&#xff0c;这个电容在…

什么是stable diffusion

机器学习中的稳定扩散 在机器学习中&#xff0c;特别是在深度学习中&#xff0c;稳定扩散可能指的是通过特定的算法&#xff0c;例如深度学习模型&#xff0c;来稳定地生成数据或样本的过程。例如&#xff0c;一些生成模型能够稳定地从高斯分布中采样&#xff0c;以生成高质量的…

面试总结------2024/04/04---项目

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 redis实现的劣势 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xf…

【Java】单例模式

单例模式是面试中常考的设计模式之一 在面试中&#xff0c;面试官常常会要求写出两种类型的单例模式并解释原理 本文中&#xff0c;将从0到1的介绍单例模式究竟是什么 文章目录 ✍一、什么是设计模式&#xff1f;✍二、单例模式是什么&#xff1f;✍三、单例模式的类型**1.饿汉…

面试算法-149-除自身以外数组的乘积

题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时…

线上研讨会 | 新一代数字化技术赋能机器人及智能产线行业高质量发展

随着智能制造的快速推进&#xff0c;制造业转型升级到了关键阶段。越来越多的企业以数字化技术搭配智能机器人及智慧产线&#xff0c;主动实现数字化转型。达索系统3D体验平台是实现企业数字化转型的新一代数智化平台&#xff0c;基于型、数字驱动、数字化连续技术&#xff0c;…

【深度学习基础】

打基础日常记录 CNN基础知识1. 感知机2. DNN 深度神经网络&#xff08;全连接神经网络&#xff09;DNN 与感知机的区别DNN特点&#xff0c;全连接神经网络DNN前向传播和反向传播 3. CNN结构【提取特征分类】4. CNN应用于文本 RNN基础1. RNN的本质 词向量模型word2Vec1. 自然语言…

Selenium与Metamask钱包及DApp交互及验证码破解汇总

1.LavaMoat报错: selenium.common.exceptions.WebDriverException: Message: unknown error: Runtime.callFunctionOn threw exception: Error: LavaMoat...`报错原因: 根本原因是Metamask为了用户钱包安全,而将LavaMoat 设置为了全局不可用。 报错解析文章链接: https:/…

城市定量分析学习资料大数据 gis 空间句法 Python

城市定量分析学习资料大数据 gis 空间句法 Python

Ubuntu 20.04.06 PCL C++学习记录(十六)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 用一组点云数据做简单的平面的分割 源代码及所用函数 源代码 #include<iostr…

IP地址到底有什么用

IP地址在计算机网络中的作用至关重要&#xff0c;它不仅是设备在网络中的唯一标识&#xff0c;更是实现网络通信、网络管理和安全的关键要素。下面&#xff0c;我们将从多个方面详细阐述IP地址的作用。 首先&#xff0c;IP地址作为设备的唯一标识&#xff0c;为网络通信提供了…

JavaScript - 你做过字符串反转吗

难度级别:初级及以上 提问概率:65% 例如有一个字符串本来是“abcde”,那么现在希望可以将其反转,最终的值是“edcba”,该如何做呢? 第一种是将字符串转为数组,利用数组的reverse方法实现元素反转,然后再将数组转为字符串,代码如下 …

面试必问!鸿蒙开发中的FA模型和Stage模型是什么?他们分别有什么区别?

鸿蒙OS&#xff08;HarmonyOS&#xff09; 是面向全场景的分布式操作系统&#xff0c;它通过创新的应用模型&#xff0c;为开发者提供了强大的应用开发框架。 在HarmonyOS的发展过程中&#xff0c;FA模型&#xff08;Feature Ability&#xff09;和Stage模型是两种重要的应用模…

常规的k8s的监控指标

常规的监控指标 1、集群维度 集群状态集群节点数节点状态(正常、不可达、未知)节点的资源使用率(CPU、内存、IO等)2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控制器状态etcd状态常用的 Prometheus Operator 指标 常用监控…