测试版
This commit is contained in:
830
pages/component/commonComponents/video/AliPlayer.vue
Normal file
830
pages/component/commonComponents/video/AliPlayer.vue
Normal file
@@ -0,0 +1,830 @@
|
||||
<template>
|
||||
<view
|
||||
class="container playerBox"
|
||||
id="playerBox"
|
||||
style="
|
||||
background-color: #000;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
"
|
||||
>
|
||||
<!-- ios不能播放私有加密提示信息 start-->
|
||||
|
||||
<!-- ios不能播放私有加密提示信息 end-->
|
||||
<div ref="videoContent" id="url-player-test"></div>
|
||||
<div
|
||||
v-show="false"
|
||||
:videoData="videoData"
|
||||
:isDipose="isDipose"
|
||||
:winWidth="winWidth"
|
||||
:winHeight="winHeight"
|
||||
:firstTime="firstTime"
|
||||
:isOnLoad="isOnLoad"
|
||||
:platform="platform"
|
||||
:isSetFirstTime="isSetFirstTime"
|
||||
:isChange="isChange"
|
||||
:change:videoData="renderScript.receiveMsg"
|
||||
:change:isDipose="renderScript.receiveisDipose"
|
||||
:change:winWidth="renderScript.receiveWinWidth"
|
||||
:change:winHeight="renderScript.receiveWinHeight"
|
||||
:change:firstTime="renderScript.receiveFirstTime"
|
||||
:change:isSetFirstTime="renderScript.receiveisSetFirstTime"
|
||||
:change:isOnLoad="renderScript.receiveIsfresh"
|
||||
:change:platform="renderScript.receiveplatform"
|
||||
:change:isChange="renderScript.receiveIsChange"
|
||||
></div>
|
||||
<div @tap="renderScript.emitData" ref="videoContent1" v-show="false">
|
||||
直接调用renderjs中的emitData的方法,传递当前播放时长
|
||||
</div>
|
||||
<div @tap="renderScript.endEmitData" ref="videoContent2" v-show="false">
|
||||
监听结束方法,记录播放时长
|
||||
</div>
|
||||
<div @tap="renderScript.changeVideoData" ref="videoContent3" v-show="false">
|
||||
监听切换视频方法
|
||||
</div>
|
||||
<div @tap="renderScript.emitSetData" ref="videoContent4" v-show="false">
|
||||
监听第一次初始播放时长,开始进行接口存储时间
|
||||
</div>
|
||||
<div @tap="renderScript.emitDispose" ref="videoContent6" v-show="false">
|
||||
监听第一次初始播放时长,开始进行接口存储时间
|
||||
</div>
|
||||
|
||||
<!-- 全屏按钮 start -->
|
||||
<!-- 注意:主要用于安卓端,因为ios手机会被劫持 -->
|
||||
<div class="fullScreenButton-container" v-if="platform != 'ios'">
|
||||
<div
|
||||
:class="`prism-fullscreen-btn ${isFullScreen ? 'fullscreen' : ''}`"
|
||||
@tap="renderScript.changeVideoScreen"
|
||||
></div>
|
||||
</div>
|
||||
<!-- 全屏按钮 end -->
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import store from "@/store/index.js";
|
||||
import $http from "@/config/requestConfig.js";
|
||||
import { mapState, mapMutations } from "vuex";
|
||||
export default {
|
||||
props: {
|
||||
videoData: {
|
||||
type: Object,
|
||||
default: {},
|
||||
},
|
||||
firstTime: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
show: false, //视频提示显示
|
||||
isDipose: false, //视频提示显示
|
||||
content: "此设备暂不支持观看当前视频,请移步到安卓手机进行学习!",
|
||||
platform: null, //设备类型
|
||||
isFullScreen: false, //当前是否是全屏模式
|
||||
isOnLoad: false, //是否刷新
|
||||
isChange: false, //是否切换播放源
|
||||
videoList: [], //视频列表
|
||||
videoOssList: [], //本地视频列表
|
||||
options: {}, //父组件传参
|
||||
currentTime: "", //当前播放时间
|
||||
|
||||
isSetFirstTime: false, //是否获取到初始播放时间
|
||||
|
||||
urlList: {
|
||||
checkVideo: "sociology/course/checkVideo",
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// ...mapState(["videoOssList"]),
|
||||
},
|
||||
|
||||
watch: {
|
||||
timer(newValue) {
|
||||
this.$emit("child-event", newValue);
|
||||
},
|
||||
videoOssList: {
|
||||
immediate: true,
|
||||
handler(newValue) {
|
||||
if (this.videoOssList.length > 0) {
|
||||
uni.setStorageSync("videoOssList", JSON.stringify(this.videoOssList));
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
//
|
||||
mounted() {
|
||||
this.platform = this.$platform;
|
||||
this.show = false;
|
||||
if (uni.getStorageSync("videoOssList")) {
|
||||
this.videoOssList = JSON.parse(uni.getStorageSync("videoOssList"));
|
||||
}
|
||||
},
|
||||
//子组件销毁前
|
||||
beforeDestroy() {
|
||||
this.handleEnd();
|
||||
|
||||
clearInterval(this.$store.state.videoTimer);
|
||||
plus.screen.lockOrientation("portrait-primary");
|
||||
},
|
||||
updated() {
|
||||
// console.log("触发了更新");
|
||||
},
|
||||
methods: {
|
||||
emitDispose1(status) {
|
||||
this.$emit("handleSuccessDispose", status);
|
||||
},
|
||||
destory() {
|
||||
// this.isDipose = true;
|
||||
},
|
||||
//ios不能播放私有加密提示信息
|
||||
openShow() {
|
||||
this.show = true;
|
||||
},
|
||||
|
||||
changeVideoData() {
|
||||
this.show = false;
|
||||
this.isChange = false;
|
||||
},
|
||||
screenChange(data) {
|
||||
this.isFullScreen = !data.status;
|
||||
this.$emit("changeScreen", this.isFullScreen);
|
||||
},
|
||||
|
||||
//当前播放时间 存本地
|
||||
recordTime(time) {
|
||||
this.currentTime = time;
|
||||
var list = [...this.videoOssList];
|
||||
var index = list.findIndex((e) => e.id == this.currentVideoId);
|
||||
var setData = {
|
||||
id: this.currentVideoId,
|
||||
vid: this.videoData.vid,
|
||||
time: time,
|
||||
};
|
||||
if (list.length > 0 && index >= 0) {
|
||||
list[index] = setData;
|
||||
} else {
|
||||
list.push(setData);
|
||||
}
|
||||
this.videoOssList = list;
|
||||
if (this.currentTime % 60 == 0) {
|
||||
this.setVideoTime();
|
||||
}
|
||||
},
|
||||
|
||||
//播放结束
|
||||
async handleEnd() {
|
||||
// uni.showModal({
|
||||
// title: "更新提示",
|
||||
// content: "新版本已经准备好,是否重启应用?",
|
||||
// success(res) {
|
||||
// if (res.confirm) {
|
||||
|
||||
// }
|
||||
// },
|
||||
// });
|
||||
this.setVideoTime();
|
||||
},
|
||||
//存播放进度
|
||||
setVideoTime() {
|
||||
if (!this.videoData.id) {
|
||||
return false;
|
||||
}
|
||||
var data = {
|
||||
videoId: this.videoData.id,
|
||||
position: this.currentTime ? this.currentTime : 0, //秒数
|
||||
loadAnimate: "none",
|
||||
};
|
||||
|
||||
$http
|
||||
.request({
|
||||
url: `sociology/course/saveCoursePosition`,
|
||||
method: "Post",
|
||||
data,
|
||||
header: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((res) => {});
|
||||
},
|
||||
//定时器 存播放进度
|
||||
async setVideoFirtsetTime() {
|
||||
this.setVideoTime();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<script module="renderScript" lang="renderjs">
|
||||
var player;
|
||||
import $ from "jquery";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
player: null, //播放器
|
||||
videoTimer: null, //定时器
|
||||
curTime: null, //播放器当前播放进度
|
||||
curStatus: null, //播放器当前播放状态
|
||||
playerConfig: {
|
||||
id: "url-player-test",
|
||||
extraInfo: { poster: "noposter" }, // 播放器参数 extraInfo 的内容会透传到 <video> 标签上
|
||||
width: "100%", //容器的大小
|
||||
height: "100%", //容器的大小
|
||||
qualitySort: "asc",
|
||||
cover: "",
|
||||
autoplay: true,
|
||||
isLive: false,
|
||||
rePlay: false,
|
||||
playsinline: true,
|
||||
controlBarVisibility: "hover",
|
||||
useH5Prism: true,
|
||||
skinLayout: [],
|
||||
},
|
||||
|
||||
skinLayoutIos: [
|
||||
{
|
||||
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: "fullScreenButton",
|
||||
align: "tr",
|
||||
x: 10,
|
||||
y: 12,
|
||||
},
|
||||
{
|
||||
name: "prism-speed-selector",
|
||||
align: "tr",
|
||||
x: 15,
|
||||
y: 12,
|
||||
},
|
||||
{
|
||||
name: "volume",
|
||||
align: "tr",
|
||||
x: 5,
|
||||
y: 10,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
skinLayoutAndroid: [
|
||||
{
|
||||
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,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
//播放器当前播放进度
|
||||
curTime(val) {
|
||||
if (this.curTime !== null) {
|
||||
this.$refs.videoContent1.click();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
created() {},
|
||||
|
||||
mounted() {},
|
||||
async beforeDestroy() {
|
||||
if (player) {
|
||||
player.dispose();
|
||||
}
|
||||
$("#url-player-test").empty();
|
||||
console.log("阿里云子组件销毁赋空");
|
||||
},
|
||||
methods: {
|
||||
//检验视频 获取加密权限
|
||||
checkValue() {
|
||||
if (!this.videoData.vid) {
|
||||
setTimeout(() => {
|
||||
this.checkValue();
|
||||
}, 500);
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
this.initAliyunPlayer();
|
||||
}, 0);
|
||||
}
|
||||
},
|
||||
|
||||
//初始化播放器
|
||||
initAliyunPlayer() {
|
||||
console.log("实例创建中 at line 436:", "实例创建中");
|
||||
$("#url-player-test").empty();
|
||||
// const saveTime = function (memoryVideo,currentTime) {
|
||||
// console.log(memoryVideo, currentTime)
|
||||
// }
|
||||
|
||||
// const getTime = function (memoryVideo) {
|
||||
// /* return返回的是自定义起播时间 */
|
||||
// return 20
|
||||
// }
|
||||
var components = [
|
||||
{
|
||||
name: "RateComponent", //倍速组件
|
||||
type: AliPlayerComponent.RateComponent,
|
||||
},
|
||||
|
||||
];
|
||||
if (this.platform != "ios") {
|
||||
var fullScreenButtonComponent = Aliplayer.Component({
|
||||
init: function (status, toAddress) {
|
||||
this.fullScreenStatus = status;
|
||||
this.$html = $(".fullScreenButton-container");
|
||||
},
|
||||
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);
|
||||
},
|
||||
});
|
||||
|
||||
components = [
|
||||
...components,
|
||||
{
|
||||
name: "adComponent", //自定义全屏组件
|
||||
type: fullScreenButtonComponent,
|
||||
},
|
||||
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
//设置播放基本配置
|
||||
var playerOptions = {
|
||||
...this.playerConfig,
|
||||
components: components,
|
||||
skinLayout:
|
||||
this.platform == "ios" ? this.skinLayoutIos : this.skinLayoutAndroid,
|
||||
};
|
||||
|
||||
if (this.videoData.encryptType == 1) {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
vid: this.videoData.vid,
|
||||
playauth: this.videoData.playAuth, // 必选参数,参数值可通过调用GetVideoPlayAuth接口获取。
|
||||
encryptType: 1, // 必选参数,当播放私有加密流时需要设置本参数值为1。其它情况无需设置。
|
||||
playConfig: {
|
||||
EncryptType: "AliyunVoDEncryption",
|
||||
},
|
||||
};
|
||||
} else {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
source: this.videoData.source,
|
||||
};
|
||||
}
|
||||
player = new Aliplayer(playerOptions, (player) => {
|
||||
player.on("ready", () => {
|
||||
this.player = player;
|
||||
var lastTime = this.firstTime;
|
||||
if (this.platform == "ios") {
|
||||
this.player.one("canplay", () => {
|
||||
this.player.seek(this.firstTime);
|
||||
// uni.showToast({
|
||||
// title: '已为您定位至上次观看位置'
|
||||
// })
|
||||
|
||||
});
|
||||
} else {
|
||||
this.player.seek(this.firstTime);
|
||||
// uni.showToast({
|
||||
// title: '已为您定位至上次观看位置'
|
||||
// })
|
||||
|
||||
}
|
||||
|
||||
this.player.one("timeupdate", () => {
|
||||
if (!this.player.tag.seeking) {
|
||||
// 更新最近一次的播放位置
|
||||
lastTime = parseInt(this.player.getCurrentTime());
|
||||
this.curTime = lastTime;
|
||||
}
|
||||
});
|
||||
this.player.on("timeupdate", () => {
|
||||
if (!this.player.tag.seeking) {
|
||||
// 更新最近一次的播放位置
|
||||
lastTime = parseInt(this.player.getCurrentTime());
|
||||
this.curTime = lastTime;
|
||||
}
|
||||
});
|
||||
this.player.on("ended", () => {
|
||||
lastTime = parseInt(this.player.getCurrentTime());
|
||||
this.curTime = lastTime;
|
||||
this.$refs.videoContent2.click();
|
||||
});
|
||||
player.on("dispose", (res) => {
|
||||
console.log("播放器销毁:", res);
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
//调用 recordTime 方法 存本地播放时长
|
||||
emitData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("recordTime", this.curTime);
|
||||
},
|
||||
|
||||
//调用 setVideoFirtsetTime 设置初始播放
|
||||
emitSetData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("setVideoFirtsetTime");
|
||||
},
|
||||
|
||||
//调用 openShow 设置ios 不能播放私用加密 提示信息
|
||||
emitopenShow(event, ownerInstance) {
|
||||
ownerInstance.callMethod("openShow");
|
||||
},
|
||||
emitDispose(event, ownerInstance) {
|
||||
ownerInstance.callMethod("emitDispose1", true);
|
||||
},
|
||||
//调用 handleEnd 存储视频播放信息
|
||||
endEmitData(event, ownerInstance) {
|
||||
|
||||
ownerInstance.callMethod("handleEnd");
|
||||
},
|
||||
|
||||
//调用 screenChange + 设置全屏
|
||||
changeVideoScreen(event, ownerInstance) {
|
||||
var status = this.player.fullscreenService.getIsFullScreen();
|
||||
ownerInstance.callMethod("screenChange", {
|
||||
status: status,
|
||||
primary: status ? "portrait" : "landscape",
|
||||
});
|
||||
|
||||
if (status) {
|
||||
setTimeout(() => {
|
||||
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
|
||||
this.player.fullscreenService.cancelFullScreen();
|
||||
}, 100);
|
||||
} else {
|
||||
this.player.fullscreenService.requestFullScreen();
|
||||
setTimeout(() => {
|
||||
plus.screen.lockOrientation("landscape-primary");
|
||||
}, 100);
|
||||
}
|
||||
},
|
||||
|
||||
//调用 changeVideoData 切换播放源
|
||||
changeVideoData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("changeVideoData");
|
||||
},
|
||||
|
||||
//切换播放源
|
||||
async receiveIsChange(newValue) {
|
||||
if (this.isChange) {
|
||||
this.checkValue();
|
||||
}
|
||||
},
|
||||
|
||||
handleClick(event, ownerInstance) {}, //点击播放器
|
||||
|
||||
receiveFirstTime(newValue, oldValue, ownerVm, vm) {}, //播放时间
|
||||
|
||||
async receiveisDipose(newValue, oldValue, ownerVm, vm) {
|
||||
if (newValue) {
|
||||
await player.dispose();
|
||||
await this.$refs.videoContent6.click();
|
||||
}
|
||||
}, //播放时间
|
||||
async receiveisPause(newValue, oldValue, ownerVm, vm) {}, //播放时间
|
||||
|
||||
receiveisSetFirstTime(newValue, oldValue, ownerVm, vm) {}, //是否刚开始设置播放时间
|
||||
|
||||
receiveMsg(newValue, oldValue, ownerVm, vm) {
|
||||
if (typeof window.Aliplayer === "function") {
|
||||
this.$nextTick(() => {
|
||||
this.checkValue();
|
||||
});
|
||||
}
|
||||
}, //是否刚开始设置播放时间
|
||||
|
||||
receiveplatform(newValue) {}, //获取设备型号
|
||||
|
||||
receiveVideoList(newValue, oldValue, ownerVm, vm) {}, //获取视频列表
|
||||
|
||||
receiveVideoData(newValue, oldValue, ownerVm, vm) {}, //获取视频信息
|
||||
|
||||
receiveWinWidth(newValue, oldValue, ownerVm, vm) {}, //获取视频宽度
|
||||
|
||||
receiveWinHeight(newValue, oldValue, ownerVm, vm) {}, //获取视频高度
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.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>
|
||||
44
pages/component/commonComponents/video/MyComponent.vue
Normal file
44
pages/component/commonComponents/video/MyComponent.vue
Normal file
@@ -0,0 +1,44 @@
|
||||
<template>
|
||||
<div>{{ message }}</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import $ from "jquery";
|
||||
export default class MyComponent {
|
||||
// data() {
|
||||
// return {
|
||||
// message: 'Hello, Vue!'
|
||||
// }
|
||||
// }
|
||||
|
||||
constructor(adAddress, toAddress) {
|
||||
this.adAddress = adAddress;
|
||||
this.toAddress = toAddress;
|
||||
this.$html = $(html);
|
||||
}
|
||||
|
||||
createEl(el) {
|
||||
this.$html.find(".ad").attr("src", this.adAddress);
|
||||
this.$html.attr("href", this.toAddress);
|
||||
let $adWrapper = this.$html.find(".ad-wrapper");
|
||||
$adWrapper.attr("href", this.toAddress);
|
||||
$adWrapper.click(() => {
|
||||
Aliplayer.util.stopPropagation();
|
||||
});
|
||||
this.$html.find(".close").click(() => {
|
||||
this.$html.hide();
|
||||
});
|
||||
$(el).append(this.$html);
|
||||
}
|
||||
|
||||
ready(player, e) {}
|
||||
|
||||
play(player, e) {
|
||||
this.$html.hide();
|
||||
}
|
||||
|
||||
pause(player, e) {
|
||||
this.$html.show();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
1
pages/component/commonComponents/video/aliplayer-min.css
vendored
Normal file
1
pages/component/commonComponents/video/aliplayer-min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
2
pages/component/commonComponents/video/aliplayer-min.js
vendored
Normal file
2
pages/component/commonComponents/video/aliplayer-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
20
pages/component/commonComponents/video/aliplayercomponents.min.js
vendored
Normal file
20
pages/component/commonComponents/video/aliplayercomponents.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1400
pages/component/commonComponents/video/audio.vue
Normal file
1400
pages/component/commonComponents/video/audio.vue
Normal file
File diff suppressed because it is too large
Load Diff
620
pages/component/commonComponents/video/cx-audio-play copy.vue
Normal file
620
pages/component/commonComponents/video/cx-audio-play copy.vue
Normal file
@@ -0,0 +1,620 @@
|
||||
<template>
|
||||
<!--音频组件-->
|
||||
<view
|
||||
class="boxShadow"
|
||||
style="
|
||||
width: 100%;
|
||||
border-radius: 40rpx;
|
||||
height: 100%;
|
||||
padding: 40rpx 0;
|
||||
box-sizing: border-box;
|
||||
background-image: linear-gradient(80deg, #959698 0%, #808183 100%);
|
||||
"
|
||||
>
|
||||
<view class="bgfff">
|
||||
<view>
|
||||
<slot name="title"></slot>
|
||||
<view class="audo-video">
|
||||
<view class="slider-box">
|
||||
<text class="mm">{{ timer }}</text>
|
||||
|
||||
<slider
|
||||
style="width: 440rpx"
|
||||
@change="sliderChange"
|
||||
@changing="sliderChanging"
|
||||
class="audio-slider"
|
||||
block-size="16"
|
||||
:min="0"
|
||||
:max="duration"
|
||||
:value="currentTime"
|
||||
activeColor="#FF8849"
|
||||
@touchstart="lock = true"
|
||||
@touchend="lock = false"
|
||||
/>
|
||||
<text class="ss" v-if="overTimer != 'NaN:NaN'">{{
|
||||
overTimer
|
||||
}}</text>
|
||||
<text class="ss" v-else>00.00</text>
|
||||
</view>
|
||||
<!--音频播放按钮处-->
|
||||
<view class="audo-top">
|
||||
<!--上一首-->
|
||||
<!-- <image
|
||||
src="./icon/xys.png"
|
||||
style="width: 40rpx; height: 40rpx; transform: rotate(180deg)"
|
||||
mode="aspectFill"
|
||||
@click="upper(1)"
|
||||
></image> -->
|
||||
<!--上一首-->
|
||||
|
||||
<!--快退-->
|
||||
<image
|
||||
src="./icon/kt.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="widthFix"
|
||||
@click="jump('kt')"
|
||||
></image>
|
||||
<!--快退-->
|
||||
|
||||
<!--播放-->
|
||||
<image
|
||||
src="./icon/kt.png"
|
||||
style="width: 100rpx; height: 100rpx"
|
||||
mode="widthFix"
|
||||
@click="plays()"
|
||||
></image>
|
||||
<!--播放-->
|
||||
|
||||
<!--快进-->
|
||||
<image
|
||||
src="./icon/kj.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="widthFix"
|
||||
@click="jump('kj')"
|
||||
></image>
|
||||
<!--快进-->
|
||||
|
||||
<!--下一首-->
|
||||
<!-- <image
|
||||
src="./icon/xys.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="aspectFill"
|
||||
@click="upper(2)"
|
||||
></image> -->
|
||||
<!--下一首-->
|
||||
|
||||
<view class="audo-a" style="">
|
||||
<!--进度条-->
|
||||
|
||||
<!--进度条-->
|
||||
|
||||
<!--倍数-->
|
||||
<view
|
||||
class="beishu"
|
||||
style="border: 1rpx solid #e1dbf2"
|
||||
@click="beishu"
|
||||
>{{ BsNav[bsindex].bs }} X
|
||||
</view>
|
||||
<view class="absolute" style="right: 0; top: 80rpx" v-if="shows">
|
||||
<!-- <u-transition :show="show" mode="slide-right" duration="300"> -->
|
||||
<view
|
||||
class="beishu-a"
|
||||
style="border: 1rpx solid #fff"
|
||||
v-if="show"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in BsNav"
|
||||
:key="index"
|
||||
@click="setRate(index, item)"
|
||||
class="title beishuItem"
|
||||
:style="{ color: bsid == item.id ? '#9461EB' : '' }"
|
||||
>
|
||||
{{ item.bs }} X
|
||||
</view>
|
||||
</view>
|
||||
<!-- </u-transition> -->
|
||||
</view>
|
||||
<!--倍数-->
|
||||
</view>
|
||||
</view>
|
||||
<!--音频播放按钮处-->
|
||||
|
||||
<!--音频api处[视频代替音频-实现倍数功能]-->
|
||||
<video
|
||||
id="myVideo"
|
||||
ref="myVideo"
|
||||
:src="recorPath"
|
||||
preload="metadata"
|
||||
@timeupdate="timeupdate"
|
||||
:autoplay="autoplays"
|
||||
@loadedmetadata="loadedmetadata"
|
||||
@ended="next"
|
||||
controls
|
||||
style="width: 400rpx; height: 80rpx"
|
||||
></video>
|
||||
<!--音频api处[视频代替音频-实现倍数功能]-->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!--占位-->
|
||||
</view>
|
||||
<!--音频组件 wx:cxalq8-24 Author:chenxin-->
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/*
|
||||
list -- 音频数据: 数组格式/不传无法播放
|
||||
Seconds -- 快进快退秒数: 默认15秒
|
||||
autoNext -- 是否自动播放下一首
|
||||
autoplays -- 进入页面是否自动播放 - 默认false
|
||||
slideYes -- 滑动进度条时是否开启播放 - 默认false
|
||||
switAud -- 切换上下音频是否开启播放 - 默认true
|
||||
BsNav -- 倍数数据传入/数组形式
|
||||
|
||||
图片功能样式,如想改动请在组件内部修改,页面中已注释 -- 逻辑根据自己需求改
|
||||
目前只测试 微信小程序和H5和APP -- 其他平台未知
|
||||
[Author:chenxin 交流vx:cxalq8-24]
|
||||
*/
|
||||
export default {
|
||||
name: "cx-audio-play",
|
||||
props: {
|
||||
list: {
|
||||
//音频数据
|
||||
Type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
Seconds: {
|
||||
//快进快退 - 秒数
|
||||
Type: Number,
|
||||
default: 15,
|
||||
},
|
||||
firstTime: {
|
||||
//快进快退 - 秒数
|
||||
Type: Number,
|
||||
default: 0,
|
||||
},
|
||||
autoNext: {
|
||||
//是否自动播放下一首
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
autoplays: {
|
||||
//是否开启自动播放
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
slideYes: {
|
||||
//滑动进度条 - 是否开启播放
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
switAud: {
|
||||
Type: Boolean, //切换上下音频 - 是否开启播放
|
||||
default: true,
|
||||
},
|
||||
BsNav: {
|
||||
//倍数-传入
|
||||
Type: Array,
|
||||
default: () => [
|
||||
{
|
||||
id: 1.0,
|
||||
bs: "1.0",
|
||||
},
|
||||
{
|
||||
id: 1.5,
|
||||
bs: "1.5",
|
||||
},
|
||||
{
|
||||
id: 2.0,
|
||||
bs: "2.0",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
shows: false, //倍数弹框
|
||||
show: true, //倍数弹框动画默认开启
|
||||
succes: false, //播放按钮
|
||||
bsid: "", //倍数默认显示第一个
|
||||
bsindex: 0, //倍数默认显示第一个
|
||||
num: 0,
|
||||
current: 0, //当前选中的索引
|
||||
recorPath: "", //音频播放地址
|
||||
lock: false, // 锁
|
||||
currentTime: 0, //当前进度
|
||||
duration: 0, // 总进度
|
||||
videoContext: null,
|
||||
loading: true, //锁 加载
|
||||
curTime: null, //锁 加载
|
||||
};
|
||||
},
|
||||
onReady() {},
|
||||
onShow() {},
|
||||
mounted() {
|
||||
//初始化音频api
|
||||
},
|
||||
updated() {},
|
||||
onLoad() {},
|
||||
onHide() {
|
||||
//监听页面离开 - 销毁音频
|
||||
this.stop_();
|
||||
this.$emit("curTime", this.curTime);
|
||||
},
|
||||
onUnload() {
|
||||
//监听页面卸载 - 销毁音频
|
||||
this.stop_();
|
||||
this.$emit("curTime", this.curTime);
|
||||
},
|
||||
destroyed() {
|
||||
// this.innerAudioContext.stop();
|
||||
},
|
||||
computed: {
|
||||
timer() {
|
||||
this.curTime = this.currentTime.toFixed(0);
|
||||
return calcTimer(this.currentTime);
|
||||
},
|
||||
overTimer() {
|
||||
return calcTimer(this.duration);
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
init() {
|
||||
this.currentTime = this.firstTime;
|
||||
this.videoContext = uni.createVideoContext("myVideo", this);
|
||||
//默认播放第一个
|
||||
if (this.list.length != 0) {
|
||||
this.recorPath = this.list[0];
|
||||
if (this.autoplays) {
|
||||
this.succes = true;
|
||||
}
|
||||
} else {
|
||||
this.duration = 0;
|
||||
}
|
||||
//倍数默认选择第一个
|
||||
if (this.BsNav.length != 0) {
|
||||
this.bsid = this.BsNav[0].id;
|
||||
this.playbackRate(); //倍数
|
||||
}
|
||||
},
|
||||
//没有音频数据
|
||||
noUrl() {
|
||||
if (this.list.length == 0) {
|
||||
uni.showToast({
|
||||
title: "请先传入音频数据哦~",
|
||||
icon: "none",
|
||||
});
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
//播放暂停
|
||||
plays() {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
this.playLoading();
|
||||
this.succes = !this.succes;
|
||||
this.succes ? this.play_() : this.pause_();
|
||||
},
|
||||
|
||||
//上下首切换
|
||||
upper(num) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
let that = this;
|
||||
if (num == 1) {
|
||||
//上一首
|
||||
if (this.num == 0) {
|
||||
this.upperToast(num); //提示
|
||||
return;
|
||||
}
|
||||
this.num -= 1;
|
||||
} else {
|
||||
//下一首
|
||||
if (this.num + 1 == this.list.length) {
|
||||
this.upperToast(num); //提示
|
||||
return;
|
||||
}
|
||||
this.num += 1;
|
||||
}
|
||||
this.recorPath = this.list[this.num];
|
||||
if (this.switAud) {
|
||||
// 切换时是否开启播放
|
||||
this.succes = true;
|
||||
this.play_();
|
||||
} else {
|
||||
this.succes = false;
|
||||
}
|
||||
this.playbackRate(); //倍数
|
||||
console.log("当前音频:", this.recorPath);
|
||||
},
|
||||
|
||||
//快进快退
|
||||
jump(e) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
var num;
|
||||
if (e == "kt") {
|
||||
num = (this.currentTime - Math.floor(this.Seconds % 60)).toFixed(0); //当前时间-15秒
|
||||
} else {
|
||||
num = (this.currentTime + Math.floor(this.Seconds % 60)).toFixed(0); //当前时间+15秒
|
||||
}
|
||||
this.seek(num);
|
||||
},
|
||||
seek(num) {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.seek(num);
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.seek(num);
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//倍速弹框
|
||||
beishu() {
|
||||
this.shows = !this.shows;
|
||||
},
|
||||
// 倍速
|
||||
setRate(index, item) {
|
||||
this.bsid = item.id;
|
||||
this.bsindex = index;
|
||||
this.shows = false;
|
||||
this.playbackRate();
|
||||
},
|
||||
|
||||
// 更新进度条
|
||||
timeupdate(event) {
|
||||
if (this.lock) return; // 锁
|
||||
var currentTime, duration;
|
||||
if (event.detail.detail) {
|
||||
currentTime = event.detail.detail.currentTime;
|
||||
duration = event.detail.detail.duration;
|
||||
} else {
|
||||
currentTime = event.detail.currentTime;
|
||||
duration = event.detail.duration;
|
||||
}
|
||||
this.currentTime = currentTime;
|
||||
console.log("this.currentTime at line 當前386:", this.currentTime);
|
||||
this.duration = duration;
|
||||
console.log("this.duration at line 總時長388:", this.duration);
|
||||
},
|
||||
|
||||
// 拖动进度条
|
||||
sliderChange(data) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
//此处滑动进度条--开始播放
|
||||
if (this.slideYes && !this.succes) {
|
||||
this.play_();
|
||||
this.succes = true;
|
||||
}
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.seek(data.detail.value); //获取秒数
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.seek(data.detail.value); //获取秒数
|
||||
//#endif
|
||||
},
|
||||
|
||||
//拖动中
|
||||
sliderChanging(data) {
|
||||
if (data.detail.value == 0) {
|
||||
this.succes = false;
|
||||
this.pause_();
|
||||
}
|
||||
this.currentTime = data.detail.value;
|
||||
},
|
||||
|
||||
// 视频加载完成
|
||||
loadedmetadata(data) {
|
||||
console.log("data at line zh:", data);
|
||||
this.duration = data.detail.duration;
|
||||
|
||||
// this.seek(this.firstTime);
|
||||
// this.curTime = this.currentTime
|
||||
},
|
||||
|
||||
//音频结束触发
|
||||
next(data) {
|
||||
this.succes = false;
|
||||
if (this.autoNext) {
|
||||
//自动播放下一首
|
||||
this.upper(2);
|
||||
}
|
||||
},
|
||||
|
||||
// 各平台播放_暂停
|
||||
play_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.play();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.play();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
pause_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.pause();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.pause();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//离开页面暂停播放
|
||||
stop_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.stop();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.stop();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//提示
|
||||
upperToast(num) {
|
||||
num == 1
|
||||
? uni.showToast({
|
||||
title: "到头了~",
|
||||
icon: "none",
|
||||
})
|
||||
: uni.showToast({
|
||||
title: "没有更多了~",
|
||||
icon: "none",
|
||||
});
|
||||
},
|
||||
|
||||
//音频倍数
|
||||
playbackRate() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.playbackRate(this.bsid);
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.playbackRate(this.bsid);
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//加载框--封
|
||||
playLoading() {
|
||||
if (this.loading && !this.succes) {
|
||||
uni.showLoading({
|
||||
title: "音频加载中...",
|
||||
});
|
||||
this.loading = false;
|
||||
}
|
||||
setTimeout(() => {
|
||||
uni.hideLoading();
|
||||
}, 1500);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
//播放器当前播放进度
|
||||
curTime(val) {
|
||||
if (this.curTime !== null) {
|
||||
console.log("timer at line 495:", this.curTime);
|
||||
this.$emit("curTime", this.curTime);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
//时间换算
|
||||
function calcTimer(timer) {
|
||||
if (timer === 0 || typeof timer !== "number") {
|
||||
return "00:00";
|
||||
}
|
||||
let mm = Math.floor(timer / 60);
|
||||
let ss = Math.floor(timer % 60);
|
||||
if (mm < 10) {
|
||||
mm = "0" + mm;
|
||||
}
|
||||
if (ss < 10) {
|
||||
ss = "0" + ss;
|
||||
}
|
||||
return mm + ":" + ss;
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
/* #video {
|
||||
width: 100%;
|
||||
} */
|
||||
.audo-video {
|
||||
margin-top: 0rpx;
|
||||
color: #fff;
|
||||
.beishuItem {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.slider-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 27rpx;
|
||||
// color: #fff;
|
||||
}
|
||||
|
||||
button {
|
||||
display: inline-block;
|
||||
width: 100rpx;
|
||||
background-color: #fff;
|
||||
font-size: 24rpx;
|
||||
color: #000;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: -10rpx;
|
||||
z-index: -1;
|
||||
width: 1rpx;
|
||||
height: 1rpx;
|
||||
}
|
||||
|
||||
.audo-top {
|
||||
padding: 20rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
|
||||
image {
|
||||
width: 45rpx;
|
||||
height: 45rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.audo-a {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: auto;
|
||||
position: relative;
|
||||
z-index: 9;
|
||||
margin-right: -20rpx;
|
||||
}
|
||||
|
||||
.beishu {
|
||||
position: relative;
|
||||
width: 100rpx;
|
||||
padding-top: 5rpx;
|
||||
padding-bottom: 5rpx;
|
||||
text-align: center;
|
||||
border-radius: 25rpx;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
|
||||
.absolute {
|
||||
position: absolute;
|
||||
|
||||
.beishu-a {
|
||||
width: 200rpx;
|
||||
border-radius: 20rpx;
|
||||
text-align: center;
|
||||
line-height: 90rpx;
|
||||
background: #fff;
|
||||
|
||||
.title {
|
||||
pdding-left: 30rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
622
pages/component/commonComponents/video/cx-audio-play.vue
Normal file
622
pages/component/commonComponents/video/cx-audio-play.vue
Normal file
@@ -0,0 +1,622 @@
|
||||
<template>
|
||||
<!--音频组件-->
|
||||
<view
|
||||
class="boxShadow"
|
||||
style="
|
||||
width: 100%;
|
||||
border-radius: 40rpx;
|
||||
height: 100%;
|
||||
padding: 40rpx 0;
|
||||
box-sizing: border-box;
|
||||
background-image: linear-gradient(80deg, #959698 0%, #808183 100%);
|
||||
"
|
||||
>
|
||||
<view class="bgfff">
|
||||
<view>
|
||||
<slot name="title"></slot>
|
||||
<view class="audo-video">
|
||||
<view class="slider-box">
|
||||
<text class="mm">{{ timer }}</text>
|
||||
|
||||
<slider
|
||||
style="width: 440rpx"
|
||||
@change="sliderChange"
|
||||
@changing="sliderChanging"
|
||||
class="audio-slider"
|
||||
block-size="16"
|
||||
:min="0"
|
||||
:max="duration"
|
||||
:value="currentTime"
|
||||
activeColor="#FF8849"
|
||||
@touchstart="lock = true"
|
||||
@touchend="lock = false"
|
||||
/>
|
||||
<text class="ss" v-if="overTimer != 'NaN:NaN'">{{
|
||||
overTimer
|
||||
}}</text>
|
||||
<text class="ss" v-else>00.00</text>
|
||||
</view>
|
||||
<!--音频播放按钮处-->
|
||||
<view class="audo-top">
|
||||
<!--上一首-->
|
||||
<!-- <image
|
||||
src="./icon/xys.png"
|
||||
style="width: 40rpx; height: 40rpx; transform: rotate(180deg)"
|
||||
mode="aspectFill"
|
||||
@click="upper(1)"
|
||||
></image> -->
|
||||
<!--上一首-->
|
||||
|
||||
<!--快退-->
|
||||
<image
|
||||
src="./icon/kt.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="widthFix"
|
||||
@click="jump('kt')"
|
||||
></image>
|
||||
<!--快退-->
|
||||
|
||||
<!--播放-->
|
||||
<image
|
||||
src="./icon/kt.png"
|
||||
style="width: 100rpx; height: 100rpx"
|
||||
mode="widthFix"
|
||||
@click="plays()"
|
||||
></image>
|
||||
<!--播放-->
|
||||
|
||||
<!--快进-->
|
||||
<image
|
||||
src="./icon/kj.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="widthFix"
|
||||
@click="jump('kj')"
|
||||
></image>
|
||||
<!--快进-->
|
||||
|
||||
<!--下一首-->
|
||||
<!-- <image
|
||||
src="./icon/xys.png"
|
||||
style="width: 40rpx; height: 40rpx"
|
||||
mode="aspectFill"
|
||||
@click="upper(2)"
|
||||
></image> -->
|
||||
<!--下一首-->
|
||||
|
||||
<view class="audo-a" style="">
|
||||
<!--进度条-->
|
||||
|
||||
<!--进度条-->
|
||||
|
||||
<!--倍数-->
|
||||
<view
|
||||
class="beishu"
|
||||
style="border: 1rpx solid #e1dbf2"
|
||||
@click="beishu"
|
||||
>{{ BsNav[bsindex].bs }} X
|
||||
</view>
|
||||
<view class="absolute" style="right: 0; top: 80rpx" v-if="shows">
|
||||
<!-- <u-transition :show="show" mode="slide-right" duration="300"> -->
|
||||
<view
|
||||
class="beishu-a"
|
||||
style="border: 1rpx solid #fff"
|
||||
v-if="show"
|
||||
>
|
||||
<view
|
||||
v-for="(item, index) in BsNav"
|
||||
:key="index"
|
||||
@click="setRate(index, item)"
|
||||
class="title beishuItem"
|
||||
:style="{ color: bsid == item.id ? '#9461EB' : '' }"
|
||||
>
|
||||
{{ item.bs }} X
|
||||
</view>
|
||||
</view>
|
||||
<!-- </u-transition> -->
|
||||
</view>
|
||||
<!--倍数-->
|
||||
</view>
|
||||
</view>
|
||||
<!--音频播放按钮处-->
|
||||
|
||||
<!--音频api处[视频代替音频-实现倍数功能]-->
|
||||
<video
|
||||
id="myVideo"
|
||||
ref="myVideo"
|
||||
:src="recorPath"
|
||||
class="hidden"
|
||||
@timeupdate="timeupdate"
|
||||
:autoplay="autoplays"
|
||||
@loadedmetadata="loadedmetadata"
|
||||
@ended="next"
|
||||
controls
|
||||
style="width: 10rpx; height: 10rpx"
|
||||
></video>
|
||||
<!--音频api处[视频代替音频-实现倍数功能]-->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!--占位-->
|
||||
</view>
|
||||
<!--音频组件 wx:cxalq8-24 Author:chenxin-->
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/*
|
||||
list -- 音频数据: 数组格式/不传无法播放
|
||||
Seconds -- 快进快退秒数: 默认15秒
|
||||
autoNext -- 是否自动播放下一首
|
||||
autoplays -- 进入页面是否自动播放 - 默认false
|
||||
slideYes -- 滑动进度条时是否开启播放 - 默认false
|
||||
switAud -- 切换上下音频是否开启播放 - 默认true
|
||||
BsNav -- 倍数数据传入/数组形式
|
||||
|
||||
图片功能样式,如想改动请在组件内部修改,页面中已注释 -- 逻辑根据自己需求改
|
||||
目前只测试 微信小程序和H5和APP -- 其他平台未知
|
||||
[Author:chenxin 交流vx:cxalq8-24]
|
||||
*/
|
||||
export default {
|
||||
name: "cx-audio-play",
|
||||
props: {
|
||||
list: {
|
||||
//音频数据
|
||||
Type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
Seconds: {
|
||||
//快进快退 - 秒数
|
||||
Type: Number,
|
||||
default: 15,
|
||||
},
|
||||
firstTime: {
|
||||
//快进快退 - 秒数
|
||||
Type: Number,
|
||||
default: 0,
|
||||
},
|
||||
autoNext: {
|
||||
//是否自动播放下一首
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
autoplays: {
|
||||
//是否开启自动播放
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
slideYes: {
|
||||
//滑动进度条 - 是否开启播放
|
||||
Type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
switAud: {
|
||||
Type: Boolean, //切换上下音频 - 是否开启播放
|
||||
default: true,
|
||||
},
|
||||
BsNav: {
|
||||
//倍数-传入
|
||||
Type: Array,
|
||||
default: () => [
|
||||
{
|
||||
id: 1.0,
|
||||
bs: "1.0",
|
||||
},
|
||||
{
|
||||
id: 1.5,
|
||||
bs: "1.5",
|
||||
},
|
||||
{
|
||||
id: 2.0,
|
||||
bs: "2.0",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
shows: false, //倍数弹框
|
||||
show: true, //倍数弹框动画默认开启
|
||||
succes: false, //播放按钮
|
||||
bsid: "", //倍数默认显示第一个
|
||||
bsindex: 0, //倍数默认显示第一个
|
||||
num: 0,
|
||||
current: 0, //当前选中的索引
|
||||
recorPath: "", //音频播放地址
|
||||
lock: false, // 锁
|
||||
currentTime: 0, //当前进度
|
||||
duration: 0, // 总进度
|
||||
videoContext: null,
|
||||
loading: true, //锁 加载
|
||||
curTime: null, //锁 加载
|
||||
};
|
||||
},
|
||||
onReady() {},
|
||||
onShow() {},
|
||||
mounted() {
|
||||
//初始化音频api
|
||||
},
|
||||
updated() {},
|
||||
onLoad() {},
|
||||
onHide() {
|
||||
//监听页面离开 - 销毁音频
|
||||
this.stop_();
|
||||
this.$emit("curTime", this.curTime);
|
||||
},
|
||||
onUnload() {
|
||||
//监听页面卸载 - 销毁音频
|
||||
this.stop_();
|
||||
this.$emit("curTime", this.curTime);
|
||||
},
|
||||
destroyed() {
|
||||
// this.innerAudioContext.stop();
|
||||
},
|
||||
computed: {
|
||||
timer() {
|
||||
this.curTime = this.currentTime;
|
||||
return calcTimer(this.currentTime);
|
||||
},
|
||||
overTimer() {
|
||||
return calcTimer(this.duration);
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
init() {
|
||||
this.currentTime = this.firstTime;
|
||||
this.videoContext = uni.createVideoContext("myVideo", this);
|
||||
//默认播放第一个
|
||||
if (this.list.length != 0) {
|
||||
this.recorPath = this.list[0];
|
||||
if (this.autoplays) {
|
||||
this.succes = true;
|
||||
}
|
||||
} else {
|
||||
this.duration = 0;
|
||||
}
|
||||
//倍数默认选择第一个
|
||||
if (this.BsNav.length != 0) {
|
||||
this.bsid = this.BsNav[0].id;
|
||||
this.playbackRate(); //倍数
|
||||
}
|
||||
},
|
||||
//没有音频数据
|
||||
noUrl() {
|
||||
if (this.list.length == 0) {
|
||||
uni.showToast({
|
||||
title: "请先传入音频数据哦~",
|
||||
icon: "none",
|
||||
});
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
//播放暂停
|
||||
plays() {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
this.playLoading();
|
||||
this.succes = !this.succes;
|
||||
this.succes ? this.play_() : this.pause_();
|
||||
},
|
||||
|
||||
//上下首切换
|
||||
upper(num) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
let that = this;
|
||||
if (num == 1) {
|
||||
//上一首
|
||||
if (this.num == 0) {
|
||||
this.upperToast(num); //提示
|
||||
return;
|
||||
}
|
||||
this.num -= 1;
|
||||
} else {
|
||||
//下一首
|
||||
if (this.num + 1 == this.list.length) {
|
||||
this.upperToast(num); //提示
|
||||
return;
|
||||
}
|
||||
this.num += 1;
|
||||
}
|
||||
this.recorPath = this.list[this.num];
|
||||
if (this.switAud) {
|
||||
// 切换时是否开启播放
|
||||
this.succes = true;
|
||||
this.play_();
|
||||
} else {
|
||||
this.succes = false;
|
||||
}
|
||||
this.playbackRate(); //倍数
|
||||
console.log("当前音频:", this.recorPath);
|
||||
},
|
||||
|
||||
//快进快退
|
||||
jump(e) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
var num;
|
||||
if (e == "kt") {
|
||||
num = (this.currentTime - Math.floor(this.Seconds % 60)).toFixed(0); //当前时间-15秒
|
||||
} else {
|
||||
num = (this.currentTime + Math.floor(this.Seconds % 60)).toFixed(0); //当前时间+15秒
|
||||
}
|
||||
this.seek(num);
|
||||
},
|
||||
seek(num) {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.seek(num);
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.seek(num);
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//倍速弹框
|
||||
beishu() {
|
||||
this.shows = !this.shows;
|
||||
},
|
||||
// 倍速
|
||||
setRate(index, item) {
|
||||
this.bsid = item.id;
|
||||
this.bsindex = index;
|
||||
this.shows = false;
|
||||
this.playbackRate();
|
||||
},
|
||||
|
||||
// 更新进度条
|
||||
timeupdate(event) {
|
||||
if (this.lock) return; // 锁
|
||||
var currentTime, duration;
|
||||
if (event.detail.detail) {
|
||||
currentTime = event.detail.detail.currentTime;
|
||||
duration = event.detail.detail.duration;
|
||||
} else {
|
||||
currentTime = event.detail.currentTime;
|
||||
duration = event.detail.duration;
|
||||
}
|
||||
this.currentTime = currentTime;
|
||||
console.log("this.currentTime at line 當前386:", this.currentTime);
|
||||
this.duration = duration;
|
||||
console.log("this.duration at line 總時長388:", this.duration);
|
||||
},
|
||||
|
||||
// 拖动进度条
|
||||
sliderChange(data) {
|
||||
if (!this.noUrl()) {
|
||||
return;
|
||||
}
|
||||
//此处滑动进度条--开始播放
|
||||
if (this.slideYes && !this.succes) {
|
||||
this.play_();
|
||||
this.succes = true;
|
||||
}
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.seek(data.detail.value); //获取秒数
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.seek(data.detail.value); //获取秒数
|
||||
//#endif
|
||||
},
|
||||
|
||||
//拖动中
|
||||
sliderChanging(data) {
|
||||
if (data.detail.value == 0) {
|
||||
this.succes = false;
|
||||
this.pause_();
|
||||
}
|
||||
this.currentTime = data.detail.value;
|
||||
},
|
||||
|
||||
// 视频加载完成
|
||||
loadedmetadata(data) {
|
||||
console.log("data at line zh:", data);
|
||||
this.duration = data.detail.duration;
|
||||
|
||||
// this.seek(this.firstTime);
|
||||
// this.curTime = this.currentTime
|
||||
},
|
||||
|
||||
//音频结束触发
|
||||
next(data) {
|
||||
this.succes = false;
|
||||
if (this.autoNext) {
|
||||
//自动播放下一首
|
||||
this.upper(2);
|
||||
}
|
||||
},
|
||||
|
||||
// 各平台播放_暂停
|
||||
play_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.play();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.play();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
pause_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.pause();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.pause();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//离开页面暂停播放
|
||||
stop_() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.stop();
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.stop();
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//提示
|
||||
upperToast(num) {
|
||||
num == 1
|
||||
? uni.showToast({
|
||||
title: "到头了~",
|
||||
icon: "none",
|
||||
})
|
||||
: uni.showToast({
|
||||
title: "没有更多了~",
|
||||
icon: "none",
|
||||
});
|
||||
},
|
||||
|
||||
//音频倍数
|
||||
playbackRate() {
|
||||
this.$nextTick(() => {
|
||||
//#ifdef H5
|
||||
this.$refs.myVideo.playbackRate(this.bsid);
|
||||
//#endif
|
||||
//#ifndef H5
|
||||
this.videoContext.playbackRate(this.bsid);
|
||||
//#endif
|
||||
});
|
||||
},
|
||||
|
||||
//加载框--封
|
||||
playLoading() {
|
||||
if (this.loading && !this.succes) {
|
||||
uni.showLoading({
|
||||
title: "音频加载中...",
|
||||
});
|
||||
this.loading = false;
|
||||
}
|
||||
setTimeout(() => {
|
||||
uni.hideLoading();
|
||||
}, 1500);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
//播放器当前播放进度
|
||||
curTime(val) {
|
||||
if (this.curTime !== null) {
|
||||
console.log("timer at line 495:", this.curTime);
|
||||
this.$emit("curTime", this.curTime);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
//时间换算
|
||||
function calcTimer(timer) {
|
||||
console.log("timer at line 514:", timer);
|
||||
|
||||
if (timer === 0 || typeof timer !== "number") {
|
||||
return "00:00";
|
||||
}
|
||||
let mm = Math.floor(timer / 60);
|
||||
let ss = Math.floor(timer % 60);
|
||||
if (mm < 10) {
|
||||
mm = "0" + mm;
|
||||
}
|
||||
if (ss < 10) {
|
||||
ss = "0" + ss;
|
||||
}
|
||||
return mm + ":" + ss;
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
page {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
/* #video {
|
||||
width: 100%;
|
||||
} */
|
||||
.audo-video {
|
||||
margin-top: 0rpx;
|
||||
color: #fff;
|
||||
.beishuItem {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.slider-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 27rpx;
|
||||
// color: #fff;
|
||||
}
|
||||
|
||||
button {
|
||||
display: inline-block;
|
||||
width: 100rpx;
|
||||
background-color: #fff;
|
||||
font-size: 24rpx;
|
||||
color: #000;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: -10rpx;
|
||||
z-index: -1;
|
||||
width: 1rpx;
|
||||
height: 1rpx;
|
||||
}
|
||||
|
||||
.audo-top {
|
||||
padding: 20rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
|
||||
image {
|
||||
width: 45rpx;
|
||||
height: 45rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.audo-a {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: auto;
|
||||
position: relative;
|
||||
z-index: 9;
|
||||
margin-right: -20rpx;
|
||||
}
|
||||
|
||||
.beishu {
|
||||
position: relative;
|
||||
width: 100rpx;
|
||||
padding-top: 5rpx;
|
||||
padding-bottom: 5rpx;
|
||||
text-align: center;
|
||||
border-radius: 25rpx;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
|
||||
.absolute {
|
||||
position: absolute;
|
||||
|
||||
.beishu-a {
|
||||
width: 200rpx;
|
||||
border-radius: 20rpx;
|
||||
text-align: center;
|
||||
line-height: 90rpx;
|
||||
background: #fff;
|
||||
|
||||
.title {
|
||||
pdding-left: 30rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
BIN
pages/component/commonComponents/video/icon/bofang2.png
Normal file
BIN
pages/component/commonComponents/video/icon/bofang2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
BIN
pages/component/commonComponents/video/icon/kj.png
Normal file
BIN
pages/component/commonComponents/video/icon/kj.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
pages/component/commonComponents/video/icon/kt.png
Normal file
BIN
pages/component/commonComponents/video/icon/kt.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
pages/component/commonComponents/video/icon/zanting.jpg
Normal file
BIN
pages/component/commonComponents/video/icon/zanting.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 816 B |
BIN
pages/component/commonComponents/video/icon/zt.jpg
Normal file
BIN
pages/component/commonComponents/video/icon/zt.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 809 B |
BIN
pages/component/commonComponents/video/icon/zt.png
Normal file
BIN
pages/component/commonComponents/video/icon/zt.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
386
pages/component/commonComponents/video/index.vue
Normal file
386
pages/component/commonComponents/video/index.vue
Normal file
@@ -0,0 +1,386 @@
|
||||
<template>
|
||||
<view
|
||||
class="container"
|
||||
id="Aliyun"
|
||||
:style="`background-color:# 000; position: relative; padding: 0`"
|
||||
>
|
||||
<div
|
||||
:videoData="videoData"
|
||||
style="color: #fff"
|
||||
ref="AliyunFresh"
|
||||
@tap="renderScript.handleClick"
|
||||
v-show="false"
|
||||
:change:videoData="renderScript.receiveMsg"
|
||||
></div>
|
||||
|
||||
<view
|
||||
v-if="show"
|
||||
style="
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #fff;
|
||||
font-size: 38rpx;
|
||||
text-align: center;
|
||||
"
|
||||
>
|
||||
此设备暂不支持观看当前视频<br />请移步到安卓手机进行学习!
|
||||
</view>
|
||||
<view v-else>
|
||||
<template v-if="showAliYunPlayer">
|
||||
<common-list-audio
|
||||
id="commonAudio"
|
||||
:showAliYunPlayer="showAliYunPlayer"
|
||||
@handleSuccessDispose="handleSuccessDispose"
|
||||
ref="commonVideoAliyun1"
|
||||
v-if="videoInfo.type == 2"
|
||||
:videoData="videoData"
|
||||
:currentVideoIndex="currentVideoIndex"
|
||||
:videoInfo="videoInfo"
|
||||
:curriculumData="curriculumData"
|
||||
:firstTime="firstTime"
|
||||
>
|
||||
</common-list-audio>
|
||||
<common-list-aliyun
|
||||
id="AliPlayer"
|
||||
:showAliYunPlayer="showAliYunPlayer"
|
||||
@handleSuccessDispose="handleSuccessDispose"
|
||||
ref="commonVideoAliyun"
|
||||
v-if="videoInfo.type != 2"
|
||||
:videoData="videoData"
|
||||
:firstTime="firstTime"
|
||||
>
|
||||
</common-list-aliyun>
|
||||
</template>
|
||||
|
||||
<view v-else style="height: 200px"> </view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import store from "@/store/index.js";
|
||||
import $http from "@/config/requestConfig.js";
|
||||
import { mapState, mapMutations } from "vuex";
|
||||
import $ from "jquery";
|
||||
export default {
|
||||
props: {
|
||||
currentVideoId: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
currentVideoIndex: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
curriculumData: {
|
||||
type: Object,
|
||||
default: {},
|
||||
},
|
||||
secondCountDown: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
isfresh: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showCountDown: false,
|
||||
playEndBlank: false,
|
||||
flag: false, //视频提示显示
|
||||
show: false, //视频提示显示
|
||||
// isfresh: false, //视频提示显示
|
||||
showAliYunPlayer: false, //视频提示显示
|
||||
content: "此设备暂不支持观看当前视频,请移步到安卓手机进行学习!",
|
||||
platform: null, //设备类型
|
||||
isFullScreen: false, //当前是否是全屏模式
|
||||
isOnLoad: false, //是否刷新
|
||||
isChange: false, //是否切换播放源
|
||||
videoList: [], //视频列表
|
||||
videoOssList: [], //本地视频列表
|
||||
options: {}, //父组件传参
|
||||
currentTime: "", //当前播放时间
|
||||
videoData: {}, //获取当前的播放信息,playAuth,m3u8url
|
||||
videoInfo: {}, //获取当前的播放信息,playAuth,m3u8url
|
||||
isSetFirstTime: false, //是否获取到初始播放时间
|
||||
firstTime: 0, //初始播放时间
|
||||
|
||||
urlList: {
|
||||
checkVideo: "sociology/course/checkVideo",
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// ...mapState(["videoOssList"]),
|
||||
},
|
||||
|
||||
watch: {
|
||||
isOnLoad(newValue) {
|
||||
if (this.isOnLoad) {
|
||||
this.changeVideoData();
|
||||
}
|
||||
},
|
||||
timer(newValue) {
|
||||
this.$emit("child-event", newValue);
|
||||
},
|
||||
isfresh(newValue) {},
|
||||
|
||||
videoOssList: {
|
||||
immediate: true,
|
||||
handler(newValue) {
|
||||
if (this.videoOssList.length > 0) {
|
||||
uni.setStorageSync("videoOssList", JSON.stringify(this.videoOssList));
|
||||
}
|
||||
},
|
||||
},
|
||||
currentVideoId: {
|
||||
immediate: true,
|
||||
handler(newValue) {
|
||||
if (newValue) {
|
||||
// if (!this.isfresh) {
|
||||
this.videoData = {};
|
||||
this.showAliYunPlayer = false;
|
||||
this.platform = this.$platform;
|
||||
this.show = false;
|
||||
this.isOnLoad = false;
|
||||
this.videoData = {};
|
||||
this.firstTime = 0;
|
||||
if (uni.getStorageSync("videoOssList")) {
|
||||
this.videoOssList = JSON.parse(uni.getStorageSync("videoOssList"));
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.checkVideo();
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
//
|
||||
mounted() {},
|
||||
//子组件销毁前
|
||||
beforeDestroy() {
|
||||
plus.screen.lockOrientation("portrait-primary");
|
||||
},
|
||||
beforeUpdate() {},
|
||||
methods: {
|
||||
hideNextVideo() {
|
||||
this.showCountDown = false;
|
||||
this.playEndBlank = false;
|
||||
this.$emit("hideNextVideo");
|
||||
},
|
||||
destory() {
|
||||
if (this.showAliYunPlayer) {
|
||||
this.$nextTick(() => {
|
||||
this.$refs.commonVideoAliyun.destory();
|
||||
this.videoData = {};
|
||||
});
|
||||
}
|
||||
},
|
||||
handleSuccessDispose() {
|
||||
this.showAliYunPlayer = false;
|
||||
this.$emit("handleFresh", true);
|
||||
},
|
||||
//ios不能播放私有加密提示信息
|
||||
openShow() {
|
||||
this.show = true;
|
||||
},
|
||||
changeflag() {
|
||||
this.flag = 1;
|
||||
},
|
||||
|
||||
changeVideoData() {
|
||||
if (this.videoData && this.videoData.id && this.flag == 1) {
|
||||
this.showAliYunPlayer = true;
|
||||
} else {
|
||||
this.showAliYunPlayer = false;
|
||||
setTimeout(() => {
|
||||
this.changeVideoData();
|
||||
}, 100);
|
||||
}
|
||||
},
|
||||
|
||||
//获取 video 初始化信息 (播放凭证 + m3u8)
|
||||
async checkVideo() {
|
||||
await $http
|
||||
.request({
|
||||
url: this.urlList.checkVideo,
|
||||
method: "Post", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||||
data: {
|
||||
id: this.currentVideoId,
|
||||
loadAnimate: "none",
|
||||
},
|
||||
header: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then(async (res) => {
|
||||
var that = this;
|
||||
this.videoInfo=res.video
|
||||
that.videoData = {
|
||||
id: that.currentVideoId,
|
||||
vid: res.video.video,
|
||||
|
||||
};
|
||||
|
||||
if (res.video.type == 1) {
|
||||
if (res.video.m3u8Url == null || res.video.m3u8Url == "") {
|
||||
//私有加密
|
||||
if (that.$platform == "ios") {
|
||||
that.show = true;
|
||||
return false;
|
||||
}
|
||||
that.videoData.playAuth = res.video.playAuth.replace(/=/g, "");
|
||||
that.videoData.encryptType = "1";
|
||||
} else {
|
||||
//标准加密
|
||||
that.videoData.source = res.video.m3u8Url;
|
||||
}
|
||||
} else {
|
||||
//mp4 mp3
|
||||
that.videoData.source = res.video.videoUrl;
|
||||
}
|
||||
|
||||
var netWork = res.video.userCourseVideoPositionEntity
|
||||
? res.video.userCourseVideoPositionEntity.position
|
||||
: 0;
|
||||
var list = [...that.videoOssList];
|
||||
if (list.length > 0) {
|
||||
list = [];
|
||||
var index = list.findIndex((e) => e.id == res.video.id);
|
||||
if (netWork) {
|
||||
if (index >= 0) {
|
||||
that.firstTime =
|
||||
list[index].time > netWork ? list[index].time : netWork;
|
||||
} else {
|
||||
that.firstTime = netWork ? netWork : 0;
|
||||
}
|
||||
} else {
|
||||
if (index >= 0) {
|
||||
that.firstTime = list[index].time ? list[index].time : 0;
|
||||
}
|
||||
}
|
||||
if (res.video.duration - that.firstTime <= 2) {
|
||||
that.firstTime = 0;
|
||||
}
|
||||
that.videoOssList = [...list];
|
||||
}
|
||||
|
||||
that.isOnLoad = true;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<script module="renderScript" lang="renderjs">
|
||||
import $ from "jquery";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
|
||||
},
|
||||
|
||||
created() {
|
||||
|
||||
if (typeof window.Aliplayer === 'function') {
|
||||
} else {
|
||||
// 动态引入较大类库避免影响页面展示
|
||||
this.loadWebPlayerSDK(); //引入播放器sdk、css
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
mounted() {
|
||||
if (typeof window.Aliplayer === 'function') {
|
||||
this.initAliPlayer();
|
||||
}
|
||||
},
|
||||
destroyed(){
|
||||
$("#Aliyun").empty();
|
||||
},
|
||||
methods: {
|
||||
|
||||
handleClick(event, ownerInstance) {
|
||||
ownerInstance.callMethod("changeflag");
|
||||
},
|
||||
initAliPlayer() {
|
||||
this.$refs.AliyunFresh.click()
|
||||
},
|
||||
receiveMsg(newValue, oldValue, ownerVm, vm) {}, //是否刚开始设置播放时间
|
||||
//引入播放器sdk、css
|
||||
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.initAliPlayer();
|
||||
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>
|
||||
.container {
|
||||
width: 100vw;
|
||||
height: auto;
|
||||
|
||||
/deep/.pause {
|
||||
width: 60rpx !important;
|
||||
height: 60rpx !important;
|
||||
}
|
||||
}
|
||||
.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 {
|
||||
}
|
||||
}
|
||||
</style>
|
||||
412
pages/component/commonComponents/video/renderjs.js
Normal file
412
pages/component/commonComponents/video/renderjs.js
Normal file
@@ -0,0 +1,412 @@
|
||||
import $ from "jquery";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
player: null, //播放器
|
||||
videoTimer: null, //定时器
|
||||
curTime: null, //播放器当前播放进度
|
||||
curStatus: null, //播放器当前播放状态
|
||||
playerConfig: {
|
||||
id: "url-player-test",
|
||||
width: "100%", //容器的大小
|
||||
height: "100%", //容器的大小
|
||||
qualitySort: "asc",
|
||||
cover: "",
|
||||
autoplay: true,
|
||||
isLive: false,
|
||||
rePlay: false,
|
||||
playsinline: true,
|
||||
controlBarVisibility: "hover",
|
||||
useH5Prism: true,
|
||||
skinLayout: [],
|
||||
},
|
||||
|
||||
skinLayoutIos: [{
|
||||
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: "fullScreenButton",
|
||||
align: "tr",
|
||||
x: 10,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
name: "prism-speed-selector",
|
||||
align: "tr",
|
||||
x: 15,
|
||||
y: 12,
|
||||
},
|
||||
{
|
||||
name: "volume",
|
||||
align: "tr",
|
||||
x: 5,
|
||||
y: 10,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
skinLayoutAndroid: [{
|
||||
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,
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
};
|
||||
},
|
||||
|
||||
watch: {
|
||||
//播放器当前播放进度
|
||||
curTime(val) {
|
||||
if (this.curTime !== null) {
|
||||
this.$refs.videoContent1.click();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
created() {
|
||||
|
||||
|
||||
this.loadWebPlayerSDK(); //引入播放器sdk、css
|
||||
},
|
||||
// beforeDestroy() {
|
||||
|
||||
|
||||
// if (this.player) {
|
||||
// console.log('是否出发组件销毁', this.player)
|
||||
// this.player.dispose();
|
||||
|
||||
// }
|
||||
// },
|
||||
methods: {
|
||||
showToast(msg) {
|
||||
uni.showToast({
|
||||
title: msg,
|
||||
duration: 2000
|
||||
});
|
||||
},
|
||||
//检验视频 获取加密权限
|
||||
checkValue() {
|
||||
|
||||
if (!this.videoData.vid && !this.isfresh) {
|
||||
setTimeout(() => {
|
||||
this.checkValue();
|
||||
}, 1000);
|
||||
} else {
|
||||
this.initAliyunPlayer();
|
||||
}
|
||||
},
|
||||
|
||||
//引入播放器sdk、css
|
||||
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);
|
||||
});
|
||||
},
|
||||
|
||||
//初始化播放器
|
||||
initAliyunPlayer() {
|
||||
var components = [{
|
||||
name: "RateComponent", //倍速组件
|
||||
type: AliPlayerComponent.RateComponent,
|
||||
}]
|
||||
if (this.platform != 'ios') {
|
||||
var fullScreenButtonComponent = Aliplayer.Component({
|
||||
init: function(status, toAddress) {
|
||||
this.fullScreenStatus = status;
|
||||
this.$html = $(".fullScreenButton-container");
|
||||
},
|
||||
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);
|
||||
},
|
||||
});
|
||||
|
||||
components = [...components, {
|
||||
name: "adComponent", //自定义全屏组件
|
||||
type: fullScreenButtonComponent,
|
||||
}, ]
|
||||
}
|
||||
|
||||
//设置播放基本配置
|
||||
var playerOptions = {
|
||||
...this.playerConfig,
|
||||
components: components,
|
||||
skinLayout: this.platform == 'ios' ? this.skinLayoutIos : this.skinLayoutAndroid
|
||||
};
|
||||
|
||||
if (this.videoData.encryptType == 1) {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
vid: this.videoData.vid,
|
||||
playauth: this.videoData.playAuth, // 必选参数,参数值可通过调用GetVideoPlayAuth接口获取。
|
||||
encryptType: 1, // 必选参数,当播放私有加密流时需要设置本参数值为1。其它情况无需设置。
|
||||
playConfig: {
|
||||
EncryptType: "AliyunVoDEncryption",
|
||||
},
|
||||
};
|
||||
} else {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
source: this.videoData.source,
|
||||
|
||||
};
|
||||
}
|
||||
var player = new Aliplayer(playerOptions, (player) => {
|
||||
player.on("ready", () => {
|
||||
this.player = player;
|
||||
var lastTime = this.firstTime
|
||||
if (this.platform == "ios") {
|
||||
|
||||
this.player.one("canplay", () => {
|
||||
this.player.seek(this.firstTime);
|
||||
});
|
||||
} else {
|
||||
this.player.seek(this.firstTime);
|
||||
}
|
||||
|
||||
this.player.one('timeupdate', () => {
|
||||
if (!this.player.tag.seeking) {
|
||||
// 更新最近一次的播放位置
|
||||
lastTime = parseInt(this.player.getCurrentTime())
|
||||
this.curTime = lastTime;
|
||||
}
|
||||
});
|
||||
this.player.on('timeupdate', () => {
|
||||
if (!this.player.tag.seeking) {
|
||||
// 更新最近一次的播放位置
|
||||
lastTime = parseInt(this.player.getCurrentTime())
|
||||
this.curTime = lastTime;
|
||||
}
|
||||
});
|
||||
this.player.on("ended", () => {
|
||||
lastTime = parseInt(this.player.getCurrentTime())
|
||||
this.curTime = lastTime;
|
||||
this.$refs.videoContent2.click();
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
//调用 recordTime 方法 存本地播放时长
|
||||
emitData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("recordTime", this.curTime);
|
||||
},
|
||||
|
||||
//调用 setVideoFirtsetTime 设置初始播放
|
||||
emitSetData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("setVideoFirtsetTime");
|
||||
},
|
||||
|
||||
//调用 openShow 设置ios 不能播放私用加密 提示信息
|
||||
emitopenShow(event, ownerInstance) {
|
||||
ownerInstance.callMethod("openShow");
|
||||
},
|
||||
|
||||
//调用 handleEnd 存储视频播放信息
|
||||
endEmitData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("handleEnd");
|
||||
},
|
||||
|
||||
//调用 screenChange + 设置全屏
|
||||
changeVideoScreen(event, ownerInstance) {
|
||||
var status = this.player.fullscreenService.getIsFullScreen();
|
||||
ownerInstance.callMethod("screenChange", {
|
||||
status: status,
|
||||
primary: status ? "portrait" : "landscape",
|
||||
});
|
||||
|
||||
if (status) {
|
||||
setTimeout(() => {
|
||||
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
|
||||
this.player.fullscreenService.cancelFullScreen();
|
||||
}, 100);
|
||||
} else {
|
||||
this.player.fullscreenService.requestFullScreen();
|
||||
setTimeout(() => {
|
||||
plus.screen.lockOrientation("landscape-primary");
|
||||
}, 100);
|
||||
}
|
||||
},
|
||||
|
||||
//调用 changeVideoData 切换播放源
|
||||
changeVideoData(event, ownerInstance) {
|
||||
ownerInstance.callMethod("changeVideoData");
|
||||
},
|
||||
//成功销毁
|
||||
handleSuccessDispose(event, ownerInstance) {
|
||||
ownerInstance.callMethod("dispose");
|
||||
},
|
||||
//销毁播放器
|
||||
receiveisDispose(newValue, oldValue, ownerVm, vm) {
|
||||
if (newValue) {
|
||||
if (this.player) {
|
||||
console.log('是否触发方法组件销毁', this.player)
|
||||
this.player.dispose();
|
||||
this.$refs.videoContent5.click()
|
||||
}
|
||||
}
|
||||
},
|
||||
//切换播放源
|
||||
async receiveIsChange(newValue) {
|
||||
if (this.isChange) {
|
||||
this.checkValue();
|
||||
}
|
||||
},
|
||||
|
||||
handleClick(event, ownerInstance) {}, //点击播放器
|
||||
|
||||
receiveFirstTime(newValue, oldValue, ownerVm, vm) {}, //播放时间
|
||||
|
||||
receiveisSetFirstTime(newValue, oldValue, ownerVm, vm) {}, //是否刚开始设置播放时间
|
||||
|
||||
receiveplatform(newValue) {}, //获取设备型号
|
||||
|
||||
receiveVideoList(newValue, oldValue, ownerVm, vm) {}, //获取视频列表
|
||||
|
||||
receiveVideoData(newValue, oldValue, ownerVm, vm) {}, //获取视频信息
|
||||
|
||||
receiveWinWidth(newValue, oldValue, ownerVm, vm) {}, //获取视频宽度
|
||||
|
||||
receiveWinHeight(newValue, oldValue, ownerVm, vm) {}, //获取视频高度
|
||||
|
||||
|
||||
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,44 @@
|
||||
.ad-container
|
||||
{
|
||||
display:none;
|
||||
position:absolute;
|
||||
left:50%;
|
||||
top:50%;
|
||||
margin-left:-150px;
|
||||
margin-top:-100px;
|
||||
}
|
||||
|
||||
.ad-container span
|
||||
{
|
||||
width: 27px;
|
||||
height: 16px;
|
||||
border-radius: 1px;
|
||||
background-color: rgba(0,0,0,.5);
|
||||
position: absolute;
|
||||
font-size: 10px;
|
||||
color: #fff;
|
||||
line-height: 16px;
|
||||
text-align: center;
|
||||
top:0px;
|
||||
left:0px;
|
||||
}
|
||||
|
||||
.ad-container .close
|
||||
{
|
||||
position:absolute;
|
||||
top:2px;
|
||||
right:2px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.ad-container .close:hover
|
||||
{
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.ad-container .ad
|
||||
{
|
||||
width:300px;
|
||||
height:200px;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import $ from 'jquery'
|
||||
// const html = require('./index.html');
|
||||
// require('https://g.alicdn.com/apsara-media-box/imp-web-player/2.20.3/skins/default/aliplayer-min.css');
|
||||
|
||||
// require('../aliplayer-min.js');
|
||||
// require('../aliplayercomponents.min.js');
|
||||
// require('../aliplayer-min.css');
|
||||
require('./index.css');
|
||||
|
||||
|
||||
/**
|
||||
* 静态广告组件
|
||||
*/
|
||||
const fullScreenButtonComponent = Aliplayer.Component({
|
||||
/**
|
||||
* 初始函数,在new对象时调用
|
||||
*
|
||||
* @param {string} adAddress - 广告视频地址
|
||||
* @param {string} toAddress - 广告链接地址
|
||||
*/
|
||||
init: function (adAddress, toAddress) {
|
||||
this.adAddress = adAddress;
|
||||
this.toAddress = toAddress;
|
||||
this.$html = $('.ad-container');
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建广告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 () {
|
||||
Aliplayer.util.stopPropagation();
|
||||
});
|
||||
this.$html.find('.close').click(function () {
|
||||
this.$html.hide();
|
||||
});
|
||||
$(el).append(this.$html);
|
||||
},
|
||||
ready: function (player, e) {
|
||||
},
|
||||
/**
|
||||
* 隐藏广告
|
||||
*/
|
||||
play: function (player, e) {
|
||||
this.$html.hide();
|
||||
},
|
||||
/**
|
||||
* 显示广告
|
||||
*/
|
||||
pause: function (player, e) {
|
||||
this.$html.show();
|
||||
},
|
||||
/**
|
||||
* 隐藏广告
|
||||
*/
|
||||
playing: function (player, e) {
|
||||
this.$html.hide();
|
||||
},
|
||||
waiting: function (player, e) {
|
||||
},
|
||||
timeupdate: function (player, e) {
|
||||
},
|
||||
error: function (player, e) {
|
||||
},
|
||||
/**
|
||||
* 显示广告
|
||||
*/
|
||||
ended: function (player, e) {
|
||||
this.$html.show();
|
||||
}
|
||||
});
|
||||
|
||||
export default fullScreenButtonComponent;
|
||||
1080
pages/component/commonComponents/video/video.vue
Normal file
1080
pages/component/commonComponents/video/video.vue
Normal file
File diff suppressed because it is too large
Load Diff
337
pages/component/commonComponents/video/videoDetail.vue
Normal file
337
pages/component/commonComponents/video/videoDetail.vue
Normal file
@@ -0,0 +1,337 @@
|
||||
<template>
|
||||
<view class="container commonPageBox commonDetailPage" style="position: relative;">
|
||||
|
||||
<video
|
||||
@fullscreenchange="fullscreenchange"
|
||||
@timeupdate="videoTimeUpdateEvent($event)"
|
||||
ref="videos"
|
||||
style="width: 100%; height: 100%"
|
||||
autoplay
|
||||
id="videoId"
|
||||
|
||||
object-fit="contain"
|
||||
class="video-box"
|
||||
:src="videoUrl"
|
||||
:poster="`${videoUrl}?x-oss-process=video/snapshot,t_${1},f_jpg`"
|
||||
@play="playVideo"
|
||||
>
|
||||
</video>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import courseDescription from "@/pages/component/commonComponents/list";
|
||||
import price from "../price/index.vue";
|
||||
|
||||
import $http from "@/config/requestConfig.js";
|
||||
import { mapState } from "vuex";
|
||||
export default {
|
||||
components: {
|
||||
courseDescription, //课程说明
|
||||
price, //课程价格
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
timer: null,
|
||||
videoUrl: "",
|
||||
currentTime: 0,
|
||||
firstTime: 0,
|
||||
|
||||
options: {},
|
||||
videoData: {},
|
||||
isSetFirstTime: false,
|
||||
currentVideoTime: "", //初始播放时长(秒)
|
||||
urlList: {
|
||||
detail: "sociology/course/getCourseCatalogueChapterDetail",
|
||||
curriculumInfo: "app/phone.do?getCourseInfo",
|
||||
},
|
||||
};
|
||||
},
|
||||
async onUnload() {
|
||||
this.timer = null;
|
||||
// #ifdef APP-PLUS
|
||||
uni.navigateTo({
|
||||
url: "/pages/curriculum/order/back",
|
||||
});
|
||||
|
||||
plus.screen.lockOrientation("portrait-primary"); //锁死屏幕方向为竖屏
|
||||
|
||||
// plus.screen.lockOrientation("portrait-primary");
|
||||
// #endif
|
||||
await this.setVideoTime();
|
||||
|
||||
// #ifdef APP-PLUS
|
||||
// plus.screen.lockOrientation("portrait-primary");
|
||||
// #endif
|
||||
},
|
||||
onLoad(options) {
|
||||
// #ifdef APP-PLUS
|
||||
plus.screen.lockOrientation("landscape-primary");
|
||||
// plus.screen.lockOrientation("portrait-primary");
|
||||
// #endif
|
||||
|
||||
this.options = JSON.parse(options.data);
|
||||
this.getLive();
|
||||
|
||||
this.timer = setInterval(() => {
|
||||
var that = this;
|
||||
if (this.currentTime) {
|
||||
that.setVideoTime();
|
||||
}
|
||||
}, 60000 * 10);
|
||||
},
|
||||
onHide() {
|
||||
// this.showSearchList = false
|
||||
// this.searchList = []
|
||||
},
|
||||
computed: {
|
||||
...mapState(["userInfo"]),
|
||||
},
|
||||
methods: {
|
||||
// 播放进度改变
|
||||
videoTimeUpdateEvent(e) {
|
||||
console.log("e at line 78:", e);
|
||||
this.playTime = parseInt(e.detail.currentTime);
|
||||
this.allTime = parseInt(e.detail.duration);
|
||||
console.log("视频播放时长", this.playTime, "视频总时长", this.allTime);
|
||||
|
||||
this.recordTime({
|
||||
time: this.playTime,
|
||||
});
|
||||
},
|
||||
|
||||
recordTime(data) {
|
||||
this.currentTime = data.time;
|
||||
console.log("data at line 54:", data);
|
||||
var list = [];
|
||||
if (uni.getStorageSync("videoList")) {
|
||||
list = JSON.parse(uni.getStorageSync("videoList"));
|
||||
}
|
||||
|
||||
console.log("点击后设置播放时长的方法list at line 65:", list);
|
||||
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("videoList", JSON.stringify(list));
|
||||
|
||||
console.log(list, "走接口的方法参数");
|
||||
},
|
||||
//是否全屏
|
||||
fullscreenchange(e) {
|
||||
if (!e.target.fullScreen) {
|
||||
uni.navigateBack({
|
||||
delta: 1,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
getData(data) {
|
||||
if (!this.isSetFirstTime) {
|
||||
var netWork = this.videoData.userCourseVideoPositionEntity
|
||||
? this.videoData.userCourseVideoPositionEntity.position
|
||||
: 0;
|
||||
var list = [];
|
||||
if (uni.getStorageSync("videoList")) {
|
||||
list = JSON.parse(uni.getStorageSync("videoList"));
|
||||
}
|
||||
console.log("这是获取接口 设置的起始时长", netWork);
|
||||
var index = list.findIndex((e) => e.id == this.videoData.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;
|
||||
}
|
||||
}
|
||||
|
||||
uni.setStorageSync("videoList", JSON.stringify(list));
|
||||
this.playVideo();
|
||||
this.isSetFirstTime = true;
|
||||
}
|
||||
},
|
||||
setVideoTime(time) {
|
||||
var data = {
|
||||
videoId: this.videoData.id,
|
||||
position: this.currentTime, //秒数
|
||||
};
|
||||
console.log("data at line =存储视频时长接口:", data);
|
||||
$http
|
||||
.request({
|
||||
// url: "book/buyOrder/buySave",
|
||||
url: `sociology/course/saveCoursePosition`,
|
||||
method: "Post", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||||
data,
|
||||
header: {
|
||||
//默认 无 说明:请求头
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
console.log("res at line 185:", res);
|
||||
// console.log("data at line 5911111:", this.videoData);
|
||||
this.$forceUpdate();
|
||||
});
|
||||
},
|
||||
playVideo(e) {
|
||||
this.videoContext = uni.createVideoContext("videoId", this);
|
||||
|
||||
this.videoContext.seek(this.firstTime);
|
||||
this.videoContext.requestFullScreen();
|
||||
},
|
||||
async getLive() {
|
||||
var data = {
|
||||
...this.options,
|
||||
};
|
||||
console.log("data at line 57:", data);
|
||||
$http
|
||||
.request({
|
||||
// url: "book/buyOrder/buySave",
|
||||
url: `sociology/course/checkVideo`,
|
||||
method: "Post", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||||
data,
|
||||
header: {
|
||||
//默认 无 说明:请求头
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
console.log("res at line 252:", res);
|
||||
this.videoData = res.video;
|
||||
this.videoUrl =
|
||||
// "https://ehh-private-01.oss-cn-beijing.aliyuncs.com/video/taiHuClass/" +
|
||||
res.video.videoUrl;
|
||||
|
||||
this.$nextTick(async () => {
|
||||
await this.getData();
|
||||
});
|
||||
// var playAuth = res.video.playAuth.replace(/=/g, "");
|
||||
// this.videoData = {
|
||||
// ...res.video,
|
||||
// videoId: res.video.video,
|
||||
// playAuth: playAuth,
|
||||
// };
|
||||
// this.playAuth = playAuth;
|
||||
|
||||
console.log("data at line 5911111:", this.videoData);
|
||||
this.$forceUpdate();
|
||||
});
|
||||
},
|
||||
openVideo(data) {
|
||||
console.log("data at line 380:", data.type);
|
||||
|
||||
var mynavData = JSON.stringify(data); // 这里转换成 字符串
|
||||
if (data.type == 0) {
|
||||
//视频云点播
|
||||
uni.navigateTo({
|
||||
url: `/pages/curriculum/order/videoDetail?data=${mynavData}`,
|
||||
});
|
||||
} else if (data.type == 1) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/curriculum/order/videoDetailOss?data=${mynavData}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
hancleModalCancel() {
|
||||
this.show = false;
|
||||
},
|
||||
handleClickMore(v, i, status) {
|
||||
console.log("i at line 357:", i);
|
||||
this.$set(this.correlationiList[i], "isOpen", status);
|
||||
// [i].=!this.correlationiList[i].isOpen;
|
||||
},
|
||||
hancleModalConfirm() {
|
||||
var data = {
|
||||
values: {
|
||||
customerType: "D",
|
||||
token: uni.getStorageSync("token"),
|
||||
customerOid: uni.getStorageSync("customerOid"),
|
||||
...this.taiHuClassInfo,
|
||||
},
|
||||
};
|
||||
// $mars.progressBegin('申请中...');
|
||||
// $mars.post(customerType, 'applyRelearn', data, function (ret) {
|
||||
// api.hideProgress();
|
||||
|
||||
// fnLoadDataGrid();
|
||||
// });
|
||||
},
|
||||
|
||||
// 检查是有权限使用搜索功能
|
||||
checkDisable() {
|
||||
console.log("点击了");
|
||||
},
|
||||
// 显示无权限弹窗
|
||||
// showNoRights() {
|
||||
// let that = this
|
||||
// uni.showModal({
|
||||
// content: "",
|
||||
// confirmText: '好的',
|
||||
// showCancel: false,
|
||||
// success: function(res) {
|
||||
// if (res.confirm) {
|
||||
// // console.log('用户点击确定');
|
||||
// that.clear()
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
// },
|
||||
|
||||
// 放大图片
|
||||
previewImage(url) {
|
||||
console.log(url);
|
||||
uni.previewImage({
|
||||
urls: [url],
|
||||
longPressActions: {
|
||||
itemList: ["很抱歉,暂不支持保存图片到本地"],
|
||||
success: function (res) {
|
||||
// console.log(res,'+++++')
|
||||
},
|
||||
},
|
||||
});
|
||||
},
|
||||
},
|
||||
onBackPress() {
|
||||
// #ifdef APP-PLUS
|
||||
plus.key.hideSoftKeybord();
|
||||
// #endif
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
|
||||
|
||||
|
||||
.video-box{
|
||||
position: relative;
|
||||
}
|
||||
.image_box{
|
||||
background-color: red;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user