鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache
OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库,旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍:
1. 核心功能
-
边播放边缓存:将音视频URL传递给 OhosVideoCache 处理后,播放器可以一边播放内容,一边将数据缓存到本地。这一功能极大地提升了用户体验,尤其是在网络不稳定的情况下。
-
离线播放支持:音视频下载完成后,即使设备断网,用户也可以继续播放已缓存的内容。
-
断点续传:如果音视频下载中断,再次播放时会从上次缓存的位置继续下载,而不是重新开始,节省时间和流量。
-
自动清理缓存:根据用户设置的参数,OhosVideoCache 可以自动清理缓存文件,避免占用过多磁盘空间。
-
高度可定制:支持添加自定义请求头、自定义缓存文件命名规则、设置缓存目录等,满足不同开发场景的需求。
2. 使用方法
安装
通过以下命令安装 OhosVideoCache:
ohpm install @ohos/video-cache
初始化代理服务器
建议使用单例模式维护代理服务器对象,避免重复创建多个代理服务器实例,从而节省资源并提高应用性能。以下是初始化代理服务器的示例代码:
import { HttpProxyCacheServer, HttpProxyCacheServerBuilder } from '@ohos/video-cache';
import common from '@ohos.app.ability.common';export default class GlobalProxyServer {private static instance: GlobalProxyServer;private _objects: Map<string, Object | null> = new Map<string, Object | null>();private constructor() {}public static getInstance(): GlobalProxyServer {if (!GlobalProxyServer.instance) {GlobalProxyServer.instance = new GlobalProxyServer();}return GlobalProxyServer.instance;}setServer(objectClass: HttpProxyCacheServer) {this._objects.set('server', objectClass);}getServer(): HttpProxyCacheServer {return this._objects.get('server') as HttpProxyCacheServer;}
}// 初始化代理服务器
let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).build();
GlobalProxyServer.getInstance().setServer(server);
处理音视频URL
将原始音视频URL传递给 OhosVideoCache 处理,获取代理URL,并将其设置给播放器:
let originUrl = 'https://example.com/video.mp4'; // 原始音视频URL
let tempUrl = await GlobalProxyServer.getInstance().getServer().getProxyUrl(originUrl);
let proxyUrl: string | undefined = tempUrl ? tempUrl : originUrl;// 设置给播放器
this.avPlayer!.url = proxyUrl;
3. 进阶功能
设置缓存文件夹位置
可以指定缓存文件存放的目录,默认为应用沙箱的 cache 目录:
let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).cacheDirectory(getContext().cacheDir) // 设置缓存文件夹位置.build();
设置缓存清理策略
-
最大缓存容量:限制缓存文件夹的最大容量(如1G):
let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).maxCacheSize(1024 * 1024 * 1024) // 设置最大缓存容量为1G.build(); -
最大缓存文件个数:限制缓存文件夹的最大文件数量:
let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).maxCacheFilesCount(10) // 设置最大缓存文件个数为10个.build();
添加请求头
通过自定义请求头注入器,为音视频请求添加额外的头信息:
class MyHeaderInject implements HeaderInjector {addHeaders(url: string): HashMap<string, string> {let header: HashMap<string, string> = new HashMap<string, string>();header.set('allowCrossProtocolRedirects', 'true');header.set('name', '张三');header.set('fakeToken', '123456789');return header;}
}let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).setHeaderInjector(new MyHeaderInject()).build();
自定义缓存文件命名规则
通过实现 FileNameGenerator 接口,自定义缓存文件的命名规则:
class MyFileNameGenerator implements FileNameGenerator {generate(url: string): string {let start: number = url.lastIndexOf('/');let end: number = url.lastIndexOf('.');let newName: string = url.substring(start, end);return newName;}
}let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).setFileNameGenerator(new MyFileNameGenerator()).build();
注册缓存进度监听器
监听音视频文件的下载缓存进度,并更新到界面:
class MyCacheListener implements CacheListener {onCacheAvailable(cacheFilePath: string, url: string, percentsAvailable: number) {// 在这里处理缓存进度更新}
}let listener: MyCacheListener = new MyCacheListener();
server.registerCacheListener(listener); // 注册监听器
server.unregisterCacheListener(listener); // 取消注册监听器
自定义缓存文件清理规则
通过实现 DiskUsage 接口,自定义缓存文件的清理逻辑:
class MyDiskUsage implements DiskUsage {touch(filePath: string) {// 在这里实现自定义的缓存文件清理逻辑}
}let server: HttpProxyCacheServer = new HttpProxyCacheServerBuilder(getContext()).setDiskUsage(new MyDiskUsage()).build();
4. 接口说明
以下是 OhosVideoCache 提供的主要接口及其说明:
| 接口名 | 参数 | 返回值 | 说明 |
|---|---|---|---|
getProxyUrl | url: string, allowCachedFileUri: boolean = true | Promise<string> | 将原始音视频URL处理后返回代理URL,用于播放器请求。 |
registerCacheListener | cacheListener: CacheListener, url: string | null = null | void | 注册缓存进度监听器。 |
unregisterCacheListener | cacheListener: CacheListener, url: string | void | 取消注册缓存进度监听器。 |
shutdown | 无 | void | 关闭代理服务器。 |
cacheDirectory | file: string | HttpProxyCacheServerBuilder | 设置缓存文件存放的目录。 |
setFileNameGenerator | fileNameGenerator: FileNameGenerator | HttpProxyCacheServerBuilder | 设置自定义缓存文件命名规则。 |
maxCacheSize | maxSize: number | HttpProxyCacheServerBuilder | 设置最大缓存容量清理策略的最大缓存容量。 |
maxCacheFilesCount | count: number | HttpProxyCacheServerBuilder | 设置最大文件个数清理策略的最大文件个数。 |
setDiskUsage | diskUsage: DiskUsage | HttpProxyCacheServerBuilder | 设置自定义缓存文件清理规则。 |
setHeaderInjector | headerInjector: HeaderInjector | HttpProxyCacheServerBuilder | 设置自定义请求头注入器。 |
build | 无 | HttpProxyCacheServer | 构造代理服务器实例。 |
6. 适用场景
-
多媒体应用开发:适用于需要实现音视频缓存功能的OpenHarmony应用,如视频播放器、音乐播放器等。
-
离线内容体验:支持用户在无网络环境下继续播放已缓存的音视频内容。
-
优化用户体验:通过断点续传和自动清理缓存功能,提升应用的性能和用户体验。
总结
OhosVideoCache 是一个功能强大且高度可定制的音视频缓存库,能够帮助OpenHarmony开发者轻松实现音视频的边播放边缓存功能。
它支持离线播放、断点续传、自动清理缓存等多种实用功能,同时提供了丰富的自定义选项,满足不同开发场景的需求。
开发者可以通过简单的安装和配置,快速集成该库到自己的项目中,提升应用的多媒体处理能力。
相关文章:
鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache
OhosVideoCache 是一个专为OpenHarmony开发(HarmonyOS也可以用)的音视频缓存库,旨在帮助开发者轻松实现音视频的边播放边缓存功能。以下是关于 OhosVideoCache 的详细介绍: 1. 核心功能 边播放边缓存:将音视频URL传递给 OhosVideoCache 处理后…...
中间件漏洞之CVE-2024-53677
目录 什么是struts?CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts? 在早期的 Java Web 开发中,代码往往混乱不堪,难以维护和扩展。比如,一个简单的用户登录功能,可能在不同的 Java 类…...
Python玄学
过年期间无聊的看了看DY直播,也是迷上玄学了。突然想着为啥要自己掐指算,我这🐷脑哪记得到那么多东西啊。然后,就捣鼓捣鼓了一些玩意儿。留个纪念。 注:就是一个玄学推动学习,部分内容不必当真,…...
16.1.STM32F407ZGT6-CAN基础概念
参考: https://blog.csdn.net/sunlight_vip/article/details/128639144 前言: 学习总结CAN的知识点: 1.can是什么,历史由来和背景 2.can的物理层,链路层 3.初始化的流程和关键点 4.波特率怎么设置 5.can id怎么过滤 6…...
记忆化搜索和动态规划 --最长回文子串为例
记忆化搜索 记忆化搜索是一种优化递归算法的方法,通过将已经计算过的子问题的结果存储起来(通常使用哈希表或数组),避免重复计算相同的子问题。 本质上是通过缓存中间结果来减少计算的重复性。 动态规划 动态规划是通过将问题分…...
【论文笔记】Fast3R:前向并行muti-view重建方法
众所周知,DUSt3R只适合做稀疏视角重建,与sapnn3r的目的类似,这篇文章以并行的方法,扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战,尤其是在需要跨不同视角实现精确且可…...
cf div3 998 E(并查集)
E : 给出两个简单无向图 (没有重边和自环)f g . 可以对f 进行 删边 和加边 的操作。问至少操作多少次 ,使得 f 和 g 的 点的联通情况相同(并查集的情况相同) 首先思考删边 : 对于 我 f 图存在边 e &#x…...
使用VCS对Verilog/System Verilog进行单步调试的步骤
Verilog单步调试: System Verilog进行单步调试的步骤如下: 1. 编译设计 使用-debug_all或-debug_pp选项编译设计,生成调试信息。 我的4个文件: 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…...
Pyside6异步通信测试
#第一种方式,借助qasync实现。使用pip install qasync安装。 from PySide6.QtWidgets import * from PySide6.QtCore import * from PySide6.QtGui import * import asyncio from qasync import QEventLoop, asyncSlotclass Form(QWidget):def __init__(self,paren…...
[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置
2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…...
如何使用 DeepSeek API 结合 VSCode 提升开发效率
引言 在当今的软件开发领域,API 的使用已经成为不可或缺的一部分。DeepSeek 是一个强大的 API 平台,提供了丰富的功能和数据,可以帮助开发者快速构建和优化应用程序。而 Visual Studio Code(VSCode)作为一款轻量级但功…...
自定义数据集 ,使用朴素贝叶斯对其进行分类
数据集定义: - data 列表包含了文本样本及其对应的情感标签。每个元素是一个元组,第一个元素是文本,第二个元素是标签。 特征提取: - 使用 CountVectorizer 将文本转换为词频向量。 fit_transform 方法在训练数据上拟合向量器…...
Flutter使用Flavor实现切换环境和多渠道打包
在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …...
C# lock使用详解
总目录 前言 在 C# 多线程编程中,lock 关键字是一种非常重要的同步机制,用于确保同一时间只有一个线程可以访问特定的代码块,从而避免多个线程同时操作共享资源时可能出现的数据竞争和不一致问题。以下是关于 lock 关键字的详细使用介绍。 一…...
C# 接口介绍
.NET学习资料 .NET学习资料 .NET学习资料 一、接口的定义 在 C# 中,接口是一种特殊的抽象类型,它定义了一组方法签名,但不包含方法的实现。接口使用interface关键字来声明。例如,定义一个表示形状的接口IShape: in…...
第三周 树
猫猫和企鹅 分数 10 全屏浏览 切换布局 作者 姜明欣 单位 河北大学 王国里有 nn 个居住区,它们之间有 n−1 条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1。 除 1号居住区外,每个居…...
OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关
目标 学习将 OpenAI 接入 Web 应用,构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖: 打开终端或命令行,执行以下命令安装 Flask 和 OpenAI SDK: pip i…...
Nginx 中文文档
文章来源:nginx 文档 -- nginx中文文档|nginx中文教程 nginx 文档 介绍 安装 nginx从源构建 nginx新手指南管理员指南控制 nginx连接处理方法设置哈希调试日志记录到 syslog配置文件测量单位命令行参数适用于 Windows 的 nginx支持 QUIC 和 HTTP/3 nginx 如何处理…...
Java 泛型<? extends Object>
在 Java 泛型中,<? extends Object> 和 <?> 都表示未知类型,但它们在某些情况下有细微的差异。泛型的引入是为了消除运行时错误并增强类型安全性,使代码更具可读性和可维护性。 在 JDK 5 中引入了泛型,以消除编译时…...
鲸鱼算法 matlab pso
算法原理 鲸鱼优化算法的核心思想是通过模拟座头鲸的捕食过程来进行搜索和优化。座头鲸在捕猎时会围绕猎物游动并产生气泡网,迫使猎物聚集。这一行为被用来设计搜索策略,使算法能够有效地找到全局最优解。 算法步骤 初始化:随机生成一…...
Hot100之堆
我们的PriorityQueue默认为最小堆,堆顶总是为最小 215数组中的第K个最大元素 题目 思路解析 暴力解法(不符合时间复杂度) 题目要求我们找到「数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素」。「数组排序后的第 k …...
KNIME:开源 AI 数据科学
KNIME(Konstanz Information Miner)是一款开源且功能强大的数据科学平台,由德国康斯坦茨大学的软件工程师团队开发,自2004年推出以来,广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…...
Office / WPS 公式、Mathtype 公式输入花体字、空心字
注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 2、Mathtype 公式输入花体字、空心字 2.1 直接输入 花体字 在 mathtype 中直接输入 \mathcal{L} L \Large \mathcal{L} L…...
[HOT 100] 2824. 统计和小于目标的下标对数目
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2824. 统计和小于目标的下标对数目 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target ,请你…...
建表注意事项(2):表约束,主键自增,序列[oracle]
没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束,区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用,需谨慎设计 添加…...
Ubuntu20.04 磁盘空间扩展教程
Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次,点赞38次,收藏119次。执行命令查看系统容量相关的数据:df -h当前容量为20G,已用18G(96%),可用844M,可用…...
冯诺依曼体系架构和操作系统的概念
1.冯诺依曼体系架构 计算机的硬件大部分都遵循冯诺依曼体系架构,其图示如下 这里的存储器指的是内存,是一种断电易失的设备。 速度快 而磁盘,是一种永久存储的设备,其属于外设既是输出设备又是输入设备。速度慢 而运算器是一种…...
OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)
文章目录 向量变换使用GLM变换(缩放、旋转、位移)将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试(Z-buffer)练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…...
Linux第105步_基于SiI9022A芯片的RGB转HDMI实验
SiI9022A是一款HDMI传输芯片,可以将“音视频接口”转换为HDMI或者DVI格式,是一个视频转换芯片。本实验基于linux的驱动程序设计。 SiI9022A支持输入视频格式有:xvYCC、BTA-T1004、ITU-R.656,内置DE发生器,支持SYNC格式…...
测试工程师的DS使用指南
目录 引言DeepSeek在测试设计中的应用 2.1 智能用例生成2.2 边界值分析2.3 异常场景设计DeepSeek在自动化测试中的应用 3.1 脚本智能转换3.2 日志智能分析3.3 测试数据生成DeepSeek在质量保障体系中的应用 4.1 测试策略优化4.2 缺陷模式预测4.3 技术方案验证DeepSeek在测试效能…...
