背景
公司最近要做一个学习平台,并且是要包含视频的,而且视频的样式要求符合该项目的主题,对于我这个没有音视频开发经验的新手来说,有点小难度哈,不过这点难度,算不了什么,用雷军的话来说;‘生死看淡,不服就干’。
梳理需求
- 要有常见的功能,全屏,暂停,快进,音量,倍数等等功能
- 样式要美观,符合该项目整个风格
- 视频可控性要强
针对如上等需求,我开始了探索,原生
video标签
肯定是不行的,但是肯定要用它来做为基础开发的,我看了下,腾讯视频
,B站
,优酷
等播放器,发现大部分的功能都差不多,B站
的功能可能多点,但常用的功能都差不多。
我们这个项目的技术栈主要是ts
,react
,所以我去react
社区找了一下video
相对应的组件
或者插件
,发现使用频率较高的是video-react,Dplayer.js,video.js等,但这些组件和插件虽然很强大,功能丰富,但还是不太符合我们项目,而且对ts
的支持很差,video-react甚至直接停止维护了,再就是这些播放器样式太丑,图标不够突出,更腾讯视频
,B站
等播放器比起来,你会觉得太low了,网上样式好看的,功能强大的,符合自已项目的插件,简直找不到,这条路算是彻底的断了,开启自已写播放器的道路。
设计阶段
- 播放器框架图如下
- 技术栈
typescript
,react
,webpack
,babel
,视频播放器就采用ts
,react
开发,不借助任何第三方插件,轻量简洁。
- 思路
采用
react
中的hooks
进行编写,useReducer
+createContext
实现模拟redux
进行全局数据流传递,大概的思路流程如下图:
使用简介 + 快速上手
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,
}}
/>
</>
);
- 基本用法
如下属性来自
option
属性配置项.
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
videoSrc | 视频地址(必传) | string | 必传 |
mode | 视频缩放模式 | scaleToFill (不保持纵横比缩放) widthFix (宽度固定,高度自动变化,保持原视频宽高比不变) heightFix (高度固定,宽度自动变化,保持原视频宽高比不变-) | scaleToFill |
height | 视频容器的 height | number | - |
width | 视频容器的 width | number | - |
autoPlay | 自动播放 | boolean | false |
theme | 主题 | string | #ffb821 |
poster | 视频封面图 | string | - |
setEndPlayContent | 自定义视频结束时显示的内容 | React.ReactNode | - |
setBufferContent | 自定义视频缓冲加载组件 | React.ReactNode | - |
setPauseButtonContent | 自定义视频暂停键 | React.ReactNode | - |
pausePlacement | 暂停键的位置 | bottomRight ,center | bottomRight |
hideMouseTime | 多少毫秒,无任何操作,隐藏鼠标和控制器/ms | number | 2000 |
isShowMultiple | 是否显示播放倍数功能 | boolean | true |
isShowSet | 是否显示设置功能 | boolean | true |
isShowScreenshot | 是否显示截图功能 | boolean | true |
isShowPicture | 是否显示画中画 | boolean | true |
isShowWebFullScreen | 是否显示网页全屏 | boolean | true |
language | 语言 | zh ,en | zh |
isShowPauseButton | 是否显示暂停键 | boolean | true |
quality | 视频质量清晰度的选择列表 | qualityAttributes[] | - |
videoType | 视频播放格式,支持h264(.mp4 ,.webm ,.ogg ),hls(.m3u8 ) | h264 ,hls | h264 |
isToast | 是否显示toast | boolean | false |
toastPosition | toast的位置,此值只有isToast 为true时,才有效果 | leftTop ,rightTop ,leftBottom ,rightBottom ,center | leftTop |
isProgressFloat | 是否显示进度条浮层提示 | boolean | false |
progressFloatPosition | 进度条浮层提示的位置,此值只有isProgressFloa t为true时,才有效果 | tp ,bt | bt |
温馨提示:
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; }
名称 | 说明 | 类型 |
---|---|---|
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()
- 回调函数
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 |
jol-player
接收的参数接口如下:👇
export interface videoparameter extends Partial<videoCallback> {
style?: React.CSSProperties;
/**
* @description 组件的配置项
*/
option: videoOption;
className?: string;
ref?: JoLPlayerRef
}
🌹赞赏
如果您认为该项目对您有所帮助,则可以给作者一个赞,作者非常感激😊😊🌹
同时,笔者的ant-simple-pro项目也在持续的更新中,其中已经将vue(vue3)
版本中的webpack构建全部换成了vite
,react
版本也会升级18+
和vite
,尽请期待。