插件
西瓜视频播放器主张一切设计都是插件,小到一个播放按钮大到一项直播功能支持。想更好的自定义播放器完成自己业务的契合,理解插件机制是非常重要的,播放器本身有很多内置插件,比如报错、loading、重播等,如果大家想自定义效果可以关闭内置插件,自己开发即可。
默认情况下插件是自启动的,如果自定义插件不想自启动或者不想改变播放器默认的执行机制,建议以继承播放器类的方式开发。
内置插件
play
控制条的播放/暂停按钮,不建议改动。源码
time
控制条的当前时间/视频时长显示组件,可以自定义。源码
volume
控制条的音量控制组件,不建议改动。源码
definition
控制条的清晰度切换组件,不建议改动,事件驱动满足任意形式的实现。源码
fullscreen
控制条的全屏切换组件,不建议改动。源码
poster
播放器贴图,不建议改动。源码
progress
播放器进度条和预览图,不建议改动。源码
loading
播放器加载提示,可以自定义。源码
error
播放器错误提示,可以自定义。源码
replay
播放器重播操作界面,可以自定义。源码
playbackRate
播放器倍速播放,不建议改动。源码
makeBullet
播放器弹幕,不建议改动。源码
textTrack
播放器外挂字幕,不建议改动。源码
pip
播放器画中画功能,不建议改动。源码
cssFullscreen
控制条的网页样式全屏切换组件,icon可以自定义。源码
screenShot
播放器内部截图,截图格式可以自定义。源码
playNext
播放器跳转播放下一集,不建议改动。源码
rotate
播放器旋转控件,可以自定义。源码
download
播放器下载控件,可以自定义。源码
localPreview
播放器预览本地视频功能,不建议改动。源码
i18n
播放器多语种定义,不建议改动,通过配置项增加其他语言。源码
pc
播放器PC交互定义,包括进场动画。源码
mobile
播放器mobile交互定义,包括进场动画。源码
自定义插件
- 开发插件
// pluginName.js
import Player from 'xgplayer';
let pluginName=function(player){
// 插件逻辑
}
Player.install('pluginName',pluginName);
- 使用插件
import Player from 'xgplayer';
let player = new Player({
id: 'xg',
url: '//abc.com/**/*.mp4'
})
功能插件列表
播放器提供了常用功能的插件,比如 hls 直播(点播)、flv 直播(点播)、mp4 流式点播、dash 点播。
xgplayer-mp4
ios系统不支持该插件 对普通mp4视频的解析器,能实现播放器对缓冲、预加载的控制、精确的seek加载、视频的无缝切换 (播放器清晰度切换配置详见清晰度切换配置)、流量节省。。使用方式如下:
import 'xgplayer';
import Mp4Player from 'xgplayer-mp4';
let player = new Mp4Player({
id: 'xg',
url: '//abc.com/**/*.mp4',
maxBufferLength: 10 // 设置最大缓冲区时长,默认5秒
})
注意
使用该插件需要配置CORS,video本身是支持跨域的,但是我们是通过 Javascript 来加载视频的,所以会有跨域的问题而且我们为了实现精确加载使用 Range 会触发 CORS 的 options 请求,所以在视频资源要配置好 CORS。参考资料:Nginx通过CORS实现跨域,如果使用的是 CDN,请联系对应的 CDN 厂商进行配置,很简单的哟。
这个插件是自动执行的,对于不支持的浏览器会自动降级。
xgplayer-hls
ios系统不支持该插件
对于hls协议的点播(直播)可以使用该插件完成,这个插件没依赖任何第三方代码完全自主实现,从解m3u8文件到ts文件。优点是代码结构清晰、比hls.js轻量很多、官方维护。缺点是兼容性有瑕疵,没有按hls标准的视频可能会无法播放。
import 'xgplayer';
import HlsPlayer from 'xgplayer-hls';
let player = new HlsPlayer({
id: 'xg',
url: '//abc.com/**/*.m3u8'
})
xgplayer-hls.js
对于hls协议的点播(直播)可以使用该插件完成,该插件是对hls.js的封装,力求稳定的同学可以使用该插件。
import 'xgplayer';
import HlsJsPlayer from 'xgplayer-hls.js';
let player = new HlsJsPlayer({
id: 'xg',
url: '//abc.com/**/*.m3u8',
//isLive: true, //直播场景设置为true
//useHls: true,
//hlsOpts: {
// xhrSetup: function(xhr, url) {
// xhr.withCredentials = true;
// }
//} //hls.js可选配置项
})
注意
移动端原生video支持直接播放hls,所以xgplayer-hls.js在移动端环境下关闭了hls.js相关解析功能;如果需要在移动端环境下打开hls.js解析功能,可使用配置项 useHls: true
xgplayer-hls.js插件在xgplayer播放器基础配置的基础上还具有一些hls.js专属配置项,请参考 hls.js配置。
xgplayer-flv
ios系统不支持该插件
对于flv协议的点播(直播)可以使用该插件完成,这个插件没依赖任何第三方代码完全自主实现。优点是代码结构清晰、比flv.js轻量很多、官方维护。
import 'xgplayer';
import FlvPlayer from 'xgplayer-flv';
let player = new FlvPlayer({
id: 'xg',
url: './xgplayer-demo.flv',
poster: './poster.png',
isLive: false,
preloadTime: 30,
minCachedTime: 5,
cors: true
})
xgplayer-flv插件在xgplayer播放器基础配置的基础上还具有一些可选的特殊配置项。
配置项 | 含义 | 默认值 |
---|---|---|
isLive | 是否直播 | false |
preloadTime | 预加载时长(秒) | 30 |
minCachedTime | 当前播放时间距离已缓存资源片段结束点剩多长时间时开始请求新片段(秒) | 5 |
cors | 请求是否跨域 | true |
xgplayer-flv.js
ios系统不支持该插件
对于flv协议的点播(直播)可以使用该插件完成,这个插件依赖flv.js。
import 'xgplayer';
import FlvJsPlayer from 'xgplayer-flv.js';
let player = new FlvJsPlayer({
id: 'xg',
url: '//abc.com/**/*.flv',
//isLive: true, //直播场景设置为true
hasVideo: true,
hasAudio: true,
flvOptionalConfig: {
enableWorker: true
} //flv.js可选配置项
})
xgplayer-flv.js插件在xgplayer播放器基础配置的基础上还具有一些flv.js专属配置项,请参考 flv.js配置。
注意
xgplayer-flv和xgplayer-flv.js插件在请求跨域视频源时需要视频源端带range服务。
xgplayer-logger
xgplayer为常用的几种站点统计方式(cnzz, baidu, gtag, raven)提供了数据配置接口,用户可选择其中某种统计方式在播放器事件发生时上报所需数据。
import Player from 'xgplayer';
import 'xgplayer-logger';
let player = new Player({
id: 'xg',
url: './xgplayer-demo.mp4',
loggers: [{
type: 'cnzz', // 'cnzz' | 'baidu' | 'gtag' | 'raven'
options: { //以下为默认值,可以传入以覆盖
category: 'video',
actions: { // 覆盖事件触发时的action
error: 'error',
complete: 'complete',
play: 'play',
pause: 'pause',
end: 'end',
ready: 'ready',
seek: 'seek',
unload: 'unload'
},
label: player.config.url, // label 的值
value: { // 上报的数据
error: (player) => player.currentTime,
complete: (player) => player.currentTime,
play: (player) => player.currentTime,
pause: (player) => player.currentTime,
end: (player) => player.currentTime,
unload: (player) => player.currentTime,
seek: (player) => player.currentTime,
ready: (player) => player.currentTime
}
}
}]
})
注意
播放器核心包和插件都使用 babel 编译到 ES5。