🎉 新增视频播放器组件 scVideo

This commit is contained in:
sakuya 2021-11-29 19:24:05 +08:00
parent d28438f18f
commit 4dd61edc99
4 changed files with 230 additions and 1 deletions

View File

@ -23,7 +23,9 @@
"vue-i18n": "9.1.9",
"vue-router": "4.0.12",
"vuedraggable": "4.0.3",
"vuex": "4.0.2"
"vuex": "4.0.2",
"xgplayer": "2.31.3",
"xgplayer-hls": "2.4.32-3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.5.15",

View File

@ -0,0 +1,123 @@
<!--
* @Descripttion: xgplayer二次封装
* @version: 1.0
* @Author: sakuya
* @Date: 2021年11月29日12:10:06
* @LastEditors:
* @LastEditTime:
-->
<template>
<div class="sc-video" ref="scVideo"></div>
</template>
<script>
import Player from 'xgplayer'
import HlsPlayer from 'xgplayer-hls'
export default {
props: {
//
src: { type: String, required: true, default: "" },
//
poster: { type: String, default: "" },
//
volume: { type: Number, default: 0.8 },
//
controls: { type: Boolean, default: true },
//
isLive: { type: Boolean, default: false },
//
autoplay: { type: Boolean, default: false },
//
loop: { type: Boolean, default: false },
//
videoInit: { type: Boolean, default: false },
//
pip: { type: Boolean, default: false },
//
playbackRate: { type: [Array, String], default: () => [0.5, 0.75, 1, 1.5, 2] },
//
lastPlayTime: { type: Number, default: 0 },
//
danmu: { type: [Array, String], default: "" },
//
resource: { type: Array, default: () => [] },
//
progressDot: { type: Array, default: () => [] },
},
data() {
return {
player: null
}
},
mounted() {
if(this.isLive){
this.initHls()
}else{
this.init()
}
},
methods: {
init(){
this.player = new Player({
el: this.$refs.scVideo,
url: this.src,
fluid: true,
poster: this.poster,
lang: 'zh-cn',
volume: this.volume,
autoplay: this.autoplay,
loop: this.loop,
videoInit: this.videoInit,
playbackRate: this.playbackRate,
lastPlayTime: this.lastPlayTime,
pip: this.pip,
controls: this.controls,
danmu: this.formatDanmu(this.danmu),
progressDot: this.progressDot
})
this.player.emit('resourceReady', this.resource)
},
initHls(){
this.player = new HlsPlayer({
el: this.$refs.scVideo,
url: this.src,
fluid: true,
poster: this.poster,
isLive: true,
ignores: ['time','progress'],
lang: 'zh-cn',
volume: this.volume,
pip: this.pip,
controls: this.controls,
})
},
formatDanmu(danmu){
if(!danmu){
return false
}
let newDanmu = []
danmu.forEach(item => {
newDanmu.push({
id: item.id || '',
start: item.start || 0,
txt: item.txt || '',
duration: 10000,
mode: item.mode || 'scroll',
style: item.style || {}
})
})
return {
comments: newDanmu
}
}
}
}
</script>
<style scoped>
.sc-video:deep(.danmu) > * {color: #fff;font-size:20px;font-weight:bold;text-shadow:1px 1px 0 #000,-1px -1px 0 #000,-1px 1px 0 #000,1px -1px 0 #000;}
.sc-video:deep(.xgplayer-controls) {background-image: linear-gradient(180deg, transparent, rgba(0,0,0,0.3));}
.sc-video:deep(.xgplayer-progress-tip) {border:0;color: #fff;background: rgba(0,0,0,.5);line-height: 25px;padding: 0 10px;border-radius: 25px;}
</style>

100
src/views/vab/video.vue Normal file
View File

@ -0,0 +1,100 @@
<template>
<el-main>
<el-row :gutter="15">
<el-col :lg="12">
<el-card shadow="never" header="MP4点播">
<sc-video
ref="mp4"
src="https://cdn.jsdelivr.net/gh/scuiadmin/CDN/video/scui-player-demo-1080.mp4"
poster="https://cdn.jsdelivr.net/gh/scuiadmin/CDN/video/scui-player-demo-1080_Moment.jpg"
:resource="resource"
:danmu="danmu"
:progressDot="progressDot"
pip
></sc-video>
<div style="margin-top: 15px;">
<el-form inline>
<el-form-item>
<el-select v-model="mode" placeholder="Select">
<el-option label="默认" value="scroll"></el-option>
<el-option label="顶部" value="top"></el-option>
<el-option label="底部" value="bottom"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="input" placeholder="Please input" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="sendComment">发送弹幕</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
</el-col>
<el-col :lg="12">
<el-card shadow="never" header="HlS(m3u8)直播">
<sc-video
src="http://cctvalih5ca.v.myalicdn.com/live/cctv5_2/index.m3u8"
isLive
></sc-video>
</el-card>
</el-col>
</el-row>
</el-main>
</template>
<script>
import scVideo from '@/components/scVideo'
export default {
name: 'scvideo',
components: {
scVideo
},
data() {
return {
input: '',
mode: 'scroll',
resource: [
{name: '720P', url: 'https://cdn.jsdelivr.net/gh/scuiadmin/CDN/video/scui-player-demo-720.mp4'},
{name: '1080P', url: 'https://cdn.jsdelivr.net/gh/scuiadmin/CDN/video/scui-player-demo-1080.mp4'}
],
progressDot: [
{time: 3, text: '标记文字'}
],
danmu: [
{
id: '1',
start: 3000,
txt: 'SCUI VIDEO DEMO'
},
{
id: '2',
start: 3000,
txt: '一键三连,下次一定'
}
]
}
},
mounted() {
},
methods: {
sendComment(){
if(this.$refs.mp4.player.danmu && this.input){
this.$refs.mp4.player.danmu.sendComment({
id: 'newId' + new Date().getTime(),
start: this.$refs.mp4.player.currentTime*1000,
txt: this.input,
mode: this.mode
})
this.input = ''
}
}
}
}
</script>
<style>
</style>

View File

@ -57,6 +57,10 @@ module.exports = {
echarts: {
name: "echarts",
test: /[\\/]node_modules[\\/]echarts[\\/]/
},
xgplayer: {
name: "xgplayer",
test: /[\\/]node_modules[\\/]xgplayer.*[\\/]/
}
}
}