阿里云播放器Alipalayer官方的展示和配置详见:https://player.alicdn.com/aliplayer/presentation/index.html
官方的展示使用的并不是vue的写法,这边整理了了一下vue的写法,如果是配置方面的,可以把配置的代码复制过来直接时候,另外也考虑到了插件组件的使用,也是集成进去了。
示例中使用了2.9.20版本的js和css,使用了ali的CDN引用的,组件使用的是1.0.8的版本,这个是没有CDN的,需要直接从github上下载
集成了自定义的组件,示例中使用了一个图片广告插件,供参考。详细的官方SDK介绍,请参考:https://help.aliyun.com/document_detail/125579.html
可以使用source(例如mp4的url的方式)或者使用vid+playauth的方式加密播放。
下面放出干货代码 Player.vue(复制过来就可以使用,大部分使用都加上了注释):
<!--
- Copyright (c) 2022.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-->
<template>
<div>
<div class="prism-player" :id="playerId" :style="playStyle"></div>
<button @click="buttonClicked">直接播放地址测试</button>
<button @click="buttonClicked2">Vid+playAuth播放测试</button>
</div>
</template>
<script>
// 组件从这里下载:https://github.com/aliyunvideo/AliyunPlayer_Web/blob/master/customComponents/dist/aliplayer-components/aliplayercomponents-1.0.8.min.js
import './aliplayercomponents-1.0.8.min'
export default {
name: "Player",
data() {
return {
playerId: "aliplayer_" + Math.random().toString(36).substr(2),
scriptTagStatus: 0,
isReload: false,
player: null,
playStyle:[]
}
},
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: {
buttonClicked() {
console.log('button1 clicked');
var playerInfo = {};
playerInfo.source = '//player.alicdn.com/video/editor.mp4';
this.reloadPlayer(playerInfo, player => {
// 测试监听ready事件后播放
player.on('ready',(e)=> player.play());
})
},
buttonClicked2() {
console.log('button2 clicked');
var playerInfo = {};
playerInfo.vid='AAABBB';
playerInfo.playauth='XXXYYY';
this.reloadPlayer(playerInfo, player => {
// 测试监听ready事件后播放
player.on('ready',(e)=> player.play());
})
},
insertScriptTag() {
const _this = this;
let playerScriptTag = document.getElementById("playerScriptTag");
// 如果这个tag不存在,则生成相关代码tag以加载代码
if (playerScriptTag === null) {
playerScriptTag = document.createElement("script");
playerScriptTag.type = "text/javascript";
playerScriptTag.src = "https://g.alicdn.com/de/prismplayer/2.9.20/aliplayer-min.js"; // alipplayer的JS代码,如果有新的版本可以更换,最底下还有CSS代码,也可以根据版本号更换
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(playInfo, callback) {
if(!playInfo) {
playInfo = {};
}
const _this = this;
// scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
if (_this.scriptTagStatus === 2 && (_this.player === null || _this.reloadPlayer)) {
_this.player && _this.player.dispose();
// console.log(document.querySelector("#" + _this.playerId));
// document.querySelector("#" + _this.playerId).innerHTML = "";
// Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
// 所以,我们只能在 nextTick 里面初始化 Aliplayer
_this.$nextTick(() => {
_this.player = window.Aliplayer({
id: this.playerId,
autoplay: playInfo.autoplay?playInfo.autoplay:false,
source: playInfo.source,
cover: playInfo.cover,
vid : playInfo.vid,
playauth : playInfo.playauth,
// 其他需要的自己定义,可以从https://player.alicdn.com/aliplayer/presentation/index.html?type=cover上选好了配置后,相应的复制过来
// 图片广告组件测试
components: [{
name: 'PauseADComponent',
type: AliPlayerComponent.PauseADComponent,
args: ['https://img.alicdn.com/tfs/TB1byi8afDH8KJjy1XcXXcpdXXa-1920-514.jpg', 'https://promotion.aliyun.com/ntms/act/videoai.html']
}]
});
// 绑定事件,当 AliPlayer 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
_this.player.on("ready", () => {
this.$emit("ready", _this.player);
});
_this.player.on("play", () => {
this.$emit("play", _this.player);
});
_this.player.on("pause", () => {
this.$emit("pause", _this.player);
});
_this.player.on("ended", () => {
this.$emit("ended", _this.player);
});
_this.player.on("liveStreamStop", () => {
this.$emit("liveStreamStop", _this.player);
});
_this.player.on("m3u8Retry", () => {
this.$emit("m3u8Retry", _this.player);
});
_this.player.on("hideBar", () => {
this.$emit("hideBar", _this.player);
});
_this.player.on("waiting", () => {
this.$emit("waiting", _this.player);
});
_this.player.on("snapshoted", () => {
this.$emit("snapshoted", _this.player);
});
_this.player.on("timeupdate", () => {
_this.$emit("timeupdate", _this.player);
});
_this.player.on("requestFullScreen", () => {
_this.$emit("requestFullScreen", _this.player);
});
_this.player.on("cancelFullScreen", () => {
_this.$emit("cancelFullScreen", _this.player);
});
_this.player.on("error", () => {
_this.$emit("error", _this.player);
});
_this.player.on("startSeek", () => {
_this.$emit("startSeek", _this.player);
});
_this.player.on("completeSeek", () => {
_this.$emit("completeSeek", _this.player);
});
if(callback){
callback(_this.player);
}
});
}
},
/**
* 播放视频
*/
play: function () {
this.player.play();
},
/**
* 暂停视频
*/
pause: function () {
this.player.pause();
},
/**
* 重播视频
*/
replay: function () {
this.player.replay();
},
/**
* 跳转到某个时刻进行播放
* @argument time 的单位为秒
*/
seek: function (time) {
this.player.seek(time);
},
/**
* 获取当前时间 单位秒
*/
getCurrentTime: function () {
return this.player.getCurrentTime();
},
/**
*获取视频总时长,返回的单位为秒
* @returns 返回的单位为秒
*/
getDuration: function () {
return this.player.getDuration();
},
/**
获取当前的音量,返回值为0-1的实数ios和部分android会失效
*/
getVolume: function () {
return this.player.getVolume();
},
/**
设置音量,vol为0-1的实数,ios和部分android会失效
*/
setVolume: function (vol) {
this.player.setVolume(vol);
},
/**
*直接播放视频url,time为可选值(单位秒)目前只支持同种格式(mp4/flv/m3u8)之间切换暂不支持直播rtmp流切换
*@argument url 视频地址
*@argument time 跳转到多少秒
*/
loadByUrl: function (url, time) {
this.player.loadByUrl(url, time);
},
/**
* 设置播放速度
*@argument speed 速度
*/
setSpeed: function (speed) {
this.player.setSpeed(speed);
},
/**
* 设置播放器大小w,h可分别为400px像素或60%百分比chrome浏览器下flash播放器分别不能小于397x297
*@argument w 播放器宽度
*@argument h 播放器高度
*/
setPlayerSize: function (w, h) {
this.player.setPlayerSize(w, h);
},
reloadPlayer: function (playInfo, callback) {
this.isReload = true;
this.initAliplayer(playInfo, callback);
this.isReload = false;
},
ready(e) {
console.log('ready',e)
}
}
}
</script>
<style lang="less" scoped>
@import 'https://g.alicdn.com/de/prismplayer/2.9.20/skins/default/aliplayer-min.css';
</style>
文章评论