【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-GSYVideoPlayer

news2025/2/11 5:20:44

简介

GSYVideoPlayer是一个视频播放器库,支持切换内核播放器(IJKPlayer、avplayer),并且支持视频截图能力、 视频生成gif能力、边播边缓存能力、视频全屏能力等多种能力。

效果展示:

gif

下载安装

ohpm install @ohos/gsyvideoplayer

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

使用说明

规格说明

目前支持音视频规格: 由于本库播放音视频能力底层是avplayer或者ijkplayer去播放视频,所以支持的音视频规格跟随这两个库音视频规格。

avplayer规格说明

ijkplayer规格说明

使用标准播放器

  1. 设置内核播放器

可以在视频播放之前选择使用avplayer或者ijkplayer去播放视频。

import { GlobalContext } from '@ohos/gsyvideoplayer'

aboutToAppear() {
GlobalContext.getContext().setObject("playType", PlayerType.SYSTEM_AVPLAYER);
}
  1. 构建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'));
}
  1. 界面build()中使用StandardGSYVideoPlayer组件,传入StandardGSYVideoModel对象
  build() {
    Row() {
      Column() {
        StandardGSYVideoPlayer({
          videoModel: this.videoModel
        }).height(this.screenHeight)

      }.width('100%')
}
}
  1. 在@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  # 安装使用方法

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

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

相关文章

IDEA中常见问题汇总

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现

代码下载:私信博主回复基于蜘蛛蜂优化算法的无人机集群三维路径规划Matlab实现 《基于蜘蛛蜂优化算法的无人机集群三维路径规划》 摘要 本研究针对无人机集群三维路径规划问题,提出了一种基于蜘蛛蜂优化算法的解决方案。以5个无人机构成的集群为研究对…

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…

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 编程的各个方面&…

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&#xff0c;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. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践

基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域&#xff0c;噪声去除是一个关键问题&#xff0c;尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解&#xff08;VMD&#xff09;作为一种新兴的信号分解方法&#xff0c;因其能够自适应地分解信号而受到…

ubuntu20使用tigervnc远程桌面配置记录

一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件&#xff1a;vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

【WB 深度学习实验管理】使用 PyTorch Lightning 实现高效的图像分类实验跟踪

本文使用到的 Jupyter Notebook 可在GitHub仓库002文件夹找到&#xff0c;别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中&#xff0c;实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构&#xff0c;还是监…

编译spring 6.2.2

如何编译Spring 6.2.2 下载spring 6.2.2 首先&#xff0c;下载spring 6.2.2&#xff0c;地址&#xff1a;下载 解压到你的目录下。 下载gradle 下载gradle&#xff0c;这是spring项目的依赖管理工具&#xff0c;本文下载的是8.12.1。 gradle idea配置如下&#xff1a;在你的…

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)

1. 安装必要的依赖 以 CentOS 7 系统为例&#xff0c;安装必要的依赖包&#xff1a; sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…

《XSS跨站脚本攻击》

一、XSS简介 XSS全称&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击&#xff0c;为了避免和CSS层叠样式表名称冲突&#xff0c;所以改为了XSS&#xff0c;是最常见的Web应用程序安全漏洞之一&#xff0c;位于OWASP top 10 2013/2017年度分别为第三名和第七名&…

Golang:精通sync/atomic 包的Atomic 操作

在本指南中&#xff0c;我们将探索sync/atomic包的细节&#xff0c;展示如何编写更安全、更高效的并发代码。无论你是经验丰富的Gopher还是刚刚起步&#xff0c;你都会发现有价值的见解来提升Go编程技能。让我们一起开启原子运算的力量吧&#xff01; 理解Go中的原子操作 在快…