【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-GSYVideoPlayer
简介
GSYVideoPlayer是一个视频播放器库,支持切换内核播放器(IJKPlayer、avplayer),并且支持视频截图能力、 视频生成gif能力、边播边缓存能力、视频全屏能力等多种能力。
效果展示:

下载安装
ohpm install @ohos/gsyvideoplayer
OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包
使用说明
规格说明
目前支持音视频规格: 由于本库播放音视频能力底层是avplayer或者ijkplayer去播放视频,所以支持的音视频规格跟随这两个库音视频规格。
avplayer规格说明
ijkplayer规格说明
使用标准播放器
- 设置内核播放器
可以在视频播放之前选择使用avplayer或者ijkplayer去播放视频。
import { GlobalContext } from '@ohos/gsyvideoplayer'aboutToAppear() {
GlobalContext.getContext().setObject("playType", PlayerType.SYSTEM_AVPLAYER);
}
- 构建StandardGSYVideoModel对象:
videoModel: StandardGSYVideoModel = new StandardGSYVideoModel();aboutToAppear() {// 设置播放的url,设置播放不缓存this.videoModel.setUrl(this.videoUrl, false);this.videoModel.setTitle("这是测试视频的标题");this.videoModel.setBackClickListener(this.backClickListener);this.videoModel.setFullClickListener(this.fullClickListener);this.videoModel.setCoverImage($r('app.media.app_icon'));
}
- 界面build()中使用StandardGSYVideoPlayer组件,传入StandardGSYVideoModel对象
build() {Row() {Column() {StandardGSYVideoPlayer({videoModel: this.videoModel}).height(this.screenHeight)}.width('100%')
}
}
- 在@Entry标签的界面生命周期需要控制播放器的播放状态
aboutToDisappear() {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {player.stop();}
}onPageShow() {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {player.resumePlay();}
}onPageHide() {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {player.pause();}
}
视频截图能力
Button("点击截图").onClick(() => {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {let path = getContext(this).cacheDir + "/test.jpeg";player.saveFrame(path, {shotResult(code: number) {promptAction.showToast({message: code == 0 ? "截图操作成功" : "截图操作失败"});}})}
})
视频生成gif能力
Button("startGif").onClick(() => {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {let path = getContext(this).cacheDir + "/tempGif";player.startGif(path);promptAction.showToast({message: "开始gif截图"});}
})Button("stopGif").onClick(() => {let player = GlobalContext.getContext().getObject("currentPlayer") as BaseVideoPlayer;if (player) {this.dialogController.open();let path = getContext(this).cacheDir + "/gifTest.gif";let that = this;player.stopGif(path, {gifResult(code: number) {that.dialogController.close();promptAction.showToast({message: code == 0 ? "gif截图成功" : "gif截图失败"});}})}
})
边播边缓存能力
可以在构建StandardGSYVideoModel对象时,控制是否需要边播边缓存。
videoModel: StandardGSYVideoModel = new StandardGSYVideoModel();aboutToAppear() {// 设置播放的url,设置播放不缓存this.videoModel.setUrl(this.videoUrl, false);
}
视频全屏能力
可以在构建StandardGSYVideoModel对象时,设置全屏回调接口,全屏逻辑由用户控制。
fullClickListener: () => void = () => {}videoModel: StandardGSYVideoModel = new StandardGSYVideoModel();aboutToAppear() {// 设置播放的url,设置播放不缓存this.videoModel.setUrl(this.videoUrl, false);this.videoModel.setFullClickListener(this.fullClickListener);
}
接口说明
StandardGSYVideoModel
| 方法名 | 入参 | 接口描述 |
|---|---|---|
| setUrl(videoUrl: string, cacheWithPlay?: boolean) | videoUrl: string, cacheWithPlay?: boolean | 设置播放url,设置是否边播边缓存 |
| setTitle(title: string) | title: string | 设置视频全屏时的标题 |
| setBackClickListener(backClickListener: () => void) | backClickListener: () => void | 设置点击播放器返回按钮的回调接口 |
| setFullClickListener(fullClickListener: () => void) | fullClickListener: () => void | 设置点击播放器全屏按钮的回调接口 |
| setCoverImage(coverImage:Resource) | coverImage:Resource | 设置封面接口 |
IVideoPlayer
| 方法名 | 入参 | 接口描述 |
|---|---|---|
| play(); | 无 | 视频开始播放 |
| resumePlay() | 无 | 视频恢复播放 |
| pause() | 无 | 视频暂停播放 |
| stop() | 无 | 视频停止播放 |
| saveFrame(fileSavePath: string, gsyVideoShotSaveListener: GSYVideoShotSaveListener) | fileSavePath: string, gsyVideoShotSaveListener: GSYVideoShotSaveListener | 视频截图 |
| startGif(tmpPicPath?: string) | tmpPicPath?: string | 视频开始gif |
| stopGif(saveGifPath: string, gsyVideoGifSaveListener: GSYVideoGifSaveListener) | 无 | 视频结束gif,并生成gif |
约束与限制
在下述版本验证通过:
DevEco Studio:NEXT Developer Beta1(5.0.3.326), SDK: API12 (5.0.0.25) DevEco Studio:NEXT Beta1-5.0.3.806, SDK: API12 Release (5.0.0.66)
目录结构
|---- GSYVideoPlayer
| |---- entry # 示例代码文件夹|---- pages|---- BiliDanmukuParser.ets # 弹幕解析类|---- DanmakuData.ets # 弹幕数据|---- DanmakuVideoDemo.ets # 弹幕demo|---- DanmakuVideoPlayer.ets # 弹幕播放器|---- Index.ets # 首页|---- PlayNetWithCacheDemo.ets # 边播放边缓存demo|---- PlayNetWithNoCacheDemo.ets # 边播放不缓存demo|---- PlayWithCacheDemo.ets # 播放缓存入口|---- SimpleDemo.ets # 简单播放测试demo|---- SimpleList.ets # 简单视频列表demo
| |---- library # GSYVideoPlayer核心代码|---- listener # 接口回调类|---- GSYVideoGifSaveListener.ets # stopGif接口回调类|---- GSYVideoShotSaveListener.ets # 截图接口回调类|---- mainpage # 核心实现|---- AvPlayerControl.ets # avplayer逻辑控制类|---- AvVideoPlayer.ets # avplayer播放器|---- BaseVideoPlayer.ets # 播放器控制基类|---- CommonConstants.ets # 常量类|---- GlobalContext.ts # 全局配置类|---- IjkPlayerControl.ets # ijkplayer逻辑控制类|---- IjkVideoPlayer.ets # ijkplayer播放器|---- StandardForListGSYVideoPlayer.ets # 为list页面使用的播放器|---- StandardGSYVideoModel.ets # 标准播放器|---- StandardGSYVideoPlayer.ets # 播放器数据配置类|---- utils # 工具类|---- OrientationUtil.ets # 屏幕方向控制类|---- LogUtils.ets # log工具类
| |---- README.md # 安装使用方法
| |---- README_zh.md # 安装使用方法相关文章:
【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-GSYVideoPlayer
简介 GSYVideoPlayer是一个视频播放器库,支持切换内核播放器(IJKPlayer、avplayer),并且支持视频截图能力、 视频生成gif能力、边播边缓存能力、视频全屏能力等多种能力。 效果展示: 下载安装 ohpm install ohos/gs…...
IDEA中常见问题汇总
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现
代码下载:私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题,提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…...
React中使用useReducer高阶钩子来管理状态
在React开发中,状态管理是一个重要的概念。useState钩子用于管理简单的局部状态,但对于复杂的状态逻辑,useReducer钩子提供了更强大和灵活的解决方案。本文将详细介绍如何在React中使用 useReducer高阶钩子来管理状态。 一、useReducer概述 …...
一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路
以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...
聚类算法概念、分类、特点及应用场景【机器学习】【无监督学习】
概念 机器学习聚类算法是一种无监督学习方法,旨在将数据集分割成不同的类或簇,使得同一簇内的数据对象相似性尽可能大,而不同簇之间的数据对象差异性也尽可能大。聚类算法广泛应用于新闻自动分组、用户分群、图像分割等领域。 主要聚类算…...
Oracle数据连接 Dblink
拓展: oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件(服务器IP,服务器的数据库名,服务器的数据库端口号) c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...
Deepseek系列从v3到R易背面经版
deepseek v3 base要点 MTP : Multi-Token Prediction 训练时: 1. 把前一个block中input tokens经过embedding layer和transformer block的输出,进入output head之前的内容记为h,与下一个block的input tokens经过embedding layer输出的内容都…...
Maven入门核心知识点总结
Maven 1. POM(Project Object Model)2. 坐标(Coordinates)3. 依赖管理(Dependency Management)4. 常用五个生命周期(Life Circle)5. Maven 仓库(Maven Repository&#x…...
Blocked aria-hidden on an element because its descendant retained focus.
在使用el-popover和el-radio-group实现弹窗选择数据后调用el-popover的doClose()方法时一直报错! 经过分析发现el-popover及el-radio__original有aria-hidden属性,具体aria-hidden属性应用自行搜索了解。既然是这个玩意引起的,则在显示时将a…...
JavaScript 基础语法:变量、数据类型、运算符、条件语句、循环
JavaScript 是一种动态类型的脚本语言,广泛用于前端开发。以下是 JavaScript 基础语法的核心内容,包括变量、数据类型、运算符、条件语句和循环。 --- ### 1. 变量 变量用于存储数据。JavaScript 中有三种声明变量的方式: - **var**&…...
ElementUI的常用组件及使用技巧
1. 引言 项目背景与目标 随着前端技术的快速发展,构建高效、美观的用户界面变得越来越重要。ElementUI作为一款基于Vue.js的组件库,提供了丰富的组件和工具,帮助开发者快速构建高质量的Web应用。本文旨在介绍ElementUI的常用组件及其使用技巧,帮助开发者更好地利用Elemen…...
python爬虫--简单登录
1,使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...
三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信
三次握手: 第一次握手:客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态 第二次握手:服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y,服务器进入SYN_RECV状态 第三次握手:客户端向服…...
Linux TCP 编程详解与实例
一、引言 在网络编程的领域中,TCP(Transmission Control Protocol)协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下,使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…...
Vue.js 如何自定义主题和样式
Vue.js 如何自定义主题和样式 今天我们来聊聊如何在 Vue 项目中自定义主题和样式。无论是你想让自己的应用看起来独一无二,还是想快速适配设计稿,自定义主题和样式都是必不可少的一环。下面我将和大家分享几种常见的自定义方法和技巧。 为什么要自定义…...
Elasticsearch 开放推理 API 增加了 Azure AI Studio 支持
作者:来自 Elastic Mark Hoy Elasticsearch 开放推理 API 现已支持 Azure AI Studio。在此博客中了解如何将 Azure AI Studio 功能与 Elasticsearch 结合使用。 作为我们持续致力于为 Microsoft Azure 开发人员提供他们选择的工具的一部分,我们很高兴地宣…...
提示工程:少样本提示(Few-shot Prompting)
少样本提示(Few-shot Prompting)是一种利用大语言模型从少量示例样本中学习并处理任务的方法。它的核心思想是利用大语言模型的上下文学习能力,通过在提示中增加“示例样本”来启发大语言模型达到举一反三的效果。这种方法避免了重新训练或者…...
封装descriptions组件,描述,灵活
效果 1、组件1,dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…...
数据中台是什么?:架构演进、业务整合、方向演进
文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例:金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…...
Android FCM推送及通知栏展示
需求: 实现FIrebase Cloud Message推送功能,用户收到通知后,可以悬浮通知,自定义的大/小通知展示在通知栏,判断前台/后台,点击后进行跳转。 步骤: 一、配置及接入依赖库 1.下载 google-serv…...
【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践
基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域,噪声去除是一个关键问题,尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解(VMD)作为一种新兴的信号分解方法,因其能够自适应地分解信号而受到…...
4. Go结构体使用
1、结构体的简介 结构体(Struct)是编程语言中常见的一种复合数据类型,它将不同类型的数据元素(成员)组合成一个单一的实体。通过结构体,程序员可以将具有不同类型和性质的信息绑定到一个对象中,…...
ubuntu20使用tigervnc远程桌面配置记录
一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件:vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…...
【WB 深度学习实验管理】使用 PyTorch Lightning 实现高效的图像分类实验跟踪
本文使用到的 Jupyter Notebook 可在GitHub仓库002文件夹找到,别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中,实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构,还是监…...
编译spring 6.2.2
如何编译Spring 6.2.2 下载spring 6.2.2 首先,下载spring 6.2.2,地址:下载 解压到你的目录下。 下载gradle 下载gradle,这是spring项目的依赖管理工具,本文下载的是8.12.1。 gradle idea配置如下:在你的…...
【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
1. 安装必要的依赖 以 CentOS 7 系统为例,安装必要的依赖包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…...
MHTML文件如何在前端页面展示
MHTML文件如何在前端页面展示 需求背景: 目前在给证券公司做项目,但是在使用新系统的过程中,甲方还希望之前之前系统的历史记录可以看到。 最初制定的计划是项目组里面做数据的把原系统页面爬取下来,转成图片,直接给…...
Spring Boot的常用注解
Spring Boot 常用注解 主要分为以下几类: Spring 核心注解Spring Boot 相关注解Spring MVC 相关注解Spring Data JPA 相关注解Spring 事务管理Spring Security 相关注解Spring AOP 相关注解Spring 其他常用注解 下面是详细分类和表格展示👇:…...
【R语言】plyr包和dplyr包
一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”(split-apply-combine)策略。此策略是指将一个问题分割成更容易操作的部分,再对每一部分进行独立的操作,最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...
