鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache

news2025/2/4 19:25:59

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 提供的主要接口及其说明:

接口名参数返回值说明
getProxyUrlurl: string, allowCachedFileUri: boolean = truePromise<string>将原始音视频URL处理后返回代理URL,用于播放器请求。
registerCacheListenercacheListener: CacheListener, url: string | null = nullvoid注册缓存进度监听器。
unregisterCacheListenercacheListener: CacheListener, url: stringvoid取消注册缓存进度监听器。
shutdownvoid关闭代理服务器。
cacheDirectoryfile: stringHttpProxyCacheServerBuilder设置缓存文件存放的目录。
setFileNameGeneratorfileNameGenerator: FileNameGeneratorHttpProxyCacheServerBuilder设置自定义缓存文件命名规则。
maxCacheSizemaxSize: numberHttpProxyCacheServerBuilder设置最大缓存容量清理策略的最大缓存容量。
maxCacheFilesCountcount: numberHttpProxyCacheServerBuilder设置最大文件个数清理策略的最大文件个数。
setDiskUsagediskUsage: DiskUsageHttpProxyCacheServerBuilder设置自定义缓存文件清理规则。
setHeaderInjectorheaderInjector: HeaderInjectorHttpProxyCacheServerBuilder设置自定义请求头注入器。
buildHttpProxyCacheServer构造代理服务器实例。

6. 适用场景
  • 多媒体应用开发:适用于需要实现音视频缓存功能的OpenHarmony应用,如视频播放器、音乐播放器等。

  • 离线内容体验:支持用户在无网络环境下继续播放已缓存的音视频内容。

  • 优化用户体验:通过断点续传和自动清理缓存功能,提升应用的性能和用户体验。


总结

OhosVideoCache 是一个功能强大且高度可定制的音视频缓存库,能够帮助OpenHarmony开发者轻松实现音视频的边播放边缓存功能。

它支持离线播放、断点续传、自动清理缓存等多种实用功能,同时提供了丰富的自定义选项,满足不同开发场景的需求。

开发者可以通过简单的安装和配置,快速集成该库到自己的项目中,提升应用的多媒体处理能力。

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

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

相关文章

中间件漏洞之CVE-2024-53677

目录 什么是struts&#xff1f;CVE-2024-53677简介影响版本复现环境搭建漏洞利用修复 什么是struts&#xff1f; 在早期的 Java Web 开发中&#xff0c;代码往往混乱不堪&#xff0c;难以维护和扩展。比如&#xff0c;一个简单的用户登录功能&#xff0c;可能在不同的 Java 类…

Python玄学

过年期间无聊的看了看DY直播&#xff0c;也是迷上玄学了。突然想着为啥要自己掐指算&#xff0c;我这&#x1f437;脑哪记得到那么多东西啊。然后&#xff0c;就捣鼓捣鼓了一些玩意儿。留个纪念。 注&#xff1a;就是一个玄学推动学习&#xff0c;部分内容不必当真&#xff0c;…

16.1.STM32F407ZGT6-CAN基础概念

参考&#xff1a; https://blog.csdn.net/sunlight_vip/article/details/128639144 前言&#xff1a; 学习总结CAN的知识点&#xff1a; 1.can是什么&#xff0c;历史由来和背景 2.can的物理层&#xff0c;链路层 3.初始化的流程和关键点 4.波特率怎么设置 5.can id怎么过滤 6…

【论文笔记】Fast3R:前向并行muti-view重建方法

众所周知&#xff0c;DUSt3R只适合做稀疏视角重建&#xff0c;与sapnn3r的目的类似&#xff0c;这篇文章以并行的方法&#xff0c;扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战&#xff0c;尤其是在需要跨不同视角实现精确且可…

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方&#xff0c;在空白处鼠标右键选择通过Code打开 打开Vscode&#xff0c;点击platformIO图标&#xff0c;选择PIO Home下的open&#xff0c;最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

如何使用 DeepSeek API 结合 VSCode 提升开发效率

引言 在当今的软件开发领域&#xff0c;API 的使用已经成为不可或缺的一部分。DeepSeek 是一个强大的 API 平台&#xff0c;提供了丰富的功能和数据&#xff0c;可以帮助开发者快速构建和优化应用程序。而 Visual Studio Code&#xff08;VSCode&#xff09;作为一款轻量级但功…

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包&#xff0c;flutter开发中同样有这种方式&#xff0c;不过需要在原生中配置 具体方案其实flutter官网个了相关示例&#xff08;https://docs.flutter.dev/deployment/flavors&#xff09;,我这里记录一下自己的操作 Android …

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…

Hot100之堆

我们的PriorityQueue默认为最小堆&#xff0c;堆顶总是为最小 215数组中的第K个最大元素 题目 思路解析 暴力解法&#xff08;不符合时间复杂度&#xff09; 题目要求我们找到「数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素」。「数组排序后的第 k …

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注&#xff1a;引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 2、Mathtype 公式输入花体字、空心字 2.1 直接输入 花体字 在 mathtype 中直接输入 \mathcal{L} L \Large \mathcal{L} L…

建表注意事项(2):表约束,主键自增,序列[oracle]

没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束&#xff0c;区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用&#xff0c;需谨慎设计 添加…

Ubuntu20.04 磁盘空间扩展教程

Ubuntu20.04 磁盘空间扩展教程_ubuntu20 gpart扩容-CSDN博客文章浏览阅读2w次&#xff0c;点赞38次&#xff0c;收藏119次。执行命令查看系统容量相关的数据&#xff1a;df -h当前容量为20G&#xff0c;已用18G&#xff08;96%&#xff09;&#xff0c;可用844M&#xff0c;可用…

冯诺依曼体系架构和操作系统的概念

1.冯诺依曼体系架构 计算机的硬件大部分都遵循冯诺依曼体系架构&#xff0c;其图示如下 这里的存储器指的是内存&#xff0c;是一种断电易失的设备。 速度快 而磁盘&#xff0c;是一种永久存储的设备&#xff0c;其属于外设既是输出设备又是输入设备。速度慢 而运算器是一种…

OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)

文章目录 向量变换使用GLM变换&#xff08;缩放、旋转、位移&#xff09;将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试&#xff08;Z-buffer&#xff09;练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…

Linux第105步_基于SiI9022A芯片的RGB转HDMI实验

SiI9022A是一款HDMI传输芯片&#xff0c;可以将“音视频接口”转换为HDMI或者DVI格式&#xff0c;是一个视频转换芯片。本实验基于linux的驱动程序设计。 SiI9022A支持输入视频格式有&#xff1a;xvYCC、BTA-T1004、ITU-R.656&#xff0c;内置DE发生器&#xff0c;支持SYNC格式…

测试工程师的DS使用指南

目录 引言DeepSeek在测试设计中的应用 2.1 智能用例生成2.2 边界值分析2.3 异常场景设计DeepSeek在自动化测试中的应用 3.1 脚本智能转换3.2 日志智能分析3.3 测试数据生成DeepSeek在质量保障体系中的应用 4.1 测试策略优化4.2 缺陷模式预测4.3 技术方案验证DeepSeek在测试效能…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…

linux运行级别

运行级别&#xff1a;指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换&#xff1a;init (级别数) 示例&#xff1a; linux的运行级别一共有7种&#xff0c;分别是&#xff1a; 运行级别0&#xff1a;停机状态 运行级别1&#xff1a;单用户模式/救援模式…