简介
GSYVideoPlayer是一个视频播放器库,支持切换内核播放器(IJKPlayer、avplayer),并且支持了多种能力。
效果展示:

下载安装
ohpm install @ohos/gsyvideoplayerOpenHarmony 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.鸿蒙南向开发方向
