Files
medicine_app/pages/component/commonComponents/video/index.vue
2024-09-09 11:21:05 +08:00

1181 lines
30 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="container" style="background-color: #000; position: relative">
<view style="width: 100%; height: 200px">
<view v-if="showCountDown" class="showCountDownd" style="">
<view class="">
<text class="nextText">{{secondCountDown}} 秒后播放下一个视频</text><br />
<view>
<text class="cancelNext" @click="hideNextVideo">取消下一个</text>
<!-- <text class="cancelNext" @click="replayVideo">重新播放</text> -->
</view>
<!-- <view class="cancelNext" @click="hideNextVideo">重新播放</view> -->
</view>
</view>
<view v-if="show"
style="height: 100%;display: flex;align-items:center;justify-content:center;color: #fff;font-size: 38rpx;text-align: center;">
{{errorTxt}}
</view>
<div class="" v-else style="background-color: #000" ref="videoContent" @tap="renderScript.handleClick"
id="url-player-test" :videoData="videoData" :winWidth="winWidth" :winHeight="winHeight"
:currentVideoList="currentVideoList" :firstTime="firstTime" :isfresh="isfresh" :platform="platform"
:isSetFirstTime="isSetFirstTime" :isChange="isChange" :change:videoData="renderScript.receiveMsg"
:replayVideoFlag="replayVideoFlag" :change:winWidth="renderScript.receiveWinWidth"
:change:winHeight="renderScript.receiveWinHeight" :change:firstTime="renderScript.receiveFirstTime"
:change:replayVideoFlag="renderScript.receiveReplayVideoFlag"
:change:isSetFirstTime="renderScript.receiveisSetFirstTime"
:change:isfresh="renderScript.receiveIsfresh" :change:platform="renderScript.receiveplatform"
:change:isChange="renderScript.receiveIsChange"
:change:currentVideoList="renderScript.receiveVideoList"></div>
<div @tap="renderScript.emitData" ref="videoContent1" v-show="false" class="videoContent1">
直接调用renderjs中的emitData的方法,传递当前播放时长
</div>
<div @tap="renderScript.endEmitData" ref="videoContent2" v-show="false" class="videoContent2">
监听结束方法记录播放时长
</div>
<div @tap="renderScript.changeVideoData" ref="videoContent3" v-show="false" class="videoContent3">
监听切换视频方法
</div>
<div @tap="renderScript.emitSetData" ref="videoContent4" v-show="false" class="videoContent4">
监听切换视频方法
</div>
<div @tap="renderScript.emitopenShow" ref="videoContent5" v-show="false" class="videoContent5">
打开视频提示
</div>
<div @tap="renderScript.emitLoadNextVideo" ref="videoContent6" v-show="false" class="videoContent6">
播放下一条
</div>
<div @tap="renderScript.emitHideNextVideo" ref="videoContent7" v-show="false" class="videoContent7">
隐藏播放下一条界面
</div>
<div @tap="renderScript.emitReplayVideoFlagFalse" ref="videoContent8" v-show="false" class="videoContent8">
隐藏播放下一条界面
</div>
<div @tap="renderScript.emitUnlockChangeVideo" ref="videoContent9" v-show="false" class="videoContent9">
释放切换键锁
</div>
<div class="fullScreenButton-container">
<div :class="`prism-fullscreen-btn ${isFullScreen ? 'fullscreen' : ''}`"
@tap="renderScript.changeVideoScreen"></div>
</div>
</view>
</view>
</template>
<script>
import store from "@/store/index.js";
import $http from "@/config/requestConfig.js";
import {
mapState,
mapMutations
} from "vuex";
export default {
props: ["currentVideo", "currentVideoList", "videoTitle", 'secondCountDown'],
data() {
return {
reaquestFlag: false,
show: false,
platform: null,
//当前是否是全屏模式
isFullScreen: false,
isfresh: false,
isChange: false,
isControl: true,
timer: null,
replayVideoFlag: false,
// secondCountDown: 5,
showCountDown: false,
playEndBlank: false,
// videoTitle: "",
videoList: [],
replayVideoLock: false, // 重播操作锁
firstTime: 0,
options: {},
playAuth: "",
currentTime: "",
videoId: "",
videoData: {},
isSetFirstTime: false,
screenType: null,
videoUrl: null,
errorTxt: '此设备暂不支持观看当前视频请移步到安卓手机进行学习!'
};
},
computed: {
...mapState(["videoOssList"]),
},
watch: {
currentVideo: {
immediate: true,
handler(newRoute) {},
},
timer(newValue) {
this.$emit("child-event", newValue);
},
},
// //页面显示
mounted() {},
beforeDestroy() {
this.handleEnd();
console.log("是否走啦习销毁");
// clearInterval(this.$store.state.videoTimer);
plus.screen.lockOrientation("portrait-primary");
// console.log("是否走啦习销毁定时器", this.timer);
},
async onUnload() {
uni.navigateTo({
url: "/pages/curriculum/order/curriculum/back",
});
// #ifdef APP-PLUS
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
// #endif
await this.setVideoTime();
},
//第一次加载
onLoad(options) {
},
methods: {
replayVideo() {
if (!this.replayVideoFlag) {
this.getLive(true, this.currentVideo)
console.log('this.currentVideo', this.currentVideo.id);
this.hideNextVideo()
this.replayVideoFlag = true
}
},
replayVideoFlagFalse() {
console.log('复原replayVideoFlag', this.replayVideoFlag);
this.replayVideoFlag = false
},
UnlockChangeVideo() {
this.$emit('unlockChangeVideo')
},
hideNextVideo() {
this.showCountDown = false
this.playEndBlank = false
this.$emit('hideNextVideo')
},
loadNextVideo() {
this.playEndBlank = true
var _list = [...this.currentVideoList]
_list = _list.map(item => {
return item.id
})
var thisIndex = _list.findIndex(item => {
return item == this.currentVideo.id
})
console.log('播放列表', _list, this.currentVideo.id, thisIndex);
if (thisIndex < this.currentVideoList.length - 1) {
this.showCountDown = true
this.$emit('startNextVideoCountDown')
}
},
openShow(data) {
data.msg ? this.errorTxt = data.msg : '此设备暂不支持观看当前视频请移步到安卓手机进行学习'
this.show = true;
},
start() {
this.$refs.playerView.start();
},
pause() {
// var playerView = ;
this.$refs.playerView.pause();
},
changeVideoData() {
this.show = false;
this.isChange = false;
},
async changeVideo(data) {
console.log('changeVideo+++++++++', data);
this.currentTime = "";
this.firstTime = 0;
this.isSetFirstTime = false;
this.isChange = false;
this.getLive(true, data)
// await this.init(data, true);
},
screenChange(data) {
console.log(
"status at line 这是当前的状态158:",
data.status,
data.primary
);
this.isFullScreen = !data.status;
this.$emit("changeScreen", this.isFullScreen);
},
// 控制器的显示隐藏
controlChange(e) {
this.isControl = e.detail.show;
},
quitScreen() {
// 退出全屏
const ctx = this.$refs.myVideo;
ctx.exitFullScreen();
},
// 播放器初始化
async init(data, isChange) {
this.show = false;
this.platform = this.$platform;
this.isfresh = true;
console.log("at line 59:", "是否先走init这里", this.platform);
if (uni.getStorageSync("videoOssList")) {
this.videoList = JSON.parse(uni.getStorageSync("videoOssList"));
}
this.options = data.currentVideo;
this.videoId = this.options.video;
console.log("这是苹果视屏id", this.videoId);
await this.getLive(isChange, this.options);
},
// 配置播放项
async getData(data, isChange) {
var that = this;
if (!this.isSetFirstTime) {
var netWork = data.userCourseVideoPositionEntity ?
data.userCourseVideoPositionEntity.position :
0;
var list = [];
if (uni.getStorageSync("videoOssList")) {
list = JSON.parse(uni.getStorageSync("videoOssList"));
var index = list.findIndex((e) => e.id == data.id);
console.log('data.id', data.id);
if (netWork) {
if (index >= 0) {
this.firstTime =
list[index].time > netWork ? list[index].time : netWork;
} else {
this.firstTime = netWork ? netWork : 0;
}
} else {
if (index >= 0) {
this.firstTime = list[index].time ? list[index].time : 0;
} else {
this.firstTime = 0;
}
}
} else {
this.firstTime = 0;
}
this.videoData = {
...data,
firstTime: this.firstTime
};
this.isChange = isChange ? isChange : false;
console.log(this.firstTime, "这是第一次播放时长222");
uni.setStorageSync("videoOssList", JSON.stringify(list));
console.log(this.firstTime, "这是第一次播放时长");
}
this.isSetFirstTime = true;
},
// 存储本地播放时间
recordTime(data) {
console.log('recordTime', data.time);
this.currentTime = data.time;
var list = [];
if (uni.getStorageSync("videoOssList")) {
list = JSON.parse(uni.getStorageSync("videoOssList"));
}
var index = list.findIndex((e) => e.id == this.videoData.id);
if (list.length > 0 && index >= 0) {
list[index] = {
...this.videoData,
time: data.time,
};
} else {
list.push({
...this.videoData,
time: data.time,
});
}
uni.setStorageSync("videoOssList", JSON.stringify(list));
},
// 获取播放凭证
async getLive(isChange, newVideoData) {
console.log('获取播放凭证11111111111111', newVideoData);
if (this.reaquestFlag) {
uni.showToast({
title: '操作太快了,歇一下吧',
icon: 'none'
})
}
this.reaquestFlag = true
var that = this;
this.isfresh = false;
var data = {
...this.options,
};
if (isChange && newVideoData) {
data = {
...newVideoData,
};
}
await $http
.request({
url: `sociology/course/checkVideo`,
method: "Post", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: {
//默认 无 说明:请求头
"Content-Type": "application/json",
},
})
.then(async (res) => {
this.reaquestFlag = false
if (this.$platform == 'ios') {
if (this.currentVideo.type == 1 && res.video.m3u8Url == null || this.currentVideo
.type == 1 && res.video.m3u8Url == '') {
// 只存在私有加密
this.show = true
uni.showModal({
content: '抱歉,苹果手机不支持此加密视频格式,您可以在安卓端观看本视频',
confirmText: '知道了',
showCancel: false,
success: function(res) {
if (res.confirm) {
// uni.navigateBack({delta: 2})
}
}
})
return
}
}
var data = {
...res.video,
};
if (this.currentVideo.type == 1) {
var playAuth = res.video.playAuth.replace(/=/g, "");
// console.log("这是接口获取的视屏凭证111", playAuth);
data = {
...data,
videoId: res.video.video,
playAuth: playAuth,
};
this.playAuth = playAuth;
await that.getData(data, isChange);
} else {
console.log("这是接口获取的视屏凭证222", res.video, data);
data = {
...data,
playAuth: new Date().getTime(),
};
await that.getData(data, isChange);
}
console.log("是否获取到初始播放值", data);
that.$forceUpdate();
}).catch(e => {
this.reaquestFlag = false
uni.showToast({
'title': '获取播放地址失败',
icon: 'none'
})
});
},
async handleEnd() {
var list = JSON.parse(uni.getStorageSync("videoOssList"));
var data = list.find((e) => e.id == this.videoData.id);
this.currentTime = data.time;
console.log(
"this.currentTime at line 这是结束的时候掉的存储视频:",
this.currentTime
);
await this.setVideoTime();
// clearInterval(this.$store.state.videoTimer);
// this.timer = null;
},
// 存储时长到线上
setVideoTime(time) {
var data = {};
console.log("是否走了存储视屏," + this.videoData.id, time, this.currentTime);
let _time = null
time ? _time = time : _time = this.currentTime
var data = {
videoId: this.videoData.id,
position: _time, //秒数
// loadAnimate: 'none',
};
$http
.request({
url: `sociology/course/saveCoursePosition`,
method: "Post", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: {
//默认 无 说明:请求头
"Content-Type": "application/json",
},
})
.then((res) => {
console.log("存储视屏时长接口返回信息", res);
this.$forceUpdate();
}).catch(e => {
console.log("存储进度报错", e);
});
},
goBack() {
uni.navigateBack({
delta: 1,
});
},
// 设置初始播放时间 并开启定时器
async setVideoFirtsetTime(data) {
this.currentTime = this.firstTime;
console.log("setVideoFirtsetTime播放时间:", data.time);
await this.setVideoTime(data.time);
},
},
created() {},
};
</script>
<script module="renderScript" lang="renderjs">
var videoData = null
var _seconds = 0
var ReplayVideoFlag = false
var curStatus = null
var diff = 0
var pauseTime = 0
var myplayer = undefined
import $ from 'jquery'
export default {
components: {
// MyComponent
},
mounted() {
// 在适合的生命周期通过script和link标签引入播放器sdk、css
console.log(this.options, '这是monted')
this.loadWebPlayerSDK()
},
data() {
return {
player: null,
videoTimer: null,
// curTime: null,
// firstTime: null,
// curStatus: null,
// currentTime:null,
}
},
watch: {
// curTime(val) {
// if (this.curTime !== null && this.curStatus !== null) {
// this.$refs.videoContent1.click()
// }
// }
},
methods: {
handleClick(event, ownerInstance) {
console.log('是否了走了点击video事件', event)
},
emitData(event, ownerInstance) {
var that = this;
ownerInstance.callMethod('recordTime', {
time: _seconds,
status: curStatus
})
},
receiveReplayVideoFlag(newValue, oldValue, ownerVm, vm) {
console.log('newValue重新播放', newValue, myplayer);
ReplayVideoFlag = newValue
if (newValue) {
$('.videoContent8').click()
// ReplayVideoFlag = newValue
// // myplayer.replay()
// $('.videoContent7').click()
// myplayer.seek(0)
// myplayer.play()
}
},
emitReplayVideoFlagFalse(event, ownerInstance) {
ownerInstance.callMethod('replayVideoFlagFalse')
},
emitUnlockChangeVideo(event, ownerInstance) {
ownerInstance.callMethod('UnlockChangeVideo')
},
async receiveFirstTime(newValue, oldValue, ownerVm, vm) {
},
async receiveisSetFirstTime(newValue, oldValue, ownerVm, vm) {
console.log('是否刚开始设置播放时间', newValue, this.firstTime, myplayer);
},
emitSetData(event, ownerInstance) {
// var that = this;
ownerInstance.callMethod('setVideoFirtsetTime', {
time: _seconds,
})
},
emitHideNextVideo(event, ownerInstance) {
ownerInstance.callMethod('hideNextVideo')
},
emitLoadNextVideo(event, ownerInstance) {
ownerInstance.callMethod('loadNextVideo')
},
emitopenShow(event, ownerInstance) {
ownerInstance.callMethod('openShow', {
msg: '播放出错啦!'
})
},
// 全屏切换事件
changeVideoScreen(event, ownerInstance) {
var that = this;
// this.$emit('changeScreenLoading',true)
var status = myplayer.fullscreenService.getIsFullScreen();
console.log('this.$platform--------', this.platform);
if (this.platform != 'ios') { // 改变按钮形态
ownerInstance.callMethod('screenChange', {
status: status,
primary: status ? 'portrait' : 'landscape'
})
}
if (status) {
if (this.platform != 'ios') {
console.log('恢复竖版');
setTimeout(() => {
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
myplayer.fullscreenService.cancelFullScreen();
}, 100);
}
} else {
myplayer.fullscreenService.requestFullScreen();
if (this.platform != 'ios') {
setTimeout(() => {
plus.screen.lockOrientation("landscape-primary");
}, 100);
} else {
console.log('不要旋转, 使用原生全屏');
}
}
},
changeVideoData(event, ownerInstance) {
var that = this;
ownerInstance.callMethod('changeVideoData', )
},
endEmitData(event, ownerInstance) {
var that = this;
ownerInstance.callMethod('handleEnd', )
},
// renderjs阿里云播放器引入与配置
getLive() {
console.log('这是这只只是666666:', this.firstTime, this.videoData)
$('#url-player-test').empty();
pauseTime = 0
var fullScreenButtonComponent = Aliplayer.Component({
/**
* 初始函数在new对象时调用
*
* @param {string} adAddress - 广告视频地址
* @param {string} toAddress - 广告链接地址
*/
init: function(status, toAddress) {
this.fullScreenStatus = status
this.$html = $('.fullScreenButton-container');
// this.$html.hide();
},
/**
* 创建广告Dom元素
*/
createEl: function(el) {
this.$html.find('.ad').attr('src', this.adAddress);
var $adWrapper = this.$html.find('.ad-wrapper');
$adWrapper.attr('href', this.toAddress);
$adWrapper.click(function() {
});
$(el).find('.prism-time-display').after(this.$html);
},
/**
* 隐藏广告
*/
playing: function(player, e) {
this.$html.show();
// this.$html.hide();
},
});
// console.log('这是查看是否获取到hlstoken', this.videoData)
var playerOptions = {
id: "url-player-test",
width: '100%', //容器的大小
height: '100%', //容器的大小
"qualitySort": "asc",
"cover": "",
"autoplay": true,
"isLive": false,
"rePlay": false,
"playsinline": true,
"controlBarVisibility": "hover",
"useH5Prism": true,
components: [{
name: 'adComponent',
type: fullScreenButtonComponent,
args: [
'http://101.201.146.165:8088/Pf-EH/statics/uploadFile/2024-05-10/b0f420c7-9178-41ad-9dd6-f59a64a6e190.png'
]
},
{
name: 'RateComponent',
type: AliPlayerComponent.RateComponent
},
],
skinLayout: [{
name: "bigPlayButton",
align: "blabs",
x: 30,
y: 80
},
{
name: "H5Loading",
align: "cc"
},
{
name: "errorDisplay",
align: "tlabs",
x: 0,
y: 0
},
{
name: "infoDisplay"
},
{
name: "tooltip",
align: "blabs",
x: 0,
y: 56
},
{
name: "thumbnail"
},
{
name: "controlBar",
align: "blabs",
x: 0,
y: 0,
children: [{
name: "progress",
align: "blabs",
x: 0,
y: 44
},
{
name: "playButton",
align: "tl",
x: 15,
y: 12
},
{
name: "timeDisplay",
align: "tl",
x: 10,
y: 7
},
{
name: "prism-speed-selector",
align: "tr",
x: 15,
y: 12
},
{
name: "volume",
align: "tr",
x: 5,
y: 10
}
]
}
]
}
if (this.videoData.type == 1) {
if (this.videoData.m3u8Url == null || this.videoData.m3u8Url == '') {
console.log('这是私有加密的视频');
if (this.$platform == 'ios') {
this.$refs.videoContent5.click()
} else {
playerOptions = {
...playerOptions,
"vid": this.videoData
.videoId, // 必选参数,可以通过点播控制台(路径:媒资库>音/视频查询。示例1e067a2831b641db90d570b6480f****。
"playauth": this.videoData.playAuth, // 必选参数参数值可通过调用GetVideoPlayAuth接口获取。
"encryptType": 1, // 必选参数当播放私有加密流时需要设置本参数值为1。其它情况无需设置。
"playConfig": {
"EncryptType": 'AliyunVoDEncryption'
}
}
console.log('这是私有加密的视频');
}
} else if (this.videoData.m3u8Url != null || this.videoData.m3u8Url != '') {
playerOptions = {
...playerOptions,
source: this.videoData.m3u8Url,
// "playConfig": {"EncryptType": "HLSEncryption"}
}
console.log('这是标准加密的视频', this.videoData.id, this.videoData.m3u8Url);
}
} else {
playerOptions = {
...playerOptions,
source: this.videoData.videoUrl
}
console.log('这是没有加密的视频');
}
var player = new Aliplayer(playerOptions, function(player) {});
this.player = player;
myplayer = player;
// console.log('myplayer------------',myplayer.loadByUrl('https://www.w3schools.com/html/movie.mp4'));
// console.log('是否拿到第一次初始值呢', this.platform, typeof this.firstTime, this.firstTime)
player.on('ready', function() {
console.log('播放器准备就绪,开始播放');
player.play()
$('.videoContent9').click()
})
player.on('play', function() {
console.log('开始播放------');
$('.videoContent7').click()
if (pauseTime > 0) {
player.seek(pauseTime);
}
})
player.one('canplay', function() {
// console.log('这是ios数据缓冲初次设置播放位置判断', videoData)
// player.seek(20);
// if(ReplayVideoFlag){
// player.seek(0);
// }else{
var videoDurationTimes = parseInt(player.getDuration())
// var firstTime = parseInt(player.getCurrentTime())
console.log('视频总长度', parseInt(player.getDuration()), parseInt(player.getCurrentTime()));
if (videoData.firstTime < videoDurationTimes) {
player.seek(videoData.firstTime);
} else {
player.seek(0);
}
//}
})
myplayer.on('playing', function() {
console.log('正在播放...')
})
myplayer.on('timeupdate', function() {
let that = this
var _time = parseInt(player.getCurrentTime())
curStatus = player.getStatus()
// console.log('timeupdatetimeupdate...',curStatus);
if (_seconds != _time) {
_seconds = _time
diff++
if (diff % 60 === 0) {
console.log('符合---------');
$('.videoContent4').click()
diff = 0
}
$('.videoContent1').click()
}
})
myplayer.on('ended', function() {
console.log('播放完毕');
$('.videoContent2').click()
$('.videoContent6').click()
})
player.on('pause', function() {
pauseTime = parseInt(player.getCurrentTime())
player.pause(true)
console.log('触发暂停', pauseTime)
})
myplayer.on('error', function() {
console.log('播放出错')
$('.videoContent5').click()
})
},
showPreview(e) {
// console.log('e at line 56:', e)
let conimg = e.target.dataset.nodes;
let imgs = conimg.match(/<img[^>]+>/g); //选择节点中的img
console.log('imgs at line 59:', imgs)
let imgList = [];
//遍历img标签的src里面的内容放在定义的数组imgList中
for (var j = 0; j < imgs.length; j++) {
imgs[j].replace(/<img[^>]*src=['"]([^'"]+)[^>]*>/gi, function(match, capture) {
imgList.push(capture)
})
}
console.log('imgList.push at line 64:', imgList)
uni.previewImage({
urls: imgList,
longPressActions: {
itemList: ['很抱歉,暂不支持保存图片到本地'],
success: function(res) {
// console.log(res,'+++++')
}
}
});
},
receiveScreenType(newValue) {},
async receiveIsfresh(newValue) {
console.log('是否走了刷新销毁方法:', myplayer)
if (myplayer) {
// clearInterval(this.$store.state.videoTimer)
// await this.setVideoTime();
myplayer.dispose();
}
},
async receiveplatform(newValue) {
},
async receiveIsChange(newValue) {
if (this.isChange) {
this.checkValue()
}
},
receiveVideoList(newValue, oldValue, ownerVm, vm) {
// //数据变化
console.log('currentVideoListcurrentVideoListcurrentVideoList', newValue)
},
// 监听视频参数变化,并赋值给常量
receiveMsg(newValue, oldValue, ownerVm, vm) {
//数据变化
videoData = newValue
if (videoData) {
return
console.log('切换后的播放数据videoData', videoData.type);
if (videoData.type == 1) {
if (videoData.m3u8Url != '' && videoData.m3u8Url != null) {
// myplayer.source(videoData.m3u8Url)
myplayer.loadByUrl(videoData.m3u8Url)
console.log('切换走了吗m3u8');
} else {
myplayer.replayByVidAndPlayAuth(videoData.videoId, videoData.playAuth)
console.log('切换走了吗?私有加密');
}
} else {
myplayer.loadByUrl(videoData.videoUrl)
console.log('切换常规视频');
}
}
// console.log('可能是切换视频', videoData, );
},
receiveWinWidth(newValue, oldValue, ownerVm, vm) {
//数据变化
console.log('newValue', newValue)
},
receiveWinHeight(newValue, oldValue, ownerVm, vm) {
//数据变化
console.log('newValue', newValue)
},
// 检测是否传入播放参数
checkValue() {
console.log(this.videoId, this.authId, this.videoData, "1111888888")
if ((!this.videoData.playAuth || !this.currentVideoList)) {
setTimeout(() => {
this.checkValue();
}, 1000);
} else {
// console.log('这是这只只是594:', this.firstTime, this.videoData)
this.getLive();
}
},
loadWebPlayerSDK() {
return new Promise((resolve, reject) => {
const s_tag = document.createElement('script'); // 引入播放器js
s_tag.type = 'text/javascript';
s_tag.src = 'https://g.alicdn.com/apsara-media-box/imp-web-player/2.20.3/aliplayer-min.js';
s_tag.charset = 'utf-8';
s_tag.onload = () => {
const s_tag1 = document.createElement('script'); // 引入播放器js
s_tag1.type = 'text/javascript';
s_tag1.src =
'https://player.alicdn.com/aliplayer/presentation/js/aliplayercomponents.min.js';
s_tag1.charset = 'utf-8';
s_tag1.onload = () => {
this.checkValue();
resolve();
}
document.body.appendChild(s_tag1);
}
document.body.appendChild(s_tag);
const l_tag = document.createElement('link'); // 引入播放器css
l_tag.rel = 'stylesheet';
l_tag.href =
'https://g.alicdn.com/apsara-media-box/imp-web-player/2.20.3/skins/default/aliplayer-min.css';
document.body.appendChild(l_tag);
});
},
}
}
</script>
<style>
.cancelNext {
display: inline-block;
margin-right: 20rpx;
border-radius: 10rpx;
margin-top: 10rpx;
padding: 10rpx 20rpx !important;
background-color: #fff !important;
color: #000;
text-align: center;
line-height: 50rpx;
}
/* .cancelNext:last-child{margin-left: 10rpx;} */
.nextText {}
.showCountDownd {
box-sizing: border-box;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: flex-end;
color: #fff;
font-size: 38rpx;
text-align: center;
position: absolute;
top: 0;
right: 10rpx;
z-index: 4;
text {}
}
.container {
width: 100vw;
height: auto;
/deep/.pause {
width: 60rpx !important;
height: 60rpx !important;
}
}
.fds {
background-color: blue;
height: 600rpx;
position: fixed;
top: 60rpx;
}
.returnBack {
flex-direction: row;
justify-content: flex-start;
align-items: center;
height: 88rpx;
padding-left: 20rpx;
}
.txt {
color: #fff;
}
.right_title {
background: #000;
height: 96rpx;
justify-content: space-between;
flex-direction: row;
align-items: center;
margin-left: auto;
}
.return {
flex-direction: row;
align-items: center;
color: #fff;
}
.right_handle {
width: 200rpx;
flex-direction: row;
justify-content: flex-end;
padding-right: 20rpx;
}
cover-view {
display: block;
line-height: 1.2;
overflow: hidden;
white-space: nowrap;
pointer-events: auto;
}
cover-view {
visibility: visible !important;
}
cover-image {
visibility: visible !important;
}
.fullScreenButton-container {
color: #fff;
float: right;
height: 35px;
margin-top: 6px;
margin-right: 5px;
display: flex;
align-items: center;
position: relative;
i {
color: #fff;
display: inline-block;
font-size: 22px;
display: block;
margin-top: 7px;
cursor: pointer;
&+i {
margin-left: 3px;
}
@media (min-width: 768px) {
&:hover+.player-tooltip {
display: block;
}
}
}
.player-tooltip {
&.prev {
left: -10px;
}
&.list {
left: 5px;
}
&.next {
right: -12px;
}
}
}
.playlist-content {
position: absolute;
right: 0;
width: 0px;
padding-bottom: 48px;
box-sizing: border-box;
height: 100%;
transition: all 0.38s ease-in-out;
overflow: hidden;
.list {
background-color: #000;
background-color: rgba(0, 0, 0, 0.3);
height: 100%;
overflow: auto;
.video-item {
color: #fff;
padding: 0px 10px;
line-height: 35px;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
&.active {
background-color: #000;
color: #00ddff;
}
@media (min-width: 768px) {
&:hover {
background-color: #000;
color: #00ddff;
}
}
}
}
}
.player-tooltip {
position: absolute;
display: none;
font-size: 12px;
color: #fff;
line-height: 28px;
letter-spacing: 0;
text-align: center;
background: #3c3c3c;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1);
height: 28px;
top: -48px;
padding: 0 5px;
white-space: nowrap;
}
.playlist-skip-tip {
padding: 5px 15px;
position: absolute;
top: 50%;
left: 50%;
z-index: 30;
line-height: 30px;
font-size: 14px;
border-radius: 4px;
background: rgba(255, 255, 255, 0.8);
color: #000;
text-align: center;
transform: translate(-50%, -50%);
}
#rotating-div {
width: 100vw;
height: 100vh;
background-color: #3498db;
transform: rotate(90deg);
/* 旋转90度 */
transform-origin: center center;
/* 设置旋转中心点在div中心 */
position: fixed;
/* 固定定位,全屏显示 */
left: 0;
top: 0;
bottom: 0;
right: 0;
}
</style>