jol-player,从需求到开源发布,一款轻量级,功能强大的react播放器,支持react最新版本(18+)

3,915 阅读5分钟

背景

公司最近要做一个学习平台,并且是要包含视频的,而且视频的样式要求符合该项目的主题,对于我这个没有音视频开发经验的新手来说,有点小难度哈,不过这点难度,算不了什么,用雷军的话来说;‘生死看淡,不服就干’。

梳理需求

  • 要有常见的功能,全屏,暂停,快进,音量,倍数等等功能
  • 样式要美观,符合该项目整个风格
  • 视频可控性要强 针对如上等需求,我开始了探索,原生video标签肯定是不行的,但是肯定要用它来做为基础开发的,我看了下,腾讯视频B站优酷等播放器,发现大部分的功能都差不多,B站的功能可能多点,但常用的功能都差不多。

我们这个项目的技术栈主要是tsreact,所以我去react社区找了一下video相对应的组件或者插件,发现使用频率较高的是video-reactDplayer.jsvideo.js等,但这些组件和插件虽然很强大,功能丰富,但还是不太符合我们项目,而且对ts的支持很差,video-react甚至直接停止维护了,再就是这些播放器样式太丑,图标不够突出,更腾讯视频B站等播放器比起来,你会觉得太low了,网上样式好看的,功能强大的,符合自已项目的插件,简直找不到,这条路算是彻底的断了,开启自已写播放器的道路。

d71f009bd8e64261982c3281dc14d1a6.jpeg

设计阶段

  • 播放器框架图如下 搜狗截图20210823181724.png
  • 技术栈

typescriptreactwebpackbabel,视频播放器就采用tsreact开发,不借助任何第三方插件,轻量简洁。

  • 思路 采用react中的hooks进行编写,useReducer+createContext实现模拟redux进行全局数据流传递,大概的思路流程如下图:

sw.png

 使用简介 + 快速上手

jol-player项目地址体验地址.

✨ 特性

  • 📦 开箱即用的高质量 React 组件。
  • 🛡 使用 TypeScript 开发,提供完整的类型定义文件。
  • 🌍 国际化语言支持。
  • 🎨 主题,组件,定制能力。
  • 👊 强大的 API 和回调函数
  • ⚡ 体积小,80kb
  • ⚡ 支持react最新版本18+

下载

因为我们是把项目上传到了npm方便其他项目用,所以可以直接从 npm 上下载。

npm install jol-player --save

使用

import JoLPlayer from "jol-player";

const App = () => (
  <>
    <JoLPlayer
        option={{
          videoSrc:"https://x.com/a.mp4",
          width: 750,
          height: 420,
        }}
      />
  </>
);
  1. 基本用法 如下属性来自option属性配置项.
参数说明类型默认值
videoSrc视频地址(必传string必传
mode视频缩放模式scaleToFill(不保持纵横比缩放) widthFix(宽度固定,高度自动变化,保持原视频宽高比不变) heightFix(高度固定,宽度自动变化,保持原视频宽高比不变-)scaleToFill
height视频容器的 heightnumber-
width视频容器的 widthnumber-
autoPlay自动播放booleanfalse
theme主题string#ffb821
poster视频封面图string-
setEndPlayContent自定义视频结束时显示的内容React.ReactNode-
setBufferContent自定义视频缓冲加载组件React.ReactNode-
setPauseButtonContent自定义视频暂停键React.ReactNode-
pausePlacement暂停键的位置bottomRight,centerbottomRight
hideMouseTime多少毫秒,无任何操作,隐藏鼠标和控制器/msnumber2000
isShowMultiple是否显示播放倍数功能booleantrue
isShowSet是否显示设置功能booleantrue
isShowScreenshot是否显示截图功能booleantrue
isShowPicture是否显示画中画booleantrue
isShowWebFullScreen是否显示网页全屏booleantrue
language语言zh,enzh
isShowPauseButton是否显示暂停键booleantrue
quality视频质量清晰度的选择列表qualityAttributes[]-
videoType视频播放格式,支持h264(.mp4,.webm,.ogg),hls(.m3u8)h264,hlsh264
isToast是否显示toastbooleanfalse
toastPositiontoast的位置,此值只有isToast为true时,才有效果leftTop,rightTop,leftBottom,rightBottom,centerleftTop
isProgressFloat是否显示进度条浮层提示booleanfalse
progressFloatPosition进度条浮层提示的位置,此值只有isProgressFloat为true时,才有效果tp,btbt

温馨提示:qualityAttributes接口声明如下:👇

/**
 * 标清 360P SD
 * 高清 540P HD
 * 超清 720P FHD
 * 蓝光 1080P BD
 */
export type qualityName = 'SD' | 'HD' | 'FHD' | 'BD';

export type qualityKey = '360P' | '540P' | '720P' | '1080P';

export interface qualityAttributes<T = qualityName> {
  name: T;
  url: string;
}

2 方法

名称说明类型
load重新加载() => void
pause暂停() => void
play开始播放() => void
setVolume设置音量,[0-100](par:number ) => void
seek设置指定视频的播放位置/s(par:number ) => void
setVideoSrc设置播放视频的地址 src(par:string ) => void

提示:如上方法要借助ref才能调用,如:xxx.current.load()

👉具体请参看,demo案例

  1. 回调函数
export interface videoAttributes<T = number, K = boolean> {
  /**
   * @description 是否播放
   */
  isPlay: K;
  /**
   * @description 当前时间/s
   */
  currentTime: T;
  /**
   * @description 总时长
   */
  duration: T;
  /**
   * @description 缓存时长/s
   */
  bufferedTime: T;
  /**
   * @description 是否开启画中画
   */
  isPictureinpicture: K;
  /**
   * @description 音量
   */
  volume: T;
  /**
   * @description 视频播放倍数
   */
  multiple: T;
  /**
   * @description 是否结束
   */
  isEndEd: K;
  /**
   * @description 错误
   */
  error: null | T;
}

名称说明类型
onProgressMouseDown滑动条按下不放,拖动回调(e: videoAttributes) => void
onProgressMouseUp滑动条按下松开回调(e: videoAttributes) => void
onPlay视频开始播放回调(e: videoAttributes) => void
onPause视频暂停播放的回调(e: videoAttributes) => void
onTimeChange视频在播放,时间变化回调(e: videoAttributes) => void
onEndEd视频结束时回调(e: videoAttributes) => void
onvolumechange音量改变时的回调(e: videoAttributes) => void
onError视频播放失败的回调() => void

👉具体请参看,demo案例

  1. jol-player接收的参数接口如下:👇
export interface videoparameter extends Partial<videoCallback> {
  style?: React.CSSProperties;
  /**
   * @description 组件的配置项
   */
  option: videoOption;
  className?: string;
  ref?: JoLPlayerRef
}

🌹赞赏

如果您认为该项目对您有所帮助,则可以给作者一个赞,作者非常感激😊😊🌹

同时,笔者的ant-simple-pro项目也在持续的更新中,其中已经将vue(vue3)版本中的webpack构建全部换成了vitereact版本也会升级18+vite,尽请期待。