简介
GSYVideoPlayer是一个视频播放器库,支持切换内核播放器(IJKPlayer、avplayer),并且支持了多种能力。
效果展示:
下载安装
ohpm install @ohos/gsyvideoplayer
OpenHarmony ohpm
环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包
使用说明
规格说明
目前支持音视频规格:
由于本库播放音视频能力底层是avplayer或者ijkplayer去播放视频,所以支持的音视频规格跟随这两个库音视频规格。
使用标准播放器
- 设置内核播放器
可以在视频播放之前选择使用avplayer或者ijkplayer去播放视频。
typescript
import { GlobalContext } from '@ohos/gsyvideoplayer'
aboutToAppear() {
GlobalContext.getContext().setObject("playType", PlayerType.SYSTEM_AVPLAYER);
}
- 构建StandardGSYVideoModel对象:
typescript
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对象
typescript
build() {
Row() {
Column() {
StandardGSYVideoPlayer({
videoModel: this.videoModel
}).height(this.screenHeight)
}.width('100%')
}
}
- 在@Entry标签的界面生命周期需要控制播放器的播放状态
typescript
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();
}
}
视频截图能力
typescript
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能力
typescript
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对象时,控制是否需要边播边缓存。
typescript
videoModel: StandardGSYVideoModel = new StandardGSYVideoModel();
aboutToAppear() {
// 设置播放的url,设置播放不缓存
this.videoModel.setUrl(this.videoUrl, false);
}
视频全屏能力
可以在构建StandardGSYVideoModel对象时,设置全屏回调接口,全屏逻辑由用户控制。
typescript
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: 4.0 (4.0.3.513), SDK: API10 (4.0.10.10)
目录结构
typescript
|---- 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 # 安装使用方法
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ......
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ......
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ......
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向