video
This commit is contained in:
@@ -1,772 +0,0 @@
|
||||
<template>
|
||||
<div class="prism-player" :id="playerId" :style="playStyle"></div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Aliplayer",
|
||||
props: {
|
||||
source: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//媒体转码服务的媒体Id。
|
||||
vid: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//播放权证
|
||||
playauth: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//容器的大小
|
||||
height: {
|
||||
type: String,
|
||||
default: "460px"
|
||||
},
|
||||
//容器的大小
|
||||
width: {
|
||||
type: String,
|
||||
default: "100%"
|
||||
},
|
||||
//视频的高度大小
|
||||
videoWidth: {
|
||||
type: String,
|
||||
default: "100%"
|
||||
},
|
||||
//视频的宽度大小
|
||||
videoHeight: {
|
||||
type: String,
|
||||
default: "460px"
|
||||
},
|
||||
//播放器自动加载,目前仅h5可用
|
||||
preload: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//播放器默认封面图片,请填写正确的图片url地址。需要autoplay为’false’时,才生效
|
||||
cover: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//播放内容是否为直播,直播时会禁止用户拖动进度条。
|
||||
isLive: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//播放器是否自动播放,在移动端autoplay属性会失效。
|
||||
autoplay: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//播放器自动循环播放。
|
||||
rePlay: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//指定使用H5播放器。
|
||||
useH5Prism: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//指定使用Flash播放器。
|
||||
useFlashPrism: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//H5是否内置播放,有的Android浏览器不起作用。
|
||||
playsinline: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
//显示播放时缓冲图标,默认true。
|
||||
showBuffer: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
//URL 皮肤图片,不建议随意修改该字段,如要修改,请参照皮肤定制。
|
||||
skinRes: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
//进度条
|
||||
skinLayout: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return [{
|
||||
"name": "bigPlayButton",
|
||||
"align": "cc",
|
||||
"x": 30,
|
||||
"y": 80
|
||||
},
|
||||
{
|
||||
"name": "errorDisplay",
|
||||
"align": "tlabs",
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"name": "infoDisplay"
|
||||
},
|
||||
{
|
||||
"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": 10
|
||||
},
|
||||
{
|
||||
"name": "volume", //音量
|
||||
"align": "tr",
|
||||
"x": 5,
|
||||
"y": 10
|
||||
}
|
||||
]
|
||||
}]
|
||||
}
|
||||
},
|
||||
//默认为‘hover’。可选的值为:‘click’、‘hover’、‘always’。
|
||||
controlBarVisibility: {
|
||||
type: String,
|
||||
default: "hover"
|
||||
},
|
||||
//控制栏自动隐藏时间(ms)
|
||||
showBarTime: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/***
|
||||
* JSON串用于定制性接口参数,目前支持:
|
||||
1.“fullTitle”:“测试页面”
|
||||
全屏时显示视频标题(仅flash支持)。
|
||||
2. “m3u8BufferLength”:“30”
|
||||
播放m3u8时加载缓存ts文件长度单位(秒)(仅flash支持)。
|
||||
3. “liveStartTime”:“2016/08/17 12:00:00”
|
||||
直播开始时间,用于提示直播未开始(仅flash支持)。
|
||||
4. “liveOverTime”:“2016/08/17 14:00:00”
|
||||
直播结束时间,用于提示直播结束(仅flash支持)。
|
||||
*/
|
||||
extraInfo: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
|
||||
/**
|
||||
*是否允许系统右键菜单显示,默认为false。
|
||||
*/
|
||||
enableSystemMenu: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
|
||||
/***
|
||||
*
|
||||
*指定播放地址格式,只有使用vid的播放方式时支持
|
||||
可选值为’mp4’、’m3u8’、’flv’、’mp3’,默认为空,仅H5支持。
|
||||
* */
|
||||
format: {
|
||||
type: String,
|
||||
default: "m3u8"
|
||||
},
|
||||
/***
|
||||
*
|
||||
* 指定返回音频还是视频,只有使用vid的播放方式时支持。
|
||||
可选值为’video’和’audio’,默认为’video’
|
||||
‘audio’主要是针对只包含音频的视频格式,比如音频的mp4,仅H5支持。
|
||||
* */
|
||||
mediaType: {
|
||||
type: String,
|
||||
default: "video"
|
||||
},
|
||||
/***
|
||||
* 指定排序方式,只有使用vid + plauth播放方式时支持。
|
||||
‘desc’表示按倒序排序(即:从大到小排序)
|
||||
‘asc’表示按正序排序(即:从小到大排序)
|
||||
默认值:‘asc’,仅H5支持。
|
||||
* */
|
||||
qualitySort: {
|
||||
type: String,
|
||||
default: "asc"
|
||||
},
|
||||
/***
|
||||
* 显示视频清晰度,多个用逗号分隔,比如:’FD,LD’,此值是vid对应流清晰度的一个子集,
|
||||
取值范围:FD(流畅)LD(标清)SD(高清)HD(超清)OD(原画)2K(2K)4K(4K),仅H5支持。
|
||||
* */
|
||||
definition: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* 默认视频清晰度,此值是vid对应流的一个清晰度,
|
||||
取值范围:FD(流畅)LD(标清)SD(高清)HD(超清)OD(原画)2K(2K)4K(4K),仅H5支持。
|
||||
* */
|
||||
defaultDefinition: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* 声明启用同层H5播放器,启用时设置的值为‘h5’
|
||||
* */
|
||||
x5_type: {
|
||||
type: String,
|
||||
default: "h5"
|
||||
},
|
||||
/**
|
||||
* 声明视频播放时是否进入到TBS的全屏模式,默认为false。
|
||||
当需要把视频做为背景时,设置为true
|
||||
* */
|
||||
x5_fullscreen: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* 声明视频播在界面上的位置,默认为“center”。
|
||||
可选值为:“top”,“center”
|
||||
* */
|
||||
x5_video_position: {
|
||||
type: String,
|
||||
default: "center"
|
||||
},
|
||||
/**
|
||||
* 声明 TBS 播放器支持的方向,可选值:
|
||||
landscape:横屏)
|
||||
portraint:竖屏
|
||||
landscape
|
||||
* */
|
||||
x5_orientation: {
|
||||
type: String,
|
||||
default: "portraint"
|
||||
},
|
||||
/**
|
||||
* 声明TBS全屏播放是否横屏,默认值为true。
|
||||
* */
|
||||
x5LandscapeAsFullScreen: {
|
||||
type: String,
|
||||
default: "true"
|
||||
},
|
||||
/**
|
||||
* 延迟播放时间,单位为秒。
|
||||
* */
|
||||
autoPlayDelay: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
/**
|
||||
* 延迟播放提示文本
|
||||
* */
|
||||
autoPlayDelayDisplayText: {
|
||||
type: String,
|
||||
default: "正在转码,请稍后......"
|
||||
},
|
||||
/**
|
||||
* 国际化,默认为‘zh-cn’。
|
||||
如果未设置,则采用浏览器语言。
|
||||
可选值为‘zh-cn’、‘en-us’或其它值。
|
||||
* */
|
||||
language: {
|
||||
type: String,
|
||||
default: "zh-cn"
|
||||
},
|
||||
/**
|
||||
* 自定义国际化文本json结构,key的值需要和language属性值对应起来。
|
||||
例子:{jp:{Play:”Play”}}
|
||||
* */
|
||||
languageTexts: {
|
||||
type: Object,
|
||||
default: function () {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* flash启用截图功能
|
||||
* */
|
||||
snapshot: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* H5设置截图水印。
|
||||
* */
|
||||
snapshotWatermark: {
|
||||
type: Object,
|
||||
default: function () {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Safari浏览器可以启用Hls插件播放,Safari 11除外。
|
||||
* */
|
||||
useHlsPluginForSafari: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* H5播放flv时,设置是否启用播放缓存,只在直播下起作用。
|
||||
* */
|
||||
enableStashBufferForFlv: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* H5播放flv时,初始缓存大小,只在直播下起作用。
|
||||
* */
|
||||
stashInitialSizeForFlv: {
|
||||
type: Number,
|
||||
default: 10
|
||||
},
|
||||
/**
|
||||
* 缓冲多长时间后,提示用户切换低清晰度,默认:20秒。
|
||||
* */
|
||||
loadDataTimeout: {
|
||||
type: Number,
|
||||
default: 20
|
||||
},
|
||||
/**
|
||||
*最大缓冲超时时间,超过这个时间会有错误提示,默认:60秒。
|
||||
* */
|
||||
waitingTimeout: {
|
||||
type: Number,
|
||||
default: 60
|
||||
},
|
||||
/**
|
||||
* 直播开始时间,直播时移功能使用,格式为:“2018/01/04 12:00:00”。
|
||||
* */
|
||||
liveStartTime: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* 直播结束时间,直播时移功能使用,格式为:“2018/01/04 12:00:00”。
|
||||
* */
|
||||
liveOverTime: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* 直播可用时移查询地址,详情参见直播时移。
|
||||
* https://help.aliyun.com/document_detail/65129.html?spm=a2c4g.11186623.2.28.3603bf80LR74sS
|
||||
* */
|
||||
liveTimeShiftUrl: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
/**
|
||||
* flv直播和hls时移切换是,重新创建播放器方法,详情参见直播时移。
|
||||
* https://help.aliyun.com/document_detail/65129.html?spm=a2c4g.11186623.2.28.3603bf80LR74sS
|
||||
* */
|
||||
recreatePlayer: {
|
||||
type: Function,
|
||||
default: function () {
|
||||
}
|
||||
},
|
||||
/**
|
||||
*是否显示检测按钮,默认为true。
|
||||
* */
|
||||
diagnosisButtonVisible: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
/**
|
||||
* 禁用进度条的Seek,默认为false,仅Flash支持。
|
||||
* */
|
||||
disableSeek: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* 加密类型,播放点播私有加密视频时,设置值为1,默认值为0。
|
||||
* */
|
||||
encryptType: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
/**
|
||||
* 进度条打点内容数组,详情参见进度条打点。
|
||||
* [
|
||||
{offset:0,text:'阿里视频云端到云到端服务的重要一环'},
|
||||
{offset:10,text:'除了支持点播和直播的基础播放功能外'},
|
||||
{offset:20,text:'深度融合视频云业务'},
|
||||
{offset:30,text:'为用户提供简单、快速、安全、稳定的视频播放服务'},
|
||||
{offset:40,text:'安装播放器Demo进行体验'},
|
||||
{offset:50,text:'开发人员请点击SDK下载'}
|
||||
]
|
||||
* https://yq.aliyun.com/articles/686043?spm=a2c4g.11186623.2.31.3603bf80LR74sS
|
||||
* */
|
||||
progressMarkers: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 点播失败重试次数,默认3次
|
||||
* */
|
||||
vodRetry: {
|
||||
type: Number,
|
||||
default: 3
|
||||
},
|
||||
/**
|
||||
* 直播播放失败重试次数,默认5次
|
||||
* */
|
||||
liveRetry: {
|
||||
type: Number,
|
||||
default: 5
|
||||
},
|
||||
|
||||
playStyle: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
aliplayerSdkPath: {
|
||||
// Aliplayer 代码的路径
|
||||
type: String,
|
||||
default: "https://g.alicdn.com/de/prismplayer/2.9.3/aliplayer-min.js"
|
||||
},
|
||||
|
||||
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
playerId: "aliplayer_" + Math.random().toString(36).substr(2),
|
||||
scriptTagStatus: 0,
|
||||
isReload: false,
|
||||
instance: null
|
||||
};
|
||||
},
|
||||
created() {
|
||||
if (window.Aliplayer !== undefined) {
|
||||
// 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
|
||||
this.scriptTagStatus = 2;
|
||||
this.initAliplayer();
|
||||
} else {
|
||||
// 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
|
||||
this.insertScriptTag();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (window.Aliplayer !== undefined) {
|
||||
// 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
|
||||
this.scriptTagStatus = 2;
|
||||
this.initAliplayer();
|
||||
} else {
|
||||
// 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
|
||||
this.insertScriptTag();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
insertScriptTag() {
|
||||
const _this = this;
|
||||
let playerScriptTag = document.getElementById("playerScriptTag");
|
||||
// 如果这个tag不存在,则生成相关代码tag以加载代码
|
||||
if (playerScriptTag === null) {
|
||||
playerScriptTag = document.createElement("script");
|
||||
playerScriptTag.type = "text/javascript";
|
||||
playerScriptTag.src = this.aliplayerSdkPath;
|
||||
playerScriptTag.id = "playerScriptTag";
|
||||
let s = document.getElementsByTagName("head")[0];
|
||||
s.appendChild(playerScriptTag);
|
||||
}
|
||||
if (playerScriptTag.loaded) {
|
||||
_this.scriptTagStatus++;
|
||||
} else {
|
||||
playerScriptTag.addEventListener("load", () => {
|
||||
_this.scriptTagStatus++;
|
||||
playerScriptTag.loaded = true;
|
||||
_this.initAliplayer();
|
||||
});
|
||||
}
|
||||
_this.initAliplayer();
|
||||
},
|
||||
initAliplayer() {
|
||||
const _this = this;
|
||||
// scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
|
||||
if (
|
||||
_this.scriptTagStatus === 2 &&
|
||||
(_this.instance === null || _this.reloadPlayer)
|
||||
) {
|
||||
_this.instance && _this.instance.dispose();
|
||||
|
||||
document.querySelector("#" + _this.playerId).innerHTML = "";
|
||||
|
||||
// Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
|
||||
// 所以,我们只能在 nextTick 里面初始化 Aliplayer
|
||||
_this.$nextTick(() => {
|
||||
_this.instance = window.Aliplayer({
|
||||
id: _this.playerId,
|
||||
source: _this.source,
|
||||
vid: _this.vid,
|
||||
playauth: _this.playauth,
|
||||
width: _this.width,
|
||||
height: _this.height,
|
||||
videoWidth: _this.videoWidth,
|
||||
videoHeight: _this.videoHeight,
|
||||
preload: _this.preload,
|
||||
cover: _this.cover,
|
||||
isLive: _this.isLive,
|
||||
autoplay: _this.autoplay,
|
||||
rePlay: _this.rePlay,
|
||||
useH5Prism: _this.useH5Prism,
|
||||
useFlashPrism: _this.useFlashPrism,
|
||||
playsinline: _this.playsinline,
|
||||
showBuffer: _this.showBuffer,
|
||||
skinRes: _this.skinRes,
|
||||
skinLayout: _this.skinLayout,
|
||||
controlBarVisibility: _this.controlBarVisibility,
|
||||
showBarTime: _this.showBarTime,
|
||||
extraInfo: _this.extraInfo,
|
||||
enableSystemMenu: _this.enableSystemMenu,
|
||||
format: _this.format,
|
||||
mediaType: _this.mediaType,
|
||||
qualitySort: _this.qualitySort,
|
||||
definition: _this.definition,
|
||||
defaultDefinition: _this.defaultDefinition,
|
||||
x5_type: _this.x5_type,
|
||||
x5_fullscreen: _this.x5_fullscreen,
|
||||
x5_video_position: _this.x5_video_position,
|
||||
x5_orientation: _this.x5_orientation,
|
||||
x5LandscapeAsFullScreen: _this.x5LandscapeAsFullScreen,
|
||||
autoPlayDelay: _this.autoPlayDelay,
|
||||
autoPlayDelayDisplayText: _this.autoPlayDelayDisplayText,
|
||||
language: _this.language,
|
||||
languageTexts: _this.languageTexts,
|
||||
snapshot: _this.snapshot,
|
||||
snapshotWatermark: _this.snapshotWatermark,
|
||||
useHlsPluginForSafari: _this.useHlsPluginForSafari,
|
||||
enableStashBufferForFlv: _this.enableStashBufferForFlv,
|
||||
stashInitialSizeForFlv: _this.stashInitialSizeForFlv,
|
||||
loadDataTimeout: _this.loadDataTimeout,
|
||||
waitingTimeout: _this.waitingTimeout,
|
||||
liveStartTime: _this.liveStartTime,
|
||||
liveTimeShiftUrl: _this.liveTimeShiftUrl,
|
||||
liveShiftSource: _this.liveShiftSource,
|
||||
recreatePlayer: _this.recreatePlayer,
|
||||
diagnosisButtonVisible: _this.diagnosisButtonVisible,
|
||||
disableSeek: _this.disableSeek,
|
||||
encryptType: _this.encryptType,
|
||||
progressMarkers: _this.progressMarkers,
|
||||
vodRetry: _this.vodRetry,
|
||||
liveRetry: _this.liveRetry,
|
||||
});
|
||||
|
||||
// 绑定事件,当 AliPlayer 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
|
||||
_this.instance.on("ready", () => {
|
||||
this.$emit("ready", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("play", () => {
|
||||
this.$emit("play", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("pause", () => {
|
||||
this.$emit("pause", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("ended", () => {
|
||||
this.$emit("ended", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("liveStreamStop", () => {
|
||||
this.$emit("liveStreamStop", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("m3u8Retry", () => {
|
||||
this.$emit("m3u8Retry", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("hideBar", () => {
|
||||
this.$emit("hideBar", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("waiting", () => {
|
||||
this.$emit("waiting", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("snapshoted", () => {
|
||||
this.$emit("snapshoted", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("timeupdate", () => {
|
||||
this.$emit("timeupdate", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("requestFullScreen", () => {
|
||||
this.$emit("requestFullScreen", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("cancelFullScreen", () => {
|
||||
this.$emit("cancelFullScreen", _this.instance);
|
||||
});
|
||||
|
||||
_this.instance.on("error", () => {
|
||||
this.$emit("error", _this.instance);
|
||||
});
|
||||
let start = true;
|
||||
let startProgress = 0;
|
||||
let endProgress = 0;
|
||||
//禁止拖动进度条
|
||||
_this.instance.on("startSeek", (e) => {
|
||||
if (start) {
|
||||
start = false;
|
||||
startProgress = _this.instance.getCurrentTime();
|
||||
}
|
||||
_this.instance.pause();
|
||||
// this.$emit("startSeek", _this.instance);
|
||||
});
|
||||
|
||||
//禁止拖动进度条
|
||||
_this.instance.on("completeSeek", () => {
|
||||
start = true;
|
||||
endProgress = _this.instance.getCurrentTime();
|
||||
if (endProgress < startProgress) {
|
||||
_this.instance.seek(endProgress);
|
||||
} else {
|
||||
_this.instance.seek(startProgress);
|
||||
}
|
||||
_this.instance.play();
|
||||
// this.$emit("completeSeek", _this.instance);
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 播放视频
|
||||
*/
|
||||
play: function () {
|
||||
this.instance.play();
|
||||
},
|
||||
/**
|
||||
* 暂停视频
|
||||
*/
|
||||
pause: function () {
|
||||
this.instance.pause();
|
||||
},
|
||||
/**
|
||||
* 重播视频
|
||||
*/
|
||||
replay: function () {
|
||||
this.instance.replay();
|
||||
},
|
||||
/**
|
||||
* 跳转到某个时刻进行播放
|
||||
* @argument time 的单位为秒
|
||||
*/
|
||||
seek: function (time) {
|
||||
this.instance.seek(time);
|
||||
},
|
||||
/**
|
||||
* 获取当前时间 单位秒
|
||||
*/
|
||||
getCurrentTime: function () {
|
||||
return this.instance.getCurrentTime();
|
||||
},
|
||||
/**
|
||||
*获取视频总时长,返回的单位为秒
|
||||
* @returns 返回的单位为秒
|
||||
*/
|
||||
getDuration: function () {
|
||||
return this.instance.getDuration();
|
||||
},
|
||||
/**
|
||||
获取当前的音量,返回值为0-1的实数ios和部分android会失效
|
||||
*/
|
||||
getVolume: function () {
|
||||
return this.instance.getVolume();
|
||||
},
|
||||
/**
|
||||
设置音量,vol为0-1的实数,ios和部分android会失效
|
||||
*/
|
||||
setVolume: function (vol) {
|
||||
this.instance.setVolume(vol);
|
||||
},
|
||||
/**
|
||||
*直接播放视频url,time为可选值(单位秒)目前只支持同种格式(mp4/flv/m3u8)之间切换暂不支持直播rtmp流切换
|
||||
*@argument url 视频地址
|
||||
*@argument time 跳转到多少秒
|
||||
*/
|
||||
loadByUrl: function (url, time) {
|
||||
this.instance.loadByUrl(url, time);
|
||||
},
|
||||
/**
|
||||
* 设置播放速度
|
||||
*@argument speed 速度
|
||||
*/
|
||||
setSpeed: function (speed) {
|
||||
this.instance.setSpeed(speed);
|
||||
},
|
||||
/**
|
||||
* 设置播放器大小w,h可分别为400px像素或60%百分比chrome浏览器下flash播放器分别不能小于397x297
|
||||
*@argument w 播放器宽度
|
||||
*@argument h 播放器高度
|
||||
*/
|
||||
setPlayerSize: function (w, h) {
|
||||
this.instance.setPlayerSize(w, h);
|
||||
},
|
||||
/**
|
||||
*目前只支持H5播放器。
|
||||
暂不支持不同格式视频间的之间切换。
|
||||
暂不支持直播rtmp流切换。
|
||||
*/
|
||||
replayByVidAndPlayAuth: function (vid, accId, accSecret, stsToken, authInfo, domainRegion) {
|
||||
this.instance.replayByVidAndPlayAuth(vid, accId, accSecret, stsToken, authInfo, domainRegion);
|
||||
},
|
||||
|
||||
/***
|
||||
* 重新设置vid和权限,目前只支持H5播放器。
|
||||
暂不支持不同格式视频间的之间切换。
|
||||
暂不支持直播rtmp流切换。
|
||||
* @param vid 视频ID
|
||||
* @param playauth 播放权限
|
||||
*/
|
||||
replayByVidAndAuthInfo: function (vid, playauth) {
|
||||
this.instance.replayByVidAndAuthInfo(vid, playauth);
|
||||
},
|
||||
|
||||
/**
|
||||
* 目前只支持HTML5界面上的重载功能,暂不支持直播rtmp流切换m3u8)之间切换,暂不支持直播rtmp流切换
|
||||
*@argument vid 视频id
|
||||
*@argument playauth 播放凭证
|
||||
*/
|
||||
reloaduserPlayInfoAndVidRequestMts: function (vid, playauth) {
|
||||
this.instance.reloaduserPlayInfoAndVidRequestMts(vid, playauth);
|
||||
},
|
||||
|
||||
/***
|
||||
*设置截图参数
|
||||
* @param width 宽度
|
||||
* @param height 高度
|
||||
* @param rate 截图质量
|
||||
*/
|
||||
setSanpshotProperties: function (width, height, rate) {
|
||||
this.instance.setSanpshotProperties(width, height, rate);
|
||||
},
|
||||
/**
|
||||
* 设置封面地址
|
||||
* @param cover 封面地址
|
||||
*/
|
||||
setCover: function (cover) {
|
||||
this.instance.setCover(cover);
|
||||
},
|
||||
|
||||
|
||||
reloadPlayer: function () {
|
||||
this.isReload = true;
|
||||
this.initAliplayer();
|
||||
this.isReload = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@import url(https://g.alicdn.com/de/prismplayer/2.9.3/skins/default/aliplayer-min.css);
|
||||
</style>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -629,8 +629,8 @@ setTimeout(()=>{
|
||||
|
||||
const s_tag = document.createElement('script'); // 引入播放器js
|
||||
s_tag.type = 'text/javascript';
|
||||
// s_tag.src = 'https://g.alicdn.com/de/prismplayer/2.9.3/aliplayer-min.js';
|
||||
s_tag.src = 'https://g.alicdn.com/apsara-media-box/imp-web-player/2.16.3/aliplayer-min.js';
|
||||
s_tag.src = 'https://g.alicdn.com/de/prismplayer/2.9.3/aliplayer-min.js';
|
||||
// s_tag.src = 'https://g.alicdn.com/apsara-media-box/imp-web-player/2.16.3/aliplayer-min.js';
|
||||
// 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 = () => {
|
||||
|
||||
@@ -813,8 +813,7 @@ export default {
|
||||
if (this.videoData.type == 1) {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
source:"https://video.taihumed.com/d0c8e6d23e5f71ef81714531858c0102/c27e8334925a485bb7d57b46463f24ab-75b0e05b7a76efaff190b6417b2168a7-sd-nbv1-encrypt-stream.m3u8",
|
||||
"playauth": this.videoData.playAuth, // 必选参数,参数值可通过调用GetVideoPlayAuth接口获取。
|
||||
"playauth": this.videoData.playAuth, // 必选参数,参数值可通过调用GetVideoPlayAuth接口获取。
|
||||
"encryptType": 1, // 必选参数,当播放私有加密流时需要设置本参数值为1。其它情况无需设置。
|
||||
"playConfig": {
|
||||
"EncryptType": 'AliyunVoDEncryption'
|
||||
|
||||
1381
pages/component/commonComponents/video/index.nvue
Normal file
1381
pages/component/commonComponents/video/index.nvue
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<view class="container" style="background-color: #fff; position: relative">
|
||||
<view class="container" style="background-color: #000; position: relative">
|
||||
<!-- <u-icon
|
||||
@click="goBack"
|
||||
name="arrow-left"
|
||||
@@ -9,29 +9,78 @@
|
||||
statusBarHeight + 2
|
||||
}px; left: ${10}px;z-index: 999;`"
|
||||
></u-icon>-->
|
||||
|
||||
<view style="width: 100%">
|
||||
|
||||
<common-list-aliyun
|
||||
v-if="isSetFirstTime && videoData.playAuth"
|
||||
:encryptType="1"
|
||||
:vid="videoData.video"
|
||||
:playauth="videoData.playAuth"
|
||||
ref="player"
|
||||
:useFlashPrism="false"
|
||||
:autoplay="true"
|
||||
:isLive="false"
|
||||
:showBuffer="true"
|
||||
:cover="cover"
|
||||
:showBarTime="true"
|
||||
:disableSeek="true"
|
||||
showBarTime="500"
|
||||
|
||||
controlBarVisibility="always"
|
||||
<!-- <zhimi_aliplayer_view
|
||||
ref="playerView"
|
||||
style="width: 100%; height: 300px"
|
||||
></zhimi_aliplayer_view>
|
||||
<button type="primary" @click="start()">开始</button>
|
||||
<button type="primary" @click="pause()">暂停</button> -->
|
||||
<view style="width: 100%; height: 200px">
|
||||
<div
|
||||
class=""
|
||||
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"
|
||||
:change:winWidth="renderScript.receiveWinWidth"
|
||||
:change:winHeight="renderScript.receiveWinHeight"
|
||||
:change:firstTime="renderScript.receiveFirstTime"
|
||||
: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">
|
||||
直接调用renderjs中的emitData的方法,传递当前播放时长
|
||||
</div>
|
||||
|
||||
<div @tap="renderScript.endEmitData" ref="videoContent2" v-show="false">
|
||||
监听结束方法,记录播放时长
|
||||
</div>
|
||||
|
||||
<div
|
||||
@tap="renderScript.changeVideoData"
|
||||
ref="videoContent3"
|
||||
v-show="false"
|
||||
>
|
||||
</common-list-aliyun>
|
||||
|
||||
监听切换视频方法
|
||||
</div>
|
||||
<div @tap="renderScript.emitSetData" ref="videoContent4" v-show="false">
|
||||
监听切换视频方法
|
||||
</div>
|
||||
<div class="fullScreenButton-container">
|
||||
<div
|
||||
:class="`prism-fullscreen-btn ${isFullScreen ? 'fullscreen' : ''}`"
|
||||
@tap="renderScript.changeVideoScreen"
|
||||
></div>
|
||||
</div>
|
||||
</view>
|
||||
<!-- <view style="width: 100%; height: 200px; position: relative" v-else>
|
||||
<video
|
||||
@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> -->
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
@@ -105,9 +154,44 @@ export default {
|
||||
},
|
||||
|
||||
//第一次加载
|
||||
onLoad(options) {},
|
||||
onLoad(options) {
|
||||
// console.log(options, "这是传参");
|
||||
// // #ifdef APP-PLUS
|
||||
// setTimeout(() => {
|
||||
// plus.screen.unlockOrientation();
|
||||
// plus.screen.lockOrientation("landscape-primary");
|
||||
// }, 10);
|
||||
// // #endif
|
||||
// // #ifdef APP-PLUS
|
||||
// // plus.screen.lockOrientation("portrait-primary");
|
||||
// // #endif
|
||||
// if (uni.getStorageSync("videoOssList")) {
|
||||
// this.videoList = JSON.parse(uni.getStorageSync("videoOssList"));
|
||||
// }
|
||||
// console.log("this.videoList at line 53:", this.videoList);
|
||||
// this.options = JSON.parse(options.data);
|
||||
// this.videoId = this.options.video;
|
||||
// this.timer = setInterval(() => {
|
||||
// var that = this;
|
||||
// if (this.currentTime) {
|
||||
// that.setVideoTime();
|
||||
// }
|
||||
// }, 2000);
|
||||
// this.$emit("child-event", this.timer);
|
||||
// // this.$once("hook:beforeDestroy", () => {
|
||||
// // clearInterval(this.timer);
|
||||
// // });
|
||||
},
|
||||
|
||||
methods: {
|
||||
start() {
|
||||
// var playerView = this.$refs.playerView;
|
||||
this.$refs.playerView.start();
|
||||
},
|
||||
pause() {
|
||||
// var playerView = ;
|
||||
this.$refs.playerView.pause();
|
||||
},
|
||||
changeVideoData() {
|
||||
this.isChange = false;
|
||||
},
|
||||
@@ -166,9 +250,70 @@ export default {
|
||||
this.videoId = this.options.video;
|
||||
console.log("这是苹果视屏id", this.videoId);
|
||||
await this.getLive(isChange);
|
||||
// await this.getVideo(isChange);
|
||||
// this.$emit("child-event", this.timer);
|
||||
},
|
||||
async getVideo() {
|
||||
var data = {};
|
||||
var that=this;
|
||||
$http
|
||||
.request({
|
||||
url: `sociology/course/ttt`,
|
||||
method: "Post", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||||
data,
|
||||
header: {
|
||||
//默认 无 说明:请求头
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then(async (res) => {
|
||||
console.log(" 视频播放11111111111:", res);
|
||||
|
||||
var credentials = res.result.credentials;
|
||||
// var playerView = this.$refs.playerView;
|
||||
// console.log('playerView at line 273:', playerView)
|
||||
/*
|
||||
STS加密播放
|
||||
|
||||
*/
|
||||
that.$refs.playerView.setVidSts({
|
||||
vid: this.videoData.video,
|
||||
accessKeyId: credentials.accessKeyId,
|
||||
securityToken: credentials.securityToken,
|
||||
accessKeySecret: credentials.accessKeySecret,
|
||||
expireTime: credentials.expireTime,
|
||||
Region: "cn-shanghai",
|
||||
});
|
||||
// playerView.setLocalSource({
|
||||
// uri: "http://duoduovideo.oss-cn-beijing.aliyuncs.com/5f093c6fb6e90.mp4",
|
||||
// });
|
||||
|
||||
let isFullScreen = true;
|
||||
// fixed fullscreen play on android
|
||||
if (plus.os.name.toLowerCase() === "android") {
|
||||
plus.key.addEventListener("backbutton", (e) => {
|
||||
if (isFullScreen) {
|
||||
that.$refs.playerView.changeScreenMode(0, false);
|
||||
isFullScreen = false;
|
||||
} else {
|
||||
// 这里由于安卓无法监听返回按键,这里只能通过plus监听,然后自己模拟退回
|
||||
uni.navigateBack();
|
||||
}
|
||||
});
|
||||
}
|
||||
that.$refs.playerView.setPlayerCallBack(({ type, data }) => {
|
||||
switch (type) {
|
||||
case "isFullScreen":
|
||||
isFullScreen = Boolean(data);
|
||||
break;
|
||||
default:
|
||||
console.log({ type, data });
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
async getData(data, isChange) {
|
||||
var that = this;
|
||||
if (!this.isSetFirstTime) {
|
||||
var netWork = data.userCourseVideoPositionEntity
|
||||
? data.userCourseVideoPositionEntity.position
|
||||
@@ -209,9 +354,9 @@ export default {
|
||||
// await this.playVideo();
|
||||
// }
|
||||
console.log(this.firstTime, "这是第一次播放时长");
|
||||
|
||||
this.isSetFirstTime = true;
|
||||
await that.getVideo();
|
||||
}
|
||||
this.isSetFirstTime = true;
|
||||
},
|
||||
async playVideo(e) {
|
||||
this.videoContext = uni.createVideoContext("videoId", this);
|
||||
@@ -362,6 +507,678 @@ export default {
|
||||
};
|
||||
</script>
|
||||
|
||||
<script module="renderScript" lang="renderjs">
|
||||
import $ from 'jquery'
|
||||
// import StaticADComponent from './staticadcomponent/index.js';
|
||||
/**
|
||||
* 静态广告组件
|
||||
*/
|
||||
|
||||
|
||||
export default {
|
||||
/**
|
||||
* 静态广告组件
|
||||
*/
|
||||
|
||||
components: {
|
||||
// MyComponent
|
||||
},
|
||||
mounted() {
|
||||
// 在适合的生命周期,通过script和link标签引入播放器sdk、css
|
||||
console.log(this.options, '这是monted')
|
||||
this.loadWebPlayerSDK()
|
||||
// this.loadComponent()
|
||||
},
|
||||
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)
|
||||
// this.player.on('ready',function(){
|
||||
// var status= this.player.fullscreenService.getIsFullScreen()
|
||||
// console.log('status at line 403:', status)
|
||||
// console.log('触发点击事件',status))
|
||||
// })
|
||||
|
||||
// ownerInstance.callMethod('getData')
|
||||
|
||||
},
|
||||
emitData(event, ownerInstance) {
|
||||
var that = this;
|
||||
|
||||
ownerInstance.callMethod('recordTime', {
|
||||
time: that.curTime,
|
||||
status: that.curStatus
|
||||
})
|
||||
|
||||
},
|
||||
|
||||
|
||||
async receiveFirstTime(newValue, oldValue, ownerVm, vm) {
|
||||
|
||||
// if (this.player) {
|
||||
// // this.firstTime=newValue;
|
||||
// // console.log('这是初始播放时间111', this.firstTime,this.player)
|
||||
// // await this.player.seek(newValue);
|
||||
// await this.$refs.videoContent4.click()
|
||||
|
||||
|
||||
|
||||
// }
|
||||
|
||||
|
||||
},
|
||||
async receiveisSetFirstTime(newValue, oldValue, ownerVm, vm) {
|
||||
console.log('是否刚开始设置播放时间', newValue, this.firstTime, this.player);
|
||||
// if (this.player) {
|
||||
// // this.firstTime=newValue;
|
||||
// // await this.player.seek(this.firstTime);
|
||||
|
||||
|
||||
|
||||
|
||||
// }
|
||||
|
||||
|
||||
},
|
||||
|
||||
emitSetData(event, ownerInstance) {
|
||||
var that = this;
|
||||
// this.player.seek(this.firstTime)
|
||||
console.log('是否设置的第一次初始播放', this.firstTime, this.videoData.id);
|
||||
|
||||
|
||||
ownerInstance.callMethod('setVideoFirtsetTime')
|
||||
|
||||
},
|
||||
changeVideoScreen(event, ownerInstance) {
|
||||
var that = this;
|
||||
// this.$emit('changeScreenLoading',true)
|
||||
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();
|
||||
// this.$emit('changeScreenLoading',false);
|
||||
|
||||
|
||||
}, 100);
|
||||
|
||||
|
||||
// this.player.setPlayerSize('100%','200px');
|
||||
|
||||
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
// this.player.setPlayerSize({
|
||||
// w:"400px",
|
||||
// height:'60%'
|
||||
// });
|
||||
// plus.screen.unlockOrientation();
|
||||
this.player.fullscreenService.requestFullScreen();
|
||||
setTimeout(() => {
|
||||
// this.$emit('changeScreenLoading',false);
|
||||
plus.screen.lockOrientation("landscape-primary");
|
||||
|
||||
}, 100);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
},
|
||||
changeVideoData(event, ownerInstance) {
|
||||
var that = this;
|
||||
|
||||
ownerInstance.callMethod('changeVideoData', )
|
||||
},
|
||||
endEmitData(event, ownerInstance) {
|
||||
var that = this;
|
||||
|
||||
ownerInstance.callMethod('handleEnd', )
|
||||
},
|
||||
getLive() {
|
||||
console.log('这是这只只是666666:', this.firstTime, this.videoData)
|
||||
|
||||
if (this.player) {
|
||||
|
||||
this.player.dispose();
|
||||
$('#url-player-test').empty();
|
||||
this.player = null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
var fullScreenButtonComponent = Aliplayer.Component({
|
||||
/**
|
||||
* 初始函数,在new对象时调用
|
||||
*
|
||||
* @param {string} adAddress - 广告视频地址
|
||||
* @param {string} toAddress - 广告链接地址
|
||||
*/
|
||||
init: function(status, toAddress) {
|
||||
|
||||
this.fullScreenStatus = status
|
||||
// this.adAddress = adAddress;
|
||||
// this.toAddress = toAddress;
|
||||
|
||||
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() {
|
||||
// Aliplayer.util.stopPropagation();
|
||||
});
|
||||
// this.$html.find('.close').click(function () {
|
||||
// this.$html.hide();
|
||||
// });
|
||||
// $(el).find('.prism-controlbar').append(this.$html);
|
||||
$(el).find('.prism-time-display').after(this.$html);
|
||||
},
|
||||
ready: function(player, e) {
|
||||
// this.$html.hide()
|
||||
},
|
||||
/**
|
||||
* 隐藏广告
|
||||
*/
|
||||
play: function(player, e) {
|
||||
// this.$html.show();
|
||||
},
|
||||
/**
|
||||
* 显示广告
|
||||
*/
|
||||
pause: function(player, e) {
|
||||
// this.$html.show();
|
||||
},
|
||||
/**
|
||||
* 隐藏广告
|
||||
*/
|
||||
playing: function(player, e) {
|
||||
this.$html.show();
|
||||
// this.$html.hide();
|
||||
},
|
||||
waiting: function(player, e) {
|
||||
// this.$html.hide()
|
||||
},
|
||||
timeupdate: function(player, e) {},
|
||||
error: function(player, e) {},
|
||||
/**
|
||||
* 显示广告
|
||||
*/
|
||||
ended: function(player, e) {
|
||||
// this.$html.show();
|
||||
}
|
||||
});
|
||||
|
||||
console.log('this.currentVideoList at line 456111111111111111111111:', this.videoList)
|
||||
|
||||
|
||||
var playerOptions = {
|
||||
id: "url-player-test",
|
||||
preload: false,
|
||||
"vid": this.videoData
|
||||
.videoId, // 必选参数,可以通过点播控制台(路径:媒资库>音/视频)查询。示例:1e067a2831b641db90d570b6480f****。
|
||||
|
||||
width: '100%', //容器的大小
|
||||
// videoWidth: '100vw', //容器的大小
|
||||
// videoHeight: '100vh', //容器的大小
|
||||
height: '100%', //容器的大小
|
||||
playsinline: true,
|
||||
controlBarVisibility: "click",
|
||||
cover: "",
|
||||
components: [
|
||||
// {
|
||||
// name: 'BulletScreenComponent',
|
||||
// type: AliPlayerComponent.BulletScreenComponent,
|
||||
// /** Descriptions of the scrolling text component parameters: text, style, bulletPosition
|
||||
// * text: The scrolling text
|
||||
// * style: The style of the scrolling text
|
||||
// * bulletPosition: The position of the scrolling text. Valid values: 'top', 'bottom', and 'random'. The default is 'random'.
|
||||
// */
|
||||
// args: ['http://101.201.146.165:8088/Pf-EH/statics/uploadFile/2024-05-10/b0f420c7-9178-41ad-9dd6-f59a64a6e190.png']
|
||||
// },
|
||||
{
|
||||
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
|
||||
},
|
||||
|
||||
|
||||
// {
|
||||
// name: 'RotateMirrorComponent',
|
||||
// type: AliPlayerComponent.RotateMirrorComponent
|
||||
// },
|
||||
|
||||
|
||||
],
|
||||
|
||||
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: "fullScreenButton", align: "tr", x: 10, y: 12},
|
||||
// {name:"subtitle", align:"tr",x:15, y:12},
|
||||
// {
|
||||
// name: "setting",
|
||||
// align: "tr",
|
||||
// x: 15,
|
||||
// y: 12
|
||||
// },
|
||||
{
|
||||
name: "prism-speed-selector",
|
||||
align: "tr",
|
||||
x: 15,
|
||||
y: 12
|
||||
},
|
||||
{
|
||||
name: "volume",
|
||||
align: "tr",
|
||||
x: 5,
|
||||
y: 10
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (this.videoData.type == 1) {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
"playauth": this.videoData.playAuth, // 必选参数,参数值可通过调用GetVideoPlayAuth接口获取。
|
||||
"encryptType": 1, // 必选参数,当播放私有加密流时需要设置本参数值为1。其它情况无需设置。
|
||||
"playConfig": {
|
||||
"EncryptType": 'AliyunVoDEncryption'
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
playerOptions = {
|
||||
...playerOptions,
|
||||
source: this.videoData.videoUrl
|
||||
}
|
||||
}
|
||||
var player = new Aliplayer(playerOptions, function(player) { });
|
||||
this.player = player;
|
||||
console.log('是否拿到第一次初始值呢',this.platform, typeof this.firstTime, this.firstTime)
|
||||
if(this.platform == 'ios'){
|
||||
|
||||
this.player.one('timeupdate', () => {
|
||||
this.player.seek(this.firstTime);
|
||||
})
|
||||
|
||||
player.on('canplay',function(){
|
||||
console.log('这是ios数据缓冲初次设置播放位置判断!!!!')
|
||||
this.player.seek(this.firstTime);
|
||||
})
|
||||
// var seeked = false;
|
||||
// player.on('loadedmetadata',function (e) {
|
||||
// if(!seeked)
|
||||
// {
|
||||
// seeked = true;
|
||||
// this.player.seek(20);
|
||||
// }
|
||||
// });
|
||||
// player.on('waiting',function(){
|
||||
// console.log('这是ios数据缓冲初次设置播放位置判断!!!!')
|
||||
// setTimeout(()=>{
|
||||
// player.seek(this.firstTime)
|
||||
// },500)
|
||||
|
||||
// })
|
||||
}else{
|
||||
this.player.seek(this.firstTime)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// var seeked = false;
|
||||
// this.player.on('loadedmetadata',function (e) {
|
||||
// if(!seeked)
|
||||
// {
|
||||
// seeked = true;
|
||||
// player.seek(this.firstTime);
|
||||
// }
|
||||
// });
|
||||
|
||||
|
||||
|
||||
|
||||
clearInterval(this.videoTimer);
|
||||
|
||||
this.videoTimer = null;
|
||||
this.videoTimer = setInterval(() => {
|
||||
var that = this;
|
||||
that.curTime = parseInt(this.player.getCurrentTime());
|
||||
that.curStatus = this.player.getStatus()
|
||||
|
||||
|
||||
}, 1000);
|
||||
this.$refs.videoContent4.click()
|
||||
player.on('ready', function() {
|
||||
|
||||
// player.fullscreenService.requestFullScreen()
|
||||
|
||||
})
|
||||
|
||||
// this.
|
||||
|
||||
|
||||
// this.$refs.videoContent.click()
|
||||
this.player.on('ended', function() {
|
||||
// console.log('that.curTime at line 242:', this.curTime)
|
||||
// console.log('that.curStatus at line 210:', this.curStatus)
|
||||
this.$refs.videoContent2.click()
|
||||
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
// player.setRotate(90)
|
||||
|
||||
//全屏播放
|
||||
|
||||
// player.one('canplay', function() {
|
||||
// // console.log('canplay', this.player.tag);
|
||||
// player.tag.play();
|
||||
|
||||
// });
|
||||
|
||||
|
||||
|
||||
},
|
||||
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)
|
||||
|
||||
|
||||
//最后一步就是所有图片放在预览的方法previewImage中就可以了
|
||||
// uni.previewImage({
|
||||
// current: imgList,
|
||||
// urls: imgList,
|
||||
// })
|
||||
uni.previewImage({
|
||||
urls: imgList,
|
||||
longPressActions: {
|
||||
itemList: ['很抱歉,暂不支持保存图片到本地'],
|
||||
success: function(res) {
|
||||
// console.log(res,'+++++')
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
receiveScreenType(newValue) {
|
||||
// console.log('newValue at line 427屏幕方向111111111111:', newValue)
|
||||
|
||||
},
|
||||
async receiveIsfresh(newValue) {
|
||||
|
||||
|
||||
|
||||
console.log('是否走了刷新销毁方法:', this.player)
|
||||
if (this.player) {
|
||||
clearInterval(this.$store.state.videoTimer)
|
||||
// await this.setVideoTime();
|
||||
this.player.dispose();
|
||||
// $('#url-player-test').empty()
|
||||
|
||||
// this.player.seek(newValue);
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
async receiveplatform(newValue) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
},
|
||||
async receiveIsChange(newValue) {
|
||||
|
||||
|
||||
// this.timer=null
|
||||
|
||||
if (this.isChange) {
|
||||
|
||||
this.checkValue()
|
||||
|
||||
// if (this.videoData.type == 1) {
|
||||
// console.log('是否走了切换加密视频方法:', this.isChange, this.videoData)
|
||||
// await this.player.replayByVidAndPlayAuth(this.videoData.video, this.videoData.playAuth)
|
||||
// this.$refs.videoContent.click()
|
||||
// } else {
|
||||
// console.log('是否走了切换老视频/音频方法:', this.isChange, this.videoData)
|
||||
// await this.player.loadByUrl(this.videoData.videoUrl)
|
||||
// this.$refs.videoContent.click()
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
// this.$refs.videoContent3.click()
|
||||
|
||||
},
|
||||
|
||||
receiveVideoList(newValue, oldValue, ownerVm, vm) {
|
||||
// //数据变化
|
||||
|
||||
console.log('currentVideoListcurrentVideoListcurrentVideoList', newValue)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
},
|
||||
receiveMsg(newValue, oldValue, ownerVm, vm) {
|
||||
//数据变化
|
||||
// console.log('newValue', newValue)
|
||||
// console.log('oldValue', oldValue)
|
||||
// console.log('ownerVm', ownerVm)
|
||||
// console.log('vm', vm)
|
||||
},
|
||||
receiveWinWidth(newValue, oldValue, ownerVm, vm) {
|
||||
//数据变化
|
||||
console.log('newValue', newValue)
|
||||
// console.log('oldValue', oldValue)
|
||||
// console.log('ownerVm', ownerVm)
|
||||
// console.log('vm', vm)
|
||||
},
|
||||
receiveWinHeight(newValue, oldValue, ownerVm, vm) {
|
||||
//数据变化
|
||||
console.log('newValue', newValue)
|
||||
// console.log('oldValue', oldValue)
|
||||
// console.log('ownerVm', ownerVm)
|
||||
// console.log('vm', vm)
|
||||
},
|
||||
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);
|
||||
});
|
||||
},
|
||||
loadComponent() {
|
||||
// return new Promise((resolve, reject) => {
|
||||
// const s_tag = document.createElement('script');
|
||||
// s_tag.type = 'text/javascript';
|
||||
// // 需要先下载组件 js 文件,放到项目 /static/ 目录下
|
||||
// // 下载地址:https://github.com/aliyunvideo/AliyunPlayer_Web/blob/master/customComponents/dist/aliplayer-components/aliplayercomponents-1.0.9.min.js
|
||||
// s_tag.src = '@/static/aliplayercomponents.js';
|
||||
// s_tag.charset = 'utf-8';
|
||||
// s_tag.onload = () => {
|
||||
// resolve();
|
||||
// }
|
||||
// document.body.appendChild(s_tag);
|
||||
// });
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.container {
|
||||
width: 100vw;
|
||||
|
||||
534
pages/component/commonComponents/video/ios copy.vue
Normal file
534
pages/component/commonComponents/video/ios copy.vue
Normal file
@@ -0,0 +1,534 @@
|
||||
<template>
|
||||
<view class="container" style="background-color: #fff; position: relative">
|
||||
<view style="width: 100%">
|
||||
<!-- <web-view style="height: 200px" src="https://www.tmrjournals.com/aliplayer.html"></web-view> -->
|
||||
<web-view
|
||||
style="height: 200px"
|
||||
src="../../../../static/html/aliplayer.html"
|
||||
></web-view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import store from "@/store/index.js";
|
||||
import $http from "@/config/requestConfig.js";
|
||||
import { mapState, mapMutations } from "vuex";
|
||||
|
||||
// importScripts('@/static/aliplayer/aliplayer-min.js')
|
||||
export default {
|
||||
props: ["currentVideo", "currentVideoList"],
|
||||
data() {
|
||||
return {
|
||||
platform: null,
|
||||
//当前是否是全屏模式
|
||||
isFullScreen: false,
|
||||
isfresh: false,
|
||||
isChange: false,
|
||||
isControl: true,
|
||||
timer: null,
|
||||
videoTitle: "",
|
||||
videoList: [],
|
||||
firstTime: 0,
|
||||
options: {},
|
||||
playAuth: "",
|
||||
currentTime: "",
|
||||
videoId: "",
|
||||
videoData: {},
|
||||
isSetFirstTime: false,
|
||||
screenType: null,
|
||||
videoUrl: null,
|
||||
};
|
||||
},
|
||||
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);
|
||||
// this.timer = null;
|
||||
// store.commit("setLoadingShow", null);
|
||||
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"); //锁死屏幕方向为竖屏
|
||||
|
||||
// plus.screen.lockOrientation("portrait-primary");
|
||||
// #endif
|
||||
|
||||
await this.setVideoTime();
|
||||
// this.player.dispose();
|
||||
},
|
||||
|
||||
//第一次加载
|
||||
onLoad(options) {},
|
||||
|
||||
methods: {
|
||||
changeVideoData() {
|
||||
this.isChange = false;
|
||||
},
|
||||
async changeVideo(data) {
|
||||
this.currentTime = "";
|
||||
this.firstTime = 0;
|
||||
this.isSetFirstTime = false;
|
||||
this.isChange = false;
|
||||
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);
|
||||
// let fullScreen = e.detail.fullScreen; // 值true为进入全屏,false为退出全屏
|
||||
// if (!fullScreen) {
|
||||
// //退出全屏
|
||||
// this.isFullScreen = false;
|
||||
// } else {
|
||||
// this.isFullScreen = true;
|
||||
// }
|
||||
},
|
||||
// 控制器的显示隐藏
|
||||
controlChange(e) {
|
||||
this.isControl = e.detail.show;
|
||||
},
|
||||
quitScreen() {
|
||||
// 退出全屏
|
||||
const ctx = this.$refs.myVideo;
|
||||
ctx.exitFullScreen();
|
||||
},
|
||||
// 播放进度改变
|
||||
videoTimeUpdateEvent(e) {
|
||||
this.playTime = parseInt(e.detail.currentTime);
|
||||
this.currentTime = parseInt(e.detail.currentTime);
|
||||
|
||||
this.allTime = parseInt(e.detail.duration);
|
||||
|
||||
this.recordTime({
|
||||
time: this.playTime,
|
||||
});
|
||||
},
|
||||
async init(data, isChange) {
|
||||
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.$emit("child-event", this.timer);
|
||||
},
|
||||
async getData(data, isChange) {
|
||||
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);
|
||||
|
||||
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,
|
||||
};
|
||||
this.isChange = isChange ? isChange : false;
|
||||
// this.currentTime = this.firstTime;
|
||||
console.log(this.firstTime, "这是第一次播放时长222");
|
||||
// await this.setVideoTime();
|
||||
uni.setStorageSync("videoOssList", JSON.stringify(list));
|
||||
|
||||
// if (this.currentVideo.type == 0 || this.currentVideo.type == 2) {
|
||||
// await this.playVideo();
|
||||
// }
|
||||
console.log(this.firstTime, "这是第一次播放时长");
|
||||
|
||||
this.isSetFirstTime = true;
|
||||
}
|
||||
},
|
||||
|
||||
recordTime(data) {
|
||||
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) {
|
||||
var that = this;
|
||||
this.isfresh = false;
|
||||
var data = {
|
||||
...this.options,
|
||||
};
|
||||
|
||||
await $http
|
||||
.request({
|
||||
url: `sociology/course/checkVideo`,
|
||||
method: "Post", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||||
data,
|
||||
header: {
|
||||
//默认 无 说明:请求头
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
})
|
||||
.then(async (res) => {
|
||||
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();
|
||||
});
|
||||
},
|
||||
async handleEnd() {
|
||||
var list = JSON.parse(JSON.stringify(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
|
||||
);
|
||||
clearInterval(this.$store.state.videoTimer);
|
||||
this.timer = null;
|
||||
|
||||
await this.setVideoTime();
|
||||
},
|
||||
setVideoTime(time) {
|
||||
var data = {};
|
||||
// var list = uni.getStorageSync("videoOssList");
|
||||
|
||||
// data = list.find((e) => e.id == this.videoData.id);
|
||||
// console.log("这是再走生命周期哦", this.currentTime);
|
||||
console.log("是否走了存储视屏," + this.videoData.id, this.currentTime);
|
||||
var data = {
|
||||
videoId: this.videoData.id,
|
||||
position: this.currentTime, //秒数
|
||||
};
|
||||
|
||||
$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();
|
||||
});
|
||||
},
|
||||
changePlayerTime(player) {
|
||||
console.log("this.firstTime at line 106:", this.firstTime);
|
||||
player.seek(this.firstTime);
|
||||
},
|
||||
goBack() {
|
||||
uni.navigateBack({
|
||||
delta: 1,
|
||||
});
|
||||
},
|
||||
|
||||
async setVideoFirtsetTime(time) {
|
||||
this.currentTime = this.firstTime;
|
||||
console.log("这里准备开始设置播放时间:", this.currentTime);
|
||||
// await this.setVideoTime();
|
||||
// setTimeout(() => {
|
||||
// clearInterval(this.$store.state.videoTimer);
|
||||
|
||||
store.commit(
|
||||
"setVideoTimer",
|
||||
setInterval(async () => {
|
||||
// if (this.currentTime) {
|
||||
await this.setVideoTime();
|
||||
// }
|
||||
}, 60000)
|
||||
);
|
||||
// }, 5000);
|
||||
},
|
||||
},
|
||||
|
||||
created() {},
|
||||
};
|
||||
</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>
|
||||
1257
pages/component/commonComponents/video/ios.nvue
Normal file
1257
pages/component/commonComponents/video/ios.nvue
Normal file
File diff suppressed because it is too large
Load Diff
1367
pages/component/commonComponents/video/ios1.nvue
Normal file
1367
pages/component/commonComponents/video/ios1.nvue
Normal file
File diff suppressed because it is too large
Load Diff
1304
pages/component/commonComponents/video/video.vue
Normal file
1304
pages/component/commonComponents/video/video.vue
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user