Compare commits

...

25 Commits

Author SHA1 Message Date
langyuxiansheng
cdf70ab208
Merge pull request #64 from langyuxiansheng/dev_v1.3.1
Dev v1.3.1
2022-05-12 16:47:43 +08:00
zhouliujun
d9bd73f6d4 更新umd 2022-05-12 14:23:21 +08:00
zhouliujun
31441d7773 更新版本号 2022-05-12 14:20:44 +08:00
langyuxiansheng
d7495c1469
Merge pull request #63 from william-xue/feature/add-function-forbidfastforward
Feature/add function forbidfastforward  增加禁止拖拽快进播放属性
2022-05-12 14:05:27 +08:00
xueyuan
444820e168 加师范例子 2022-05-11 21:47:19 +08:00
xueyuan
5169e0cc32 增加禁止快进功能 2022-05-11 21:36:10 +08:00
zhouliujun
a571705e6a Merge branch 'dev_v1.3.0' of https://github.com/langyuxiansheng/vue-aliplayer-v2 2021-07-11 11:09:33 +08:00
zhouliujun
01c82d7f6d 更新sdk版本 2021-07-11 10:41:59 +08:00
zhouliujun
5a0a49aacc 更新默认SDK版本 2021-07-11 09:52:13 +08:00
zhouliujun
3758626080 Merge branch 'master' of https://github.com/langyuxiansheng/vue-aliplayer-v2 2021-06-21 17:12:47 +08:00
zhouliujun
3593da7f8e 更新pages 2021-06-21 17:11:13 +08:00
langyuxiansheng
1b16c2d3e6
Merge pull request #54 from langyuxiansheng/dev_v1.2.9
更新包
2021-06-21 17:05:47 +08:00
zhouliujun
39bd7ad3b7 更新包 2021-05-11 14:24:43 +08:00
langyuxiansheng
0d7cab7d36
Merge pull request #48 from langyuxiansheng/dev_v1.2.9
修正部分默认属性
2021-05-11 14:18:11 +08:00
zhouliujun
486cfe87bb 修正部分默认属性 2021-05-11 14:13:16 +08:00
langyuxiansheng
2d07b16f2e
Merge pull request #40 from langyuxiansheng/dev_v1.2.8
增加gh-pages的脚本
2021-01-14 16:18:58 +08:00
zhouliujun
f3b97d319c 增加gh-pages的脚本 2021-01-14 16:02:15 +08:00
langyuxiansheng
964f6b847d
Merge pull request #39 from langyuxiansheng/dev_v1.2.8
Dev v1.2.8
2021-01-13 17:21:57 +08:00
zhouliujun
361f56b518 更新lib 2021-01-13 17:20:41 +08:00
zhouliujun
023de1ad31 更新版本和修复bug 2021-01-13 17:18:57 +08:00
zhouliujun
d3156070eb 增加开发版本分支 2021-01-13 16:35:19 +08:00
langyuxiansheng
6be2ffb5d4
Update README.md 2021-01-03 11:17:38 +08:00
langyuxiansheng
bee90e339b
Update README.md 2021-01-03 11:17:07 +08:00
langyuxiansheng
4af7f7fee7
Merge pull request #36 from Ghost23333/master
现在可以动态修改直播视频了,demo在readme.md
2021-01-03 11:14:49 +08:00
ghost
43d7ad5c34 现在可以动态修改直播视频了 2021-01-03 10:19:16 +08:00
9 changed files with 711 additions and 361 deletions

597
README.md
View File

@ -1,196 +1,231 @@
# vue-alipayer-v2 # vue-alipayer-v2
## 感谢每一位开源的开发者. 这是一个基于Alipayer 开发并封装成vue组件的播放器.
### vue中使用Alipayer,播放rtmp,m3u8,mp4视频 ## 感谢每一位支持开源的朋友. 这是一个基于 Alipayer 开发并封装成 vue 组件的播放器.
### vue 中使用 Alipayer,播放 rtmp,m3u8,mp4 视频
#### [本项目在线演示](https://langyuxiansheng.github.io/vue-aliplayer-v2/) #### [本项目在线演示](https://langyuxiansheng.github.io/vue-aliplayer-v2/)
#### [阿里云播放器在线演示](https://player.alicdn.com/aliplayer/index.html) #### [阿里云播放器在线演示](https://player.alicdn.com/aliplayer/index.html)
> 假如此轮子对你有帮助,请顺手star一下吧.o(* ̄︶ ̄*)o > 假如此轮子对你有帮助,请顺手 star 一下吧.o(_ ̄︶ ̄_)o
## 1.安装使用! 下载安装 npm 包
## 1.安装使用! 下载安装npm包
```bash ```bash
npm i vue-aliplayer-v2 --save npm i vue-aliplayer-v2 --save
or or
yarn add vue-aliplayer-v2 yarn add vue-aliplayer-v2
``` ```
#### 全局注册 main.js #### 全局注册 main.js
```javascript ```javascript
import VueAliplayerV2 from 'vue-aliplayer-v2'; import VueAliplayerV2 from "vue-aliplayer-v2";
Vue.use(VueAliplayerV2); Vue.use(VueAliplayerV2);
//可选全局配置 //可选全局配置
//Vue.use(VueAliplayerV2,{ //Vue.use(VueAliplayerV2,{
// cssLink: 'https://g.alicdn.com/de/prismplayer/2.8.2/skins/default/aliplayer-min.css', // cssLink: 'https://g.alicdn.com/de/prismplayer/2.8.2/skins/default/aliplayer-min.css',
// scriptSrc: 'https://g.alicdn.com/de/prismplayer/2.8.2/aliplayer-min.js' // scriptSrc: 'https://g.alicdn.com/de/prismplayer/2.8.2/aliplayer-min.js'
//}); //});
``` ```
#### 局部注册 App.vue #### 局部注册 App.vue
```javascript ```javascript
//推荐第一种(仅v1.2.3)及以上的版本可用 //推荐第一种(仅v1.2.3)及以上的版本可用
import VueAliplayerV2 from 'vue-aliplayer-v2'; import VueAliplayerV2 from "vue-aliplayer-v2";
components:{ VueAliplayerV2 } components: {
VueAliplayerV2;
//或者 }
components:{ VueAliplayerV2: VueAliplayerV2.Player }
//或者
components: {
VueAliplayerV2: VueAliplayerV2.Player;
}
``` ```
## 2.组件中使用 ## 2.组件中使用
### 组件模板使用,下面的视频连接仅供演示测试. ### 组件模板使用,下面的视频连接仅供演示测试.
```html ```html
<template> <template>
<div id="app"> <div id="app">
<template v-if="!isShowMultiple && show"> <template v-if="!isShowMultiple && show">
<vue-aliplayer-v2 :source="source" ref="VueAliplayerV2" :options="options" /> <vue-aliplayer-v2
</template> :source="source"
<div v-if="isShowMultiple && show" class="show-multiple"> ref="VueAliplayerV2"
<template v-for="x in 5"> :options="options"
<vue-aliplayer-v2 class="multiple-player" :key="x" :source="source" ref="VueAliplayerV2" :options="options" /> />
</template> </template>
</div> <div v-if="isShowMultiple && show" class="show-multiple">
<p class="remove-text" v-if="!show">播放器已销毁!</p> <template v-for="x in 5">
<div class="player-btns"> <vue-aliplayer-v2
<template v-if="!isShowMultiple && show"> class="multiple-player"
<span @click="play()">播放</span> :key="x"
<span @click="pause()">暂停</span> :source="source"
<span @click="replay()">重播</span> ref="VueAliplayerV2"
<span @click="getCurrentTime()">播放时刻</span> :options="options"
<span @click="getStatus()">获取播放器状态</span> />
</template> </template>
<span @click="show = !show">{{ show ? '销毁' : '重载' }}</span>
<span @click="options.isLive = !options.isLive">{{ options.isLive ? '切换普通模式' : '切换直播模式' }}</span>
<span @click="showMultiple()">{{isShowMultiple ? '显示1个播放器' : '显示多个播放器'}}</span>
</div>
<div class="source-box">
<span class="source-label">选择播放源(支持动态切换):</span>
<select v-model="source" name="source" id="source">
<option value="//player.alicdn.com/video/aliyunmedia.mp4">播放源1</option>
<option value="//yunqivedio.alicdn.com/user-upload/nXPDX8AASx.mp4">播放源2</option>
<option value="//tbm-auth.alicdn.com/e7qHgLdugbzzKh2eW0J/kXTgBkjvNXcERYxh2PA@@hd_hq.mp4?auth_key=1584519814-0-0-fc98b2738f331ff015f7bf5c62394888">播放源3</option>
<option value="//ivi.bupt.edu.cn/hls/cctv1.m3u8">直播播放源4</option>
</select>
</div>
<div class="source-box">
<span class="source-label">输入播放源(支持动态切换):</span>
<input class="source-input" type="text" v-model="source">
</div>
</div> </div>
<p class="remove-text" v-if="!show">播放器已销毁!</p>
<div class="player-btns">
<template v-if="!isShowMultiple && show">
<span @click="play()">播放</span>
<span @click="pause()">暂停</span>
<span @click="replay()">重播</span>
<span @click="getCurrentTime()">播放时刻</span>
<span @click="getStatus()">获取播放器状态</span>
</template>
<span @click="show = !show">{{ show ? '销毁' : '重载' }}</span>
<span @click="options.isLive = !options.isLive"
>{{ options.isLive ? '切换普通模式' : '切换直播模式' }}</span
>
<span @click="showMultiple()"
>{{isShowMultiple ? '显示1个播放器' : '显示多个播放器'}}</span
>
</div>
<div class="source-box">
<span class="source-label">选择播放源(支持动态切换):</span>
<select v-model="source" name="source" id="source">
<option value="//player.alicdn.com/video/aliyunmedia.mp4"
>播放源1</option
>
<option value="//yunqivedio.alicdn.com/user-upload/nXPDX8AASx.mp4"
>播放源2</option
>
<option
value="//tbm-auth.alicdn.com/e7qHgLdugbzzKh2eW0J/kXTgBkjvNXcERYxh2PA@@hd_hq.mp4?auth_key=1584519814-0-0-fc98b2738f331ff015f7bf5c62394888"
>播放源3</option
>
<option value="//ivi.bupt.edu.cn/hls/cctv1.m3u8">直播播放源4</option>
</select>
</div>
<div class="source-box">
<span class="source-label">输入播放源(支持动态切换):</span>
<input class="source-input" type="text" v-model="source" />
</div>
</div>
</template> </template>
<script> <script>
export default { export default {
data(){ data() {
return { return {
options: { options: {
// source:'//player.alicdn.com/video/aliyunmedia.mp4', // source:'//player.alicdn.com/video/aliyunmedia.mp4',
isLive: true, //切换为直播流的时候必填 isLive: true, //切换为直播流的时候必填
// format: 'm3u8' //切换为直播流的时候必填 // format: 'm3u8' //切换为直播流的时候必填
}, },
source: '//player.alicdn.com/video/aliyunmedia.mp4', source: "//player.alicdn.com/video/aliyunmedia.mp4",
// source: '//ivi.bupt.edu.cn/hls/cctv1.m3u8', // source: '//ivi.bupt.edu.cn/hls/cctv1.m3u8',
show: true, show: true,
isShowMultiple: false isShowMultiple: false,
} };
}, },
methods:{ methods: {
play() {
this.$refs.VueAliplayerV2.play();
},
play(){ pause() {
this.$refs.VueAliplayerV2.play() this.$refs.VueAliplayerV2.pause();
}, },
pause(){ replay() {
this.$refs.VueAliplayerV2.pause(); this.$refs.VueAliplayerV2.replay();
}, },
replay(){ getCurrentTime() {
this.$refs.VueAliplayerV2.replay(); // this.$refs.VueAliplayerV2.getCurrentTime();
}, this.source = "http://ivi.bupt.edu.cn/hls/cctv1.m3u8";
},
getCurrentTime(){ getStatus() {
// this.$refs.VueAliplayerV2.getCurrentTime(); const status = this.$refs.VueAliplayerV2.getStatus();
this.source = 'http://ivi.bupt.edu.cn/hls/cctv1.m3u8'; console.log(`getStatus:`, status);
}, alert(`getStatus:${status}`);
},
getStatus(){ showMultiple() {
const status = this.$refs.VueAliplayerV2.getStatus(); this.isShowMultiple = !this.isShowMultiple;
console.log(`getStatus:`, status); },
alert(`getStatus:${status}`); },
}, };
showMultiple(){
this.isShowMultiple = !this.isShowMultiple;
}
}
}
</script> </script>
<style lang="less"> <style lang="less">
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.remove-text{ .remove-text {
text-align: center; text-align: center;
padding: 20px; padding: 20px;
font-size: 24px; font-size: 24px;
} }
.show-multiple{ .show-multiple {
display: flex; display: flex;
.multiple-player{ .multiple-player {
width: calc(100% / 4); width: calc(100% / 4);
margin: 20px; margin: 20px;
} }
} }
.player-btns{ .player-btns {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
span { span {
margin: 0 auto; margin: 0 auto;
display: inline-block; display: inline-block;
padding: 5px 10px; padding: 5px 10px;
width: 150px; width: 150px;
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
border: 1px solid #eee; border: 1px solid #eee;
background: #e1e1e1; background: #e1e1e1;
border-radius: 10px; border-radius: 10px;
text-align: center; text-align: center;
margin: 5px; margin: 5px;
cursor: pointer; cursor: pointer;
} }
} }
.source-box{ .source-box {
padding: 5px 10px; padding: 5px 10px;
margin-bottom: 20px; margin-bottom: 20px;
.source-label{ .source-label {
margin-right: 20px; margin-right: 20px;
font-size: 16px; font-size: 16px;
display: block; display: block;
} }
#source{ #source {
margin-top: 10px; margin-top: 10px;
} }
.source-input{ .source-input {
margin-top: 10px; margin-top: 10px;
padding: 5px 10px; padding: 5px 10px;
width: 80%; width: 80%;
border: 1px solid #ccc; border: 1px solid #ccc;
} }
} }
</style> </style>
``` ```
## 3.功能与配置 ## 3.功能与配置
```javascript ```javascript
props:{ props:{
forbidFastForward: { //禁止拖拽快进
required: false,
type: [Boolean],
default: false
},
options: { //配置项 (options.source 不支持动态切换,需要动态切换请直接使用source) options: { //配置项 (options.source 不支持动态切换,需要动态切换请直接使用source)
required: false, required: false,
type: [Object], type: [Object],
@ -206,166 +241,173 @@ props:{
cssLink:{ //css版本源 cssLink:{ //css版本源
required: false, required: false,
type: [String], type: [String],
default: `https://g.alicdn.com/de/prismplayer/2.9.0/skins/default/aliplayer-min.css` default: `https://g.alicdn.com/de/prismplayer/2.9.7/skins/default/aliplayer-min.css`
}, },
scriptSrc:{ //js版本源 scriptSrc:{ //js版本源
required: false, required: false,
type: [String], type: [String],
default: `https://g.alicdn.com/de/prismplayer/2.9.0/aliplayer-min.js` default: `https://g.alicdn.com/de/prismplayer/2.9.7/aliplayer-min.js`
} }
} }
``` ```
### 3.1 配置项 options 属性
可以参考 [属性和接口说明](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P)
| 名称 | 类型 | 说明 | ### 3.1 配置项 options 属性
| :- | :-: | :- |
| source | String | 视频播放地址url单独url。默认状态表示使用vid+playauth。source播放方式优先级最高。source支持多清晰度设置source:{“HD”:”address1”,”SD”:”address2”详情参见多清晰度播放。 | 可以参考 [属性和接口说明](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P)
| vid | String | 媒体转码服务的媒体Id。 |
| playauth | String | 播放权证如何得到参见获取playauth。 | | 名称 | 类型 | 说明 |
| height | String | 播放器高度可形如100%或者100px,chrome浏览器下flash播放器分别不能小于397x297。 | | :----------------------- | :-----------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| width | String | 播放器宽度可形如100%或者100px,chrome浏览器下flash播放器分别不能小于397x297。 | | source | String | 视频播放地址 url单独 url。默认状态表示使用 vid+playauth。source 播放方式优先级最高。source 支持多清晰度设置source:{“HD”:”address1”,”SD”:”address2”详情参见多清晰度播放。 |
| videoWidth | String | 视频宽度仅h5支持。详情参见旋转和镜像。 | | vid | String | 媒体转码服务的媒体 Id。 |
| videoHeight | String | 视频高度仅h5支持。详情参见旋转和镜像。 | | playauth | String | 播放权证,如何得到参见获取 playauth。 |
| preload | Boolean | 播放器自动加载目前仅h5可用。 | | height | String | 播放器高度可形如100%或者100px,chrome 浏览器下 flash 播放器分别不能小于 397x297。 |
| cover | String | 播放器默认封面图片请填写正确的图片url地址。需要autoplay为false才生效。Flash播放器封面也需要开启允许跨域访问。 | | width | String | 播放器宽度可形如100%或者100px,chrome 浏览器下 flash 播放器分别不能小于 397x297。 |
| isLive | Boolean | 播放内容是否为直播,直播时会禁止用户拖动进度条。 | | videoWidth | String | 视频宽度,仅 h5 支持。详情参见旋转和镜像。 |
| autoplay | Boolean | 播放器是否自动播放在移动端autoplay属性会失效。Safari11不会自动开启自动播放如何开启。 | | videoHeight | String | 视频高度,仅 h5 支持。详情参见旋转和镜像。 |
| rePlay | Boolean | 播放器自动循环播放。 | | preload | Boolean | 播放器自动加载,目前仅 h5 可用。 |
| useH5Prism | Boolean | 指定使用H5播放器。 | | cover | String | 播放器默认封面图片,请填写正确的图片 url 地址。需要 autoplay 为false才生效。Flash 播放器封面也需要开启允许跨域访问。 |
| useFlashPrism | Boolean | 指定使用Flash播放器。 | | isLive | Boolean | 播放内容是否为直播,直播时会禁止用户拖动进度条。 |
| playsinline | Boolean | H5是否内置播放有的Android浏览器不起作用。 | | autoplay | Boolean | 播放器是否自动播放,在移动端 autoplay 属性会失效。Safari11 不会自动开启自动播放如何开启。 |
| showBuffer | Boolean | 显示播放时缓冲图标默认true。 | | rePlay | Boolean | 播放器自动循环播放。 |
| skinRes | Url | 说明:皮肤图片,不建议随意修改该字段,如要修改,请参照皮肤定制。 | | useH5Prism | Boolean | 指定使用 H5 播放器。 |
| skinLayout | Array Boolean | 说明功能组件布局配置不传该字段使用默认布局。传false隐藏所有功能组件请参照皮肤定制。 | | useFlashPrism | Boolean | 指定使用 Flash 播放器。 |
| controlBarVisibility | String | 控制面板的实现默认为hover。可选的值为clickhoveralways。 | | playsinline | Boolean | H5 是否内置播放,有的 Android 浏览器不起作用。 |
| showBarTime | String | 控制栏自动隐藏时间ms。 | | showBuffer | Boolean | 显示播放时缓冲图标,默认 true。 |
| extraInfo | String | 说明JSON串用于定制性接口参数。| | skinRes | Url | 说明:皮肤图片,不建议随意修改该字段,如要修改,请参照皮肤定制。 |
| > | > | 1.“fullTitle”“测试页面”全屏时显示视频标题仅flash支持。| | skinLayout | Array Boolean | 说明:功能组件布局配置,不传该字段使用默认布局。传 false 隐藏所有功能组件,请参照皮肤定制。 |
| > | > | 2. “m3u8BufferLength”“30”播放m3u8时加载缓存ts文件长度单位仅flash支持。| | controlBarVisibility | String | 控制面板的实现默认为hover。可选的值为clickhoveralways。 |
| > | > | 3. “liveStartTime”“2016/08/17 12:00:00”,直播开始时间,用于提示直播未开始(仅flash支持)。| | showBarTime | String | 控制栏自动隐藏时间ms。 |
| > | > | 4. “liveOverTime”“2016/08/17 14:00:00”,直播结束时间用于提示直播结束仅flash支持。| | extraInfo | String | 说明JSON 串用于定制性接口参数。 |
| enableSystemMenu | Boolean | 是否允许系统右键菜单显示默认为false。 | | > | > | 1.“fullTitle”“测试页面”全屏时显示视频标题仅 flash 支持)。 |
| format | String | 指定播放地址格式只有使用vid的播放方式时支持,可选值为mp4m3u8flvmp3默认为空仅H5支持。 | | > | > | 2. “m3u8BufferLength”“30”播放 m3u8 时加载缓存 ts 文件长度单位(秒)(仅 flash 支持)。 |
| mediaType | String | 指定返回音频还是视频只有使用vid的播放方式时支持。可选值为videoaudio默认为video,audio主要是针对只包含音频的视频格式比如音频的mp4仅H5支持。 | | > | > | 3. “liveStartTime”“2016/08/17 12:00:00”,直播开始时间,用于提示直播未开始(仅 flash 支持)。 |
| qualitySort | String | 指定排序方式只有使用vid + plauth播放方式时支持。desc表示按倒序排序从大到小排序,asc表示按正序排序从小到大排序,默认值asc仅H5支持。 | | > | > | 4. “liveOverTime”“2016/08/17 14:00:00”,直播结束时间,用于提示直播结束(仅 flash 支持)。 |
| definition | String | 显示视频清晰度多个用逗号分隔比如FD,LD此值是vid对应流清晰度的一个子集取值范围FD流畅LD标清SD高清HD超清OD原画2K2K4K4K仅H5支持。 | | enableSystemMenu | Boolean | 是否允许系统右键菜单显示,默认为 false。 |
| defaultDefinition | String | 默认视频清晰度此值是vid对应流的一个清晰度取值范围FD流畅LD标清SD高清HD超清OD原画2K2K4K4K,仅H5支持。| | format | String | 指定播放地址格式,只有使用 vid 的播放方式时支持,可选值为mp4m3u8flvmp3默认为空仅 H5 支持。 |
| x5_type | String | 声明启用同层H5播放器启用时设置的值为h5,详情参见同层播放。 | | mediaType | String | 指定返回音频还是视频,只有使用 vid 的播放方式时支持。可选值为videoaudio默认为video,audio主要是针对只包含音频的视频格式比如音频的 mp4仅 H5 支持。 |
| x5_fullscreen | Boolean | 声明视频播放时是否进入到TBS的全屏模式默认为false。当需要把视频做为背景时设置为true,详情参见同层播放。 | | qualitySort | String | 指定排序方式,只有使用 vid + plauth 播放方式时支持。desc表示按倒序排序从大到小排序,asc表示按正序排序从小到大排序,默认值asc仅 H5 支持。 |
| x5_video_position | String | 声明视频播在界面上的位置默认为“center”。可选值为“top”“center”,详情参见同层播放。 | | definition | String | 显示视频清晰度多个用逗号分隔比如FD,LD此值是 vid 对应流清晰度的一个子集取值范围FD流畅LD标清SD高清HD超清OD原画2K2K4K4K仅 H5 支持。 |
| x5_orientation | String | 声明TBS播放器支持的方向可选值landscape横屏,portraint竖屏,详情参见同层播放。 | | defaultDefinition | String | 默认视频清晰度,此值是 vid 对应流的一个清晰度取值范围FD流畅LD标清SD高清HD超清OD原画2K2K4K4K,仅 H5 支持。 |
| x5LandscapeAsFullScreen | String | 声明TBS全屏播放是否横屏默认值为true。 | | x5_type | String | 声明启用同层 H5 播放器启用时设置的值为h5,详情参见同层播放。 |
| autoPlayDelay | Number | 延迟播放时间,单位为秒。详情参见延迟播放 | | x5_fullscreen | Boolean | 声明视频播放时是否进入到 TBS 的全屏模式,默认为 false。当需要把视频做为背景时设置为 true,详情参见同层播放。 |
| autoPlayDelayDisplayText | String | 延迟播放提示文本,详情参见延迟播放。 | | x5_video_position | String | 声明视频播在界面上的位置默认为“center”。可选值为“top”“center”,详情参见同层播放。 |
| language | String | 国际化默认为zh-cn。如果未设置则采用浏览器语言。可选值为zh-cnen-us或其它值。 | | x5_orientation | String | 声明 TBS 播放器支持的方向可选值landscape横屏,portraint竖屏,详情参见同层播放。 |
| languageTexts | JSON | 自定义国际化文本json结构key的值需要和language属性值对应起来。例子{jp:{Play:”Play”}},自定义值参见Json结构。 | | x5LandscapeAsFullScreen | String | 声明 TBS 全屏播放是否横屏,默认值为 true。 |
| snapshot | Boolean | flash启用截图功能。 | | autoPlayDelay | Number | 延迟播放时间,单位为秒。详情参见延迟播放 |
| snapshotWatermark | Object | H5设置截图水印。 | | autoPlayDelayDisplayText | String | 延迟播放提示文本,详情参见延迟播放。 |
| useHlsPluginForSafari | Boolean | Safari浏览器可以启用Hls插件播放Safari 11除外。 | | language | String | 国际化默认为zh-cn。如果未设置则采用浏览器语言。可选值为zh-cnen-us或其它值。 |
| enableStashBufferForFlv | Boolean | H5播放flv时设置是否启用播放缓存只在直播下起作用。 | | languageTexts | JSON | 自定义国际化文本 json 结构key 的值需要和 language 属性值对应起来。例子:{jp:{Play:”Play”}},自定义值参见 Json 结构。 |
| stashInitialSizeForFlv | Number | H5播放flv时初始缓存大小只在直播下起作用。 | | snapshot | Boolean | flash 启用截图功能。 |
| loadDataTimeout | Number | 缓冲多长时间后提示用户切换低清晰度默认20秒。 | | snapshotWatermark | Object | H5 设置截图水印。 |
| waitingTimeout | Number | 最大缓冲超时时间超过这个时间会有错误提示默认60秒。 | | useHlsPluginForSafari | Boolean | Safari 浏览器可以启用 Hls 插件播放Safari 11 除外。 |
| liveStartTime | String | 直播开始时间直播时移功能使用格式为“2018/01/04 12:00:00”。 | | enableStashBufferForFlv | Boolean | H5 播放 flv 时,设置是否启用播放缓存,只在直播下起作用。 |
| liveOverTime | String | 直播结束时间直播时移功能使用格式为“2018/01/04 12:00:00”。 | | stashInitialSizeForFlv | Number | H5 播放 flv 时,初始缓存大小,只在直播下起作用。 |
| liveTimeShiftUrl | String | 直播可用时移查询地址,详情参见直播时移。 | | loadDataTimeout | Number | 缓冲多长时间后提示用户切换低清晰度默认20 秒。 |
| liveShiftSource | String | flv直播地址播放时hls的流地址详情参见直播时移。 | | waitingTimeout | Number | 最大缓冲超时时间超过这个时间会有错误提示默认60 秒。 |
| recreatePlayer | Function | flv直播和hls时移切换是重新创建播放器方法详情参见直播时移。 | | liveStartTime | String | 直播开始时间直播时移功能使用格式为“2018/01/04 12:00:00”。 |
| diagnosisButtonVisible | Boolean | 是否显示检测按钮默认为true。 | | liveOverTime | String | 直播结束时间直播时移功能使用格式为“2018/01/04 12:00:00”。 |
| disableSeek | Boolean | 禁用进度条的Seek默认为false仅Flash支持。 | | liveTimeShiftUrl | String | 直播可用时移查询地址,详情参见直播时移。 |
| encryptType | int | 加密类型播放点播私有加密视频时设置值为1默认值为0。 | | liveShiftSource | String | flv 直播地址播放时hls 的流地址,详情参见直播时移。 |
| progressMarkers | Array | 进度条打点内容数组,详情参见进度条打点。 | | recreatePlayer | Function | flv 直播和 hls 时移切换是,重新创建播放器方法,详情参见直播时移。 |
| vodRetry | int | 点播失败重试次数默认3次 | | diagnosisButtonVisible | Boolean | 是否显示检测按钮,默认为 true。 |
| liveRetry | int | 直播播放失败重试次数默认5次 | | disableSeek | Boolean | 禁用进度条的 Seek默认为 false仅 Flash 支持。 |
| encryptType | int | 加密类型,播放点播私有加密视频时,设置值为 1默认值为 0。 |
| progressMarkers | Array | 进度条打点内容数组,详情参见进度条打点。 |
| vodRetry | int | 点播失败重试次数,默认 3 次 |
| liveRetry | int | 直播播放失败重试次数,默认 5 次 |
### 3.2 播放器方法 ### 3.2 播放器方法
```javascript ```javascript
// 暂停播放 // 暂停播放
this.$refs.VueAliplayerV2.pause(); this.$refs.VueAliplayerV2.pause();
``` ```
可以参考 [播放器接口方法](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u63A5u53E32)
| 名称 | 参数 | 说明 | 可以参考 [播放器接口方法](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u63A5u53E32)
| :- | :- | :- |
| play | - | 播放视频。 | | 名称 | 参数 | 说明 |
| pause | - | 暂停视频。 | | :--------------------- | :------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| replay | - | 重播视频。 | | play | - | 播放视频。 |
| seek | time | 跳转到某个时刻进行播放time的单位为秒。 | | pause | - | 暂停视频。 |
| getCurrentTime | - | 获取当前的播放时刻,返回的单位为秒。 | | replay | - | 重播视频。 |
| getDuration | - | 获取视频总时长返回的单位为秒这个需要在视频加载完成以后才可以获取到可以在play事件后获取。 | | seek | time | 跳转到某个时刻进行播放time 的单位为秒。 |
| getVolume | - | 获取当前的音量返回值为0-1的实数。ios和部分android会失效。 | | getCurrentTime | - | 获取当前的播放时刻,返回的单位为秒。 |
| setVolume | - | 设置音量vol为0-1的实数ios和部分android会失效。 | | getDuration | - | 获取视频总时长,返回的单位为秒,这个需要在视频加载完成以后才可以获取到,可以在 play 事件后获取。 |
| loadByUrl | urltime | 直接播放视频urltime为可选值单位秒。目前只支持同种格式mp4/flv/m3u8之间切换。暂不支持直播rtmp流切换。 | | getVolume | - | 获取当前的音量,返回值为 0-1 的实数。ios 和部分 android 会失效。 |
| replayByVidAndPlayAuth | vid视频id,playauth播放凭证 | 目前只支持H5播放器。暂不支持不同格式视频间的之间切换。暂不支持直播rtmp流切换。 | | setVolume | - | 设置音量vol 为 0-1 的实数ios 和部分 android 会失效。 |
| replayByVidAndAuthInfo | 仅MPS用户时使用,参数顺序为vid、accId、accSecret、stsToken、authInfo、domainRegion | 目前只支持H5播放器。暂不支持不同格式视频间的之间切换。暂不支持直播rtmp流切换。 | | loadByUrl | urltime | 直接播放视频 urltime 为可选值单位秒。目前只支持同种格式mp4/flv/m3u8之间切换。暂不支持直播 rtmp 流切换。 |
| setPlayerSize | wh | 设置播放器大小wh可分别为400px像素或60%百分比。chrome浏览器下flash播放器分别不能小于397x297。 | | replayByVidAndPlayAuth | vid视频 id,playauth播放凭证 | 目前只支持 H5 播放器。暂不支持不同格式视频间的之间切换。暂不支持直播 rtmp 流切换。 |
| setSpeed | speed | 手动设置播放的倍速倍速播放仅H5支持。移动端可能会失效比如android微信。倍速播放UI默认是开启的。如果自定义过skinLaout属性需要添加speedButton项到数组里 | | replayByVidAndAuthInfo | 仅 MPS 用户时使用,参数顺序为vid、accId、accSecret、stsToken、authInfo、domainRegion | 目前只支持 H5 播放器。暂不支持不同格式视频间的之间切换。暂不支持直播 rtmp 流切换。 |
| > | > | {name“speedButton”align“tr”x10y23} | | setPlayerSize | wh | 设置播放器大小 wh 可分别为 400px 像素或 60%百分比。chrome 浏览器下 flash 播放器分别不能小于 397x297。 |
| setSanpshotProperties | width宽度,height高度,rate截图质量| 设置截图参数。 | | setSpeed | speed | 手动设置播放的倍速,倍速播放仅 H5 支持。移动端可能会失效,比如 android 微信。倍速播放 UI 默认是开启的。如果自定义过 skinLaout 属性,需要添加 speedButton 项到数组里: |
| requestFullScreen | - | 播放器全屏仅H5支持。 | | > | > | {name“speedButton”align“tr”x10y23} |
| cancelFullScreen | - | 播放器退出全屏iOS调用无效仅H5支持。 | | setSanpshotProperties | width宽度,height高度,rate截图质量 | 设置截图参数。 |
| getIsFullScreen | - | 获取播放器全屏状态仅H5支持。 | | requestFullScreen | - | 播放器全屏,仅 H5 支持。 |
| getStatus | - | 获取播放器状态包含的值init,ready,loading,play,pause,playing,waiting,error,ended | | cancelFullScreen | - | 播放器退出全屏iOS 调用无效,仅 H5 支持。 |
| setLiveTimeRange | 开始时间,结束时间 | 设置直播的开始结束时间开启直播时移功能时使用。例子player.liveShiftSerivce.setLiveTimeRange(“”2018/01/04 20:00:00) | | getIsFullScreen | - | 获取播放器全屏状态,仅 H5 支持。 |
| setRotate | rotate 旋转角度 | 参数为旋转角度, 正数为正时针旋转, 负数为逆时针旋转。例如: setRotate(90)。详情参见旋转和镜像。 | | getStatus | - | 获取播放器状态包含的值init,ready,loading,play,pause,playing,waiting,error,ended |
| getRotate | - | 获取旋转角度。详情参见旋转和镜像。 | | setLiveTimeRange | 开始时间,结束时间 | 设置直播的开始结束时间开启直播时移功能时使用。例子player.liveShiftSerivce.setLiveTimeRange(“”2018/01/04 20:00:00) |
| setImage | image镜像类型,可选值为horizon,vertical | 设置镜像,例如: setImage(horizon)。详情参见旋转和镜像。 | | setRotate | rotate 旋转角度 | 参数为旋转角度, 正数为正时针旋转, 负数为逆时针旋转。例如: setRotate(90)。详情参见旋转和镜像。 |
| dispose | - | 播放器销毁 | | getRotate | - | 获取旋转角度。详情参见旋转和镜像。 |
| setCover | cover封面地址 | 设置封面 | | setImage | image镜像类型,可选值为horizon,vertical | 设置镜像,例如: setImage(horizon)。详情参见旋转和镜像。 |
| setProgressMarkers | markers打点数据集合 | 设置打点数据 | | dispose | - | 播放器销毁 |
| setPreviewTime | time试看时间 | 设置试看时间,单位为秒,详情参见试看 | | setCover | cover 封面地址 | 设置封面 |
| getPreviewTime | - | 获取试看时间 | | setProgressMarkers | markers 打点数据集合 | 设置打点数据 |
| isPreview | - | 是否试看 | | setPreviewTime | time 试看时间 | 设置试看时间,单位为秒,详情参见试看 |
| off | ev:事件名[String],handle,事件回调方法[Function] | 通过播放器实例的off方法取消绑定的方法 | | getPreviewTime | - | 获取试看时间 |
| isPreview | - | 是否试看 |
| off | ev:事件名[String],handle,事件回调方法[Function] | 通过播放器实例的 off 方法取消绑定的方法 |
## 4.播放器事件 ## 4.播放器事件
```html ```html
<template> <template>
<vue-aliplayer-v2 @ready="handleReady" /> <vue-aliplayer-v2 @ready="handleReady" />
</template> </template>
<script> <script>
export default { export default {
methods:{ methods: {
/** /**
* 播放器事件回调 * 播放器事件回调
*/ */
handleReady(e){ handleReady(e) {
console.log(`ready`,e); console.log(`ready`, e);
} },
} },
} };
</script> </script>
``` ```
可以参考 [播放器事件](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u4E8Bu4EF63) 可以参考 [播放器事件](https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u4E8Bu4EF63)
| 名称 | 说明 | | 名称 | 说明 |
| :- | :- | | :---------------- | :--------------------------------------------------------------------------------------------------------------------------------------- |
| ready | 播放器视频初始化按钮渲染完毕。播放器UI初始设置需要此事件后触发避免UI被初始化所覆盖。播放器提供的方法需要在此事件发生后才可以调用。 | | ready | 播放器视频初始化按钮渲染完毕。播放器 UI 初始设置需要此事件后触发,避免 UI 被初始化所覆盖。播放器提供的方法需要在此事件发生后才可以调用。 |
| play | 视频由暂停恢复为播放时触发。 | | play | 视频由暂停恢复为播放时触发。 |
| pause | 视频暂停时触发。 | | pause | 视频暂停时触发。 |
| canplay | 能够开始播放音频/视频时发生会多次触发仅H5播放器。 | | canplay | 能够开始播放音频/视频时发生,会多次触发,仅 H5 播放器。 |
| playing | 播放中,会触发多次。 | | playing | 播放中,会触发多次。 |
| ended | 当前视频播放完毕时触发。 | | ended | 当前视频播放完毕时触发。 |
| liveStreamStop | 直播流中断时触发。m3u8/flv/rtmp在重试5次未成功后触发。提示上层流中断或需要重新加载视频。PSm3u8一直自动重试不需要上层添加重试。 | | liveStreamStop | 直播流中断时触发。m3u8/flv/rtmp 在重试 5 次未成功后触发。提示上层流中断或需要重新加载视频。PSm3u8 一直自动重试,不需要上层添加重试。 |
| onM3u8Retry | m3u8直播流中断后重试事件,每次断流只触发一次。 | | onM3u8Retry | m3u8 直播流中断后重试事件,每次断流只触发一次。 |
| hideBar | 控制栏自动隐藏事件。 | | hideBar | 控制栏自动隐藏事件。 |
| showBar | 控制栏自动显示事件。 | | showBar | 控制栏自动显示事件。 |
| waiting | 数据缓冲事件。 | | waiting | 数据缓冲事件。 |
| timeupdate | 播放位置发生改变时触发仅H5播放器。可通过getCurrentTime方法得到当前播放时间。 | | timeupdate | 播放位置发生改变时触发,仅 H5 播放器。可通过 getCurrentTime 方法,得到当前播放时间。 |
| snapshoted | 截图完成事件。 | | snapshoted | 截图完成事件。 |
| requestFullScreen | 全屏事件仅H5支持。 | | requestFullScreen | 全屏事件,仅 H5 支持。 |
| cancelFullScreen | 取消全屏事件iOS下不会触发仅H5支持。 | | cancelFullScreen | 取消全屏事件iOS 下不会触发,仅 H5 支持。 |
| error | 错误事件。 | | error | 错误事件。 |
| startSeek | 开始拖拽,参数返回拖拽点的时间。 | | startSeek | 开始拖拽,参数返回拖拽点的时间。 |
| completeSeek | 完成拖拽,参数返回拖拽点的时间。 | | completeSeek | 完成拖拽,参数返回拖拽点的时间。 |
--- ---
## 5. 图片展示 ## 5. 图片展示
![图片1](https://github.com/langyuxiansheng/vue-aliplayer-v2/blob/master/images/p1.png) ![图片1](https://github.com/langyuxiansheng/vue-aliplayer-v2/blob/master/images/p1.png)
![图片2](https://github.com/langyuxiansheng/vue-aliplayer-v2/blob/master/images/p2.png) ![图片2](https://github.com/langyuxiansheng/vue-aliplayer-v2/blob/master/images/p2.png)
--- ---
## 6.二次开发 下载项目 ## 6.二次开发 下载项目
@ -375,6 +417,7 @@ git clone https://github.com/langyuxiansheng/vue-aliplayer-v2.git
``` ```
## Project setup ## Project setup
```bash ```bash
cd vue-aliplayer-v2 cd vue-aliplayer-v2
@ -382,70 +425,88 @@ npm install
``` ```
### Compiles and hot-reloads for development ### Compiles and hot-reloads for development
```bash ```bash
npm run dev npm run dev
``` ```
### Compiles and minifies for production ### Compiles and minifies for production
```bash ```bash
npm run build npm run build
``` ```
### Lints and fixes files ### Lints and fixes files
```bash ```bash
npm run lint npm run lint
``` ```
## 7.缺陷 & 后期计划 ## 7.缺陷 & 后期计划
> 2019年12月27日 更新优化局部引用方式
> 您有功能建议,或者bug反馈请留言. > 2019 年 12 月 27 日 更新优化局部引用方式
> 您有功能建议,或者 bug 反馈请留言.
## 8.感谢 ## 8.感谢
--- ---
- vue-aliplayer 的作者,项目地址:https://github.com/slacrey/vue-aliplayer - vue-aliplayer 的作者,项目地址:https://github.com/slacrey/vue-aliplayer
- Alipayer 阿里云的开源播放器 https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u4E8Bu4EF63 - Alipayer 阿里云的开源播放器 https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1085.36fc6fc57WKZ5P#h2-u64ADu653Eu5668u4E8Bu4EF63
### Customize configuration ### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/). See [Configuration Reference](https://cli.vuejs.org/config/).
## 更新日志 ## 更新日志
> v1.2.7 更换底层默认sdk版本为2.9.1的版本. 更新线上演示demo的选项 > v1.3.0 修复部分已知bug,增加forbidFastForward 属性,感谢 "william-xue"网友的功能提交.
> v1.2.6 优化beforeDestroy() 部分的代码. - sdk 版本更新,默认 SDK 版本由 2.9.3 更新为 2.9.20
- 默认注释更新
- 增加禁止用户拖拽快进的属性选项 forbidFastForward [Boolean] 默认 false
> v1.2.5 更换默认的播放器SDK版本2.8.2 => 2.9.0,2.8.2的版本存在多个播放器同时播放直播流异常的bug,增加了全局SDK版本配置,可以在Vue.use()的时候进行配置. > v1.2.9 修正部分默认属性, 感谢"Schean17"网友的反馈与建议.
> v1.2.4 修复多个播放器加载,只初始化一个播放器的bug.文档部分更新,增加了问题栏. 感谢"沙洲ad"的反馈与建议. > v1.2.8 更换底层默认 sdk 版本为 2.9.3 修复 options 遇到 update loop 错误 感谢"litmonw"网友的反馈与建议.
> v1.2.7 更换底层默认 sdk 版本为 2.9.1 的版本. 更新线上演示 demo 的选项
> v1.2.6 优化 beforeDestroy() 部分的代码.
> v1.2.5 更换默认的播放器 SDK 版本 2.8.2 => 2.9.0,2.8.2 的版本存在多个播放器同时播放直播流异常的 bug,增加了全局 SDK 版本配置,可以在 Vue.use()的时候进行配置.
> v1.2.4 修复多个播放器加载,只初始化一个播放器的 bug.文档部分更新,增加了问题栏. 感谢"沙洲 ad"的反馈与建议.
> v1.2.3 优化播放器的初始化代码,调整包内结构,优化局部组件的注册方式,也兼容老版本的引用方式.文档部分更新,增加了问题栏. 感谢"liangzhiyuan2015"和"fancheur"两位网友的反馈与建议. > v1.2.3 优化播放器的初始化代码,调整包内结构,优化局部组件的注册方式,也兼容老版本的引用方式.文档部分更新,增加了问题栏. 感谢"liangzhiyuan2015"和"fancheur"两位网友的反馈与建议.
> v1.2.2 修复指定id情况下,播放器报错"没有为播放器指定容器",目前移除外部指定id的方式,所有的播放器id都由内部生成,不再由外部指定容器(外部指定的意义并不大),其它的说明:更新1.2.1后报错Uncaught TypeError: 没有为播放器指定容器,因为源码中变更了部分代码,以及最大限度的简化代码,组件内部的根容器就只有一个div容器,导致以前外部指定id的时候,容器id与外部的不一致,导致抛出异常了,现在已经紧急修复了,若在使用,请更新到v1.2.2的版本;如果使用了外部指定id的方式请移除外部的id.否则id会出现重复的情况., 感谢"liyoro"的反馈和建议. > v1.2.2 修复指定 id 情况下,播放器报错"没有为播放器指定容器",目前移除外部指定 id 的方式,所有的播放器 id 都由内部生成,不再由外部指定容器(外部指定的意义并不大),其它的说明:更新 1.2.1 后报错 Uncaught TypeError: 没有为播放器指定容器,因为源码中变更了部分代码,以及最大限度的简化代码,组件内部的根容器就只有一个 div 容器,导致以前外部指定 id 的时候,容器 id 与外部的不一致,导致抛出异常了,现在已经紧急修复了,若在使用,请更新到 v1.2.2 的版本;如果使用了外部指定 id 的方式请移除外部的 id.否则 id 会出现重复的情况., 感谢"liyoro"的反馈和建议.
> v1.2.1 修复直播播放的情况下,播放器已经销毁,而后台还在继续下载资源造成卡顿的bug,修复多个播放器只渲染1个的bug, 感谢"Jonauil"和"guangming95"两位网友的反馈和建议. > v1.2.1 修复直播播放的情况下,播放器已经销毁,而后台还在继续下载资源造成卡顿的 bug,修复多个播放器只渲染 1 个的 bug, 感谢"Jonauil"和"guangming95"两位网友的反馈和建议.
> v1.2.0 修复播放源(MP4/m3u8)之间切换无法正常播放的bug,增加options配置项动态响应功能,优化部分播放器的逻辑, 感谢"liyoro"网友的反馈和建议. > v1.2.0 修复播放源(MP4/m3u8)之间切换无法正常播放的 bug,增加 options 配置项动态响应功能,优化部分播放器的逻辑, 感谢"liyoro"网友的反馈和建议.
> v1.1.9 修复播放源(修复prop:source类型验证报错), 感谢"hugo2017"和“nullF”网友的反馈. > v1.1.9 修复播放源(修复 prop:source 类型验证报错), 感谢"hugo2017"和“nullF”网友的反馈.
> v1.1.8 修复播放源(增加source属性类型错误),修复获取播放器状态 getStatus()方法报错, 感谢"kongjigu"网友的反馈. > v1.1.8 修复播放源(增加 source 属性类型错误),修复获取播放器状态 getStatus()方法报错, 感谢"kongjigu"网友的反馈.
> v1.1.7 增加动态切换播放源(增加source属性)功能 感谢"wikimo"和"jieruian"两位网友的反馈建议. > v1.1.7 增加动态切换播放源(增加 source 属性)功能 感谢"wikimo"和"jieruian"两位网友的反馈建议.
> v1.1.6 修复部分已知bug和优化局部的引用方式 > v1.1.6 修复部分已知 bug 和优化局部的引用方式
--- ---
## 其它问题 ## 其它问题
1. IOS 或者其它设备无法全屏播放,或者点击全屏按钮的时候也只是显示竖屏? 1. IOS 或者其它设备无法全屏播放,或者点击全屏按钮的时候也只是显示竖屏?
> 方案与问题所在: > 方案与问题所在:
一般情况下可能是开启了强制竖屏(也就是屏幕锁定)打开后就会竖屏而不会全屏了!如下关闭就可以了: 一般情况下可能是开启了强制竖屏(也就是屏幕锁定)打开后就会竖屏而不会全屏了!如下关闭就可以了:
参考issues: https://github.com/langyuxiansheng/vue-aliplayer-v2/issues/25 参考 issues: https://github.com/langyuxiansheng/vue-aliplayer-v2/issues/25
-开启了屏幕锁定,只要上拉控制中心,点击屏幕锁定关闭就可以了! -开启了屏幕锁定,只要上拉控制中心,点击屏幕锁定关闭就可以了!
-也可能是播放器或者浏览器兼容性问题. -也可能是播放器或者浏览器兼容性问题.

View File

@ -1,7 +1,9 @@
<template> <template>
<div id="app"> <div id="app">
<template v-if="!isShowMultiple && show"> <template v-if="!isShowMultiple && show">
<vue-aliplayer-v2 :source="source" ref="VueAliplayerV2" :options="options" /> <vue-aliplayer-v2 :source="source" ref="VueAliplayerV2" :options="options"
:forbidFastForward="forbidFastForward"
/>
</template> </template>
<div v-if="isShowMultiple && show" class="show-multiple"> <div v-if="isShowMultiple && show" class="show-multiple">
<template v-for="x in 5"> <template v-for="x in 5">
@ -11,11 +13,13 @@
<p class="remove-text" v-if="!show">播放器已销毁!</p> <p class="remove-text" v-if="!show">播放器已销毁!</p>
<div class="player-btns"> <div class="player-btns">
<template v-if="!isShowMultiple && show"> <template v-if="!isShowMultiple && show">
<span @click="play()">播放</span> <span @click="play()">播放</span>
<span @click="pause()">暂停</span> <span @click="pause()">暂停</span>
<span @click="replay()">重播</span> <span @click="replay()">重播</span>
<span @click="getCurrentTime()">播放时刻</span> <span @click="getCurrentTime()">播放时刻</span>
<span @click="getStatus()">获取播放器状态</span> <span @click="getStatus()">获取播放器状态</span>
<span @click="handlerForbidFastForward()">禁止快进</span>
</template> </template>
<span @click="show = !show">{{ show ? '销毁' : '重载' }}</span> <span @click="show = !show">{{ show ? '销毁' : '重载' }}</span>
<span @click="options.isLive = !options.isLive">{{ options.isLive ? '切换普通模式' : '切换直播模式' }}</span> <span @click="options.isLive = !options.isLive">{{ options.isLive ? '切换普通模式' : '切换直播模式' }}</span>
@ -54,47 +58,89 @@
// import VueAliplayerV2 from '../packages'; // import VueAliplayerV2 from '../packages';
export default { export default {
// components:{ VueAliplayerV2 }, // components:{ VueAliplayerV2 },
data(){ data () {
return { return {
options: { options: {
// source:'//player.alicdn.com/video/aliyunmedia.mp4', // source:'//player.alicdn.com/video/aliyunmedia.mp4',
isLive: !true, // isLive: !true, //
useFlashPrism: false, //flash // skinLayout: [
disableSeek: true //Seekfalse // {
// 'name': 'bigPlayButton',
// 'align': 'blabs',
// 'x': 30,
// 'y': 80
// },
// {
// 'name': 'infoDisplay'
// },
// {
// 'name': 'controlBar',
// 'align': 'blabs',
// 'x': 0,
// 'y': 0,
// 'children': [
// {
// 'name': 'liveDisplay',
// 'align': 'tlabs',
// 'x': 15,
// 'y': 6
// },
// {
// 'name': 'fullScreenButton',
// 'align': 'tr',
// 'x': 10,
// 'y': 10
// },
// {
// 'name': 'volume',
// 'align': 'tr',
// 'x': 5,
// 'y': 10
// }
// ]
// }]
// useFlashPrism: false, //flash
// disableSeek: true //Seekfalse
}, },
source: '//player.alicdn.com/video/aliyunmedia.mp4', source: '//player.alicdn.com/video/aliyunmedia.mp4',
// source: '//ivi.bupt.edu.cn/hls/cctv1.m3u8', // source: '//ivi.bupt.edu.cn/hls/cctv1.m3u8',
show: true, show: true,
forbidFastForward: false,
isShowMultiple: false, isShowMultiple: false,
} }
}, },
methods:{ methods: {
play(){ play () {
this.$refs.VueAliplayerV2.play() this.$refs.VueAliplayerV2.play()
}, },
pause(){ pause () {
this.$refs.VueAliplayerV2.pause(); this.$refs.VueAliplayerV2.pause();
}, },
replay(){ replay () {
this.$refs.VueAliplayerV2.replay(); this.$refs.VueAliplayerV2.replay();
}, },
handlerForbidFastForward () {
getCurrentTime(){ this.forbidFastForward = true
},
getCurrentTime () {
// this.$refs.VueAliplayerV2.getCurrentTime(); // this.$refs.VueAliplayerV2.getCurrentTime();
this.source = 'http://ivi.bupt.edu.cn/hls/cctv1.m3u8'; this.source = 'http://ivi.bupt.edu.cn/hls/cctv1.m3u8';
}, },
getStatus(){ getStatus () {
const status = this.$refs.VueAliplayerV2.getStatus(); const status = this.$refs.VueAliplayerV2.getStatus();
console.log(`getStatus:`, status); console.log(`getStatus:`, status);
alert(`getStatus:${status}`); alert(`getStatus:${status}`);
}, },
showMultiple(){ showMultiple () {
this.isShowMultiple = !this.isShowMultiple; this.isShowMultiple = !this.isShowMultiple;
} }
} }
@ -105,19 +151,19 @@ export default {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
.remove-text{ .remove-text {
text-align: center; text-align: center;
padding: 20px; padding: 20px;
font-size: 24px; font-size: 24px;
} }
.show-multiple{ .show-multiple {
display: flex; display: flex;
.multiple-player{ .multiple-player {
width: calc(100% / 4); width: calc(100% / 4);
margin: 20px; margin: 20px;
} }
} }
.player-btns{ .player-btns {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
@ -137,18 +183,18 @@ export default {
cursor: pointer; cursor: pointer;
} }
} }
.source-box{ .source-box {
padding: 5px 10px; padding: 5px 10px;
margin-bottom: 10px; margin-bottom: 10px;
.source-label{ .source-label {
margin-right: 20px; margin-right: 20px;
font-size: 16px; font-size: 16px;
display: block; display: block;
} }
#source{ #source {
margin-top: 10px; margin-top: 10px;
} }
.source-input{ .source-input {
margin-top: 10px; margin-top: 10px;
padding: 5px 10px; padding: 5px 10px;
width: 80%; width: 80%;

23
gh-page.sh Normal file
View File

@ -0,0 +1,23 @@
echo "打包 => dist";
npm run build;
echo "更新gh-pages";
git branch -D gh-pages;
echo "删除gh-pages";
git checkout -b gh-pages;
echo "创建并切换到gh-pages";
git add -f dist;
git commit -m 'create gh-pages';
git push origin -d gh-pages;
git subtree push --prefix dist origin gh-pages;
echo "已推送gh-pages";

View File

@ -142,24 +142,47 @@ if (typeof window !== 'undefined') {
// EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js // EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js
var es6_function_name = __webpack_require__("7cfd"); var es6_function_name = __webpack_require__("7cfd");
// CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"05d0d90a-vue-loader-template"}!./node_modules/_vue-loader@15.7.2@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=template&id=3905f692& // CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"05d0d90a-vue-loader-template"}!./node_modules/_vue-loader@15.7.2@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=template&id=c8a41478&
var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":_vm.playerId}})} var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":_vm.playerId}})}
var staticRenderFns = [] var staticRenderFns = []
// CONCATENATED MODULE: ./packages/AliplayerV2/index.vue?vue&type=template&id=3905f692& // CONCATENATED MODULE: ./packages/AliplayerV2/index.vue?vue&type=template&id=c8a41478&
// CONCATENATED MODULE: ./node_modules/_@babel_runtime@7.7.2@@babel/runtime/helpers/esm/typeof.js
function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
function _typeof(obj) {
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
_typeof = function _typeof(obj) {
return _typeof2(obj);
};
} else {
_typeof = function _typeof(obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
};
}
return _typeof(obj);
}
// EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js // EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js
var es6_regexp_to_string = __webpack_require__("cc1d"); var es6_regexp_to_string = __webpack_require__("cc1d");
// CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_thread-loader@2.1.3@thread-loader/dist/cjs.js!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=script&lang=js& // CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_thread-loader@2.1.3@thread-loader/dist/cjs.js!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=script&lang=js&
// //
// //
// //
/* harmony default export */ var AliplayerV2vue_type_script_lang_js_ = ({ /* harmony default export */ var AliplayerV2vue_type_script_lang_js_ = ({
name: 'VueAliplayerV2', name: 'VueAliplayerV2',
props: { props: {
forbidFastForward: {
//禁止拖拽快进
required: false,
type: [Boolean],
default: false
},
options: { options: {
//配置项 //配置项
required: false, required: false,
@ -178,13 +201,13 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
//css版本源 //css版本源
required: false, required: false,
type: [String], type: [String],
default: "https://g.alicdn.com/de/prismplayer/2.9.1/skins/default/aliplayer-min.css" default: "https://g.alicdn.com/de/prismplayer/2.9.20/skins/default/aliplayer-min.css"
}, },
scriptSrc: { scriptSrc: {
//js版本源 //js版本源
required: false, required: false,
type: [String], type: [String],
default: "https://g.alicdn.com/de/prismplayer/2.9.1/aliplayer-min.js" default: "https://g.alicdn.com/de/prismplayer/2.9.20/aliplayer-min.js"
} }
}, },
data: function data() { data: function data() {
@ -287,6 +310,9 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
//监听播放源变化 //监听播放源变化
this.init(); this.init();
}, },
forbidFastForward: function forbidFastForward() {
this.init();
},
options: { options: {
//配置项是对象,只能深度监听 //配置项是对象,只能深度监听
handler: function handler() { handler: function handler() {
@ -311,6 +337,8 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
}); });
}, },
methods: { methods: {
handlerFastForward: function handlerFastForward() {},
/** /**
* 创建script和css * 创建script和css
* 加载Alipayer的SDK * 加载Alipayer的SDK
@ -362,7 +390,7 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
var _this4 = this; var _this4 = this;
if (typeof window.Aliplayer != 'undefined') { if (typeof window.Aliplayer != 'undefined') {
var options = this.options; var options = this.deepCloneObject(this.options);
if (options) { if (options) {
for (var key in options) { for (var key in options) {
@ -387,6 +415,25 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
for (var ev in this.events) { for (var ev in this.events) {
_loop(ev); _loop(ev);
} //开启禁止拖拽快进
if (this.forbidFastForward) {
var last = 0,
max_time = 0;
this.player.on('timeupdate', function () {
var current = this.getCurrentTime();
if (current - last > 2) {
this.seek(last);
} else {
last = current;
if (last >= max_time) {
max_time = last;
}
}
});
} //通过播放器实例的off方法取消订阅 } //通过播放器实例的off方法取消订阅
//player.off('ready',handleReady); //player.off('ready',handleReady);
@ -666,6 +713,30 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
*/ */
off: function off(ev, handle) { off: function off(ev, handle) {
this.player && this.player.off(ev, handle); this.player && this.player.off(ev, handle);
},
/**
* 深度拷贝
* @param {*} obj
*/
deepCloneObject: function deepCloneObject(obj) {
var objClone = Array.isArray(obj) ? [] : {};
if (obj && _typeof(obj) === 'object') {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象如果是递归复制
if (obj[key] && _typeof(obj[key]) === 'object') {
objClone[key] = this.deepCloneObject(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
} }
}, },
beforeDestroy: function beforeDestroy() { beforeDestroy: function beforeDestroy() {

View File

@ -151,24 +151,47 @@ if (typeof window !== 'undefined') {
// EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js // EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.function.name.js
var es6_function_name = __webpack_require__("7cfd"); var es6_function_name = __webpack_require__("7cfd");
// CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"05d0d90a-vue-loader-template"}!./node_modules/_vue-loader@15.7.2@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=template&id=3905f692& // CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"05d0d90a-vue-loader-template"}!./node_modules/_vue-loader@15.7.2@vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=template&id=c8a41478&
var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":_vm.playerId}})} var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":_vm.playerId}})}
var staticRenderFns = [] var staticRenderFns = []
// CONCATENATED MODULE: ./packages/AliplayerV2/index.vue?vue&type=template&id=3905f692& // CONCATENATED MODULE: ./packages/AliplayerV2/index.vue?vue&type=template&id=c8a41478&
// CONCATENATED MODULE: ./node_modules/_@babel_runtime@7.7.2@@babel/runtime/helpers/esm/typeof.js
function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
function _typeof(obj) {
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
_typeof = function _typeof(obj) {
return _typeof2(obj);
};
} else {
_typeof = function _typeof(obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
};
}
return _typeof(obj);
}
// EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js // EXTERNAL MODULE: ./node_modules/_core-js@2.6.10@core-js/modules/es6.regexp.to-string.js
var es6_regexp_to_string = __webpack_require__("cc1d"); var es6_regexp_to_string = __webpack_require__("cc1d");
// CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_thread-loader@2.1.3@thread-loader/dist/cjs.js!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=script&lang=js& // CONCATENATED MODULE: ./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_thread-loader@2.1.3@thread-loader/dist/cjs.js!./node_modules/_babel-loader@8.0.6@babel-loader/lib!./node_modules/_cache-loader@2.0.1@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.7.2@vue-loader/lib??vue-loader-options!./packages/AliplayerV2/index.vue?vue&type=script&lang=js&
// //
// //
// //
/* harmony default export */ var AliplayerV2vue_type_script_lang_js_ = ({ /* harmony default export */ var AliplayerV2vue_type_script_lang_js_ = ({
name: 'VueAliplayerV2', name: 'VueAliplayerV2',
props: { props: {
forbidFastForward: {
//禁止拖拽快进
required: false,
type: [Boolean],
default: false
},
options: { options: {
//配置项 //配置项
required: false, required: false,
@ -187,13 +210,13 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
//css版本源 //css版本源
required: false, required: false,
type: [String], type: [String],
default: "https://g.alicdn.com/de/prismplayer/2.9.1/skins/default/aliplayer-min.css" default: "https://g.alicdn.com/de/prismplayer/2.9.20/skins/default/aliplayer-min.css"
}, },
scriptSrc: { scriptSrc: {
//js版本源 //js版本源
required: false, required: false,
type: [String], type: [String],
default: "https://g.alicdn.com/de/prismplayer/2.9.1/aliplayer-min.js" default: "https://g.alicdn.com/de/prismplayer/2.9.20/aliplayer-min.js"
} }
}, },
data: function data() { data: function data() {
@ -296,6 +319,9 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
//监听播放源变化 //监听播放源变化
this.init(); this.init();
}, },
forbidFastForward: function forbidFastForward() {
this.init();
},
options: { options: {
//配置项是对象,只能深度监听 //配置项是对象,只能深度监听
handler: function handler() { handler: function handler() {
@ -320,6 +346,8 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
}); });
}, },
methods: { methods: {
handlerFastForward: function handlerFastForward() {},
/** /**
* 创建script和css * 创建script和css
* 加载Alipayer的SDK * 加载Alipayer的SDK
@ -371,7 +399,7 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
var _this4 = this; var _this4 = this;
if (typeof window.Aliplayer != 'undefined') { if (typeof window.Aliplayer != 'undefined') {
var options = this.options; var options = this.deepCloneObject(this.options);
if (options) { if (options) {
for (var key in options) { for (var key in options) {
@ -396,6 +424,25 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
for (var ev in this.events) { for (var ev in this.events) {
_loop(ev); _loop(ev);
} //开启禁止拖拽快进
if (this.forbidFastForward) {
var last = 0,
max_time = 0;
this.player.on('timeupdate', function () {
var current = this.getCurrentTime();
if (current - last > 2) {
this.seek(last);
} else {
last = current;
if (last >= max_time) {
max_time = last;
}
}
});
} //通过播放器实例的off方法取消订阅 } //通过播放器实例的off方法取消订阅
//player.off('ready',handleReady); //player.off('ready',handleReady);
@ -675,6 +722,30 @@ var es6_regexp_to_string = __webpack_require__("cc1d");
*/ */
off: function off(ev, handle) { off: function off(ev, handle) {
this.player && this.player.off(ev, handle); this.player && this.player.off(ev, handle);
},
/**
* 深度拷贝
* @param {*} obj
*/
deepCloneObject: function deepCloneObject(obj) {
var objClone = Array.isArray(obj) ? [] : {};
if (obj && _typeof(obj) === 'object') {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象如果是递归复制
if (obj[key] && _typeof(obj[key]) === 'object') {
objClone[key] = this.deepCloneObject(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
} }
}, },
beforeDestroy: function beforeDestroy() { beforeDestroy: function beforeDestroy() {

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"name": "vue-aliplayer-v2", "name": "vue-aliplayer-v2",
"version": "1.2.7", "version": "1.3.1",
"author": "yxs", "author": "yxs",
"description": "感谢每一位支持开源的朋友. 这是一个基于Alipayer 开发并封装成vue组件的集成播放器.可播放rtmp,m3u8,mp4....视频.除支持直播流与点播的基础功能外,也支持视频的加密播放、清晰度切换、直播时移等业务场景", "description": "感谢每一位支持开源的朋友. 这是一个基于Alipayer 开发并封装成vue组件的集成播放器.可播放rtmp,m3u8,mp4....视频.除支持直播流与点播的基础功能外,也支持视频的加密播放、清晰度切换、直播时移等业务场景",
"main": "lib/vue-aliplayer-v2.umd.min.js", "main": "lib/vue-aliplayer-v2.umd.min.js",

View File

@ -5,6 +5,11 @@
export default { export default {
name: 'VueAliplayerV2', name: 'VueAliplayerV2',
props: { props: {
forbidFastForward: { //
required: false,
type: [Boolean],
default: false
},
options: { // options: { //
required: false, required: false,
type: [Object], type: [Object],
@ -15,22 +20,22 @@ export default {
type: [String], type: [String],
default: null default: null
}, },
cssLink:{ //css cssLink: { //css
required: false, required: false,
type: [String], type: [String],
default: `https://g.alicdn.com/de/prismplayer/2.9.1/skins/default/aliplayer-min.css` default: `https://g.alicdn.com/de/prismplayer/2.9.20/skins/default/aliplayer-min.css`
}, },
scriptSrc:{ //js scriptSrc: { //js
required: false, required: false,
type: [String], type: [String],
default: `https://g.alicdn.com/de/prismplayer/2.9.1/aliplayer-min.js` default: `https://g.alicdn.com/de/prismplayer/2.9.20/aliplayer-min.js`
} }
}, },
data () { data () {
return { return {
player: null, // player: null, //
playerId: `player-${Math.random().toString(36).substr(2).toLocaleUpperCase()}`, playerId: `player-${Math.random().toString(36).substr(2).toLocaleUpperCase()}`,
config:{ config: {
id: null, //ID id: null, //ID
width: '100%', width: '100%',
autoplay: true, autoplay: true,
@ -38,7 +43,7 @@ export default {
//, //,
// source: 'rtmp://182.145.195.238:1935/hls/1194076936807170050', // source: 'rtmp://182.145.195.238:1935/hls/1194076936807170050',
}, },
events:[ events: [
/** /**
* 播放器视频初始化按钮渲染完毕 * 播放器视频初始化按钮渲染完毕
* 播放器UI初始设置需要此事件后触发避免UI被初始化所覆盖 * 播放器UI初始设置需要此事件后触发避免UI被初始化所覆盖
@ -120,43 +125,49 @@ export default {
], ],
}; };
}, },
watch:{ watch: {
source(){ // source () { //
this.init(); this.init();
}, },
forbidFastForward () {
this.init();
options:{ //, },
handler(){
this.init(); options: { //,
handler () {
this.init();
}, },
deep:true deep: true
} }
}, },
mounted () { mounted () {
this.$nextTick(()=>{ this.$nextTick(() => {
this.init(); this.init();
}); });
}, },
updated(){ updated () {
// //
this.$nextTick(()=>{ this.$nextTick(() => {
this.init(); this.init();
}); });
}, },
methods: { methods: {
handlerFastForward () {
},
/** /**
* 创建script和css * 创建script和css
* 加载Alipayer的SDK * 加载Alipayer的SDK
*/ */
init(){ init () {
const linkID = 'app__aliplayer-min-css'; const linkID = 'app__aliplayer-min-css';
const scriptID = 'app__aliplayer-min-js'; const scriptID = 'app__aliplayer-min-js';
const head = document.getElementsByTagName('head'); const head = document.getElementsByTagName('head');
const html = document.getElementsByTagName('html'); const html = document.getElementsByTagName('html');
let scriptTag = document.getElementById(scriptID); let scriptTag = document.getElementById(scriptID);
let linkIDTag = document.getElementById(linkID); let linkIDTag = document.getElementById(linkID);
if(!linkIDTag) { if (!linkIDTag) {
// console.log('linkIDTag'); // console.log('linkIDTag');
const link = document.createElement('link'); const link = document.createElement('link');
link.type = 'text/css'; link.type = 'text/css';
@ -166,7 +177,7 @@ export default {
// link.className = linkID; // link.className = linkID;
head[0].appendChild(link); head[0].appendChild(link);
} }
if(!scriptTag) { if (!scriptTag) {
// console.log('scriptTag'); // console.log('scriptTag');
scriptTag = document.createElement('script'); scriptTag = document.createElement('script');
scriptTag.type = "text/javascript"; scriptTag.type = "text/javascript";
@ -187,24 +198,42 @@ export default {
* 创建播放器 * 创建播放器
* @description SDK文档地址:https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1084.131d1c4cJT7o5Z * @description SDK文档地址:https://help.aliyun.com/document_detail/125572.html?spm=a2c4g.11186623.6.1084.131d1c4cJT7o5Z
*/ */
initPlayer(){ initPlayer () {
if(typeof window.Aliplayer != 'undefined') { if (typeof window.Aliplayer != 'undefined') {
const options = this.options; const options = this.deepCloneObject(this.options);
if(options){ if (options) {
for (const key in options) { for (const key in options) {
this.config[key] = options[key]; this.config[key] = options[key];
} }
} }
if(this.source) this.config.source = this.source; // if (this.source) this.config.source = this.source; //
this.config.id = this.playerId; //id this.config.id = this.playerId; //id
this.player && this.player.dispose(); // this.player && this.player.dispose(); //
this.player = Aliplayer(this.config); this.player = Aliplayer(this.config);
for(const ev in this.events){ for (const ev in this.events) {
this.player && this.player.on(this.events[ev],(e)=>{ this.player && this.player.on(this.events[ev], (e) => {
// console.log(`object ${this.events[ev]}`,e); // console.log(`object ${this.events[ev]}`,e);
this.$emit(this.events[ev],e); this.$emit(this.events[ev], e);
}); });
} }
//
if (this.forbidFastForward) {
let last = 0, max_time = 0;
this.player.on('timeupdate', function () {
let current = this.getCurrentTime();
if (current - last > 2) {
this.seek(last);
} else {
last = current;
if (last >= max_time) {
max_time = last;
}
}
});
}
//off //off
//player.off('ready',handleReady); //player.off('ready',handleReady);
} }
@ -213,14 +242,14 @@ export default {
/** /**
* @return player 实例 * @return player 实例
*/ */
getPlayer(){ getPlayer () {
return this.player; return this.player;
}, },
/** /**
* 播放视频 * 播放视频
*/ */
play(){ play () {
// console.log(``); // console.log(``);
this.player && this.player.play(); this.player && this.player.play();
}, },
@ -228,7 +257,7 @@ export default {
/** /**
* 暂停视频 * 暂停视频
*/ */
pause(){ pause () {
// console.log(``); // console.log(``);
this.player && this.player.pause(); this.player && this.player.pause();
}, },
@ -236,7 +265,7 @@ export default {
/** /**
* 重播视频 * 重播视频
*/ */
replay(){ replay () {
// console.log(``); // console.log(``);
this.player && this.player.replay(); this.player && this.player.replay();
}, },
@ -246,7 +275,7 @@ export default {
* @param time * @param time
* @return player * @return player
*/ */
seek(time){ seek (time) {
// console.log(`time${time}`); // console.log(`time${time}`);
this.player && this.player.seek(time); this.player && this.player.seek(time);
}, },
@ -255,7 +284,7 @@ export default {
* 获取当前的播放时刻返回的单位为秒 * 获取当前的播放时刻返回的单位为秒
* @return player * @return player
*/ */
getCurrentTime(){ getCurrentTime () {
// console.log(`${this.player && this.player.getCurrentTime()}`); // console.log(`${this.player && this.player.getCurrentTime()}`);
return this.player && this.player.getCurrentTime(); return this.player && this.player.getCurrentTime();
}, },
@ -264,7 +293,7 @@ export default {
* 获取视频总时长返回的单位为秒这个需要在视频加载完成以后才可以获取到可以在play事件后获取 * 获取视频总时长返回的单位为秒这个需要在视频加载完成以后才可以获取到可以在play事件后获取
* @return player * @return player
*/ */
getDuration(){ getDuration () {
// console.log(`${this.player && this.player.getDuration()}`); // console.log(`${this.player && this.player.getDuration()}`);
return this.player && this.player.getDuration(); return this.player && this.player.getDuration();
}, },
@ -273,7 +302,7 @@ export default {
* 获取当前的音量返回值为0-1的实数ios和部分android会失效 * 获取当前的音量返回值为0-1的实数ios和部分android会失效
* @return player * @return player
*/ */
getVolume(){ getVolume () {
// console.log(`${this.player && this.player.getVolume()}`); // console.log(`${this.player && this.player.getVolume()}`);
return this.player && this.player.getVolume(); return this.player && this.player.getVolume();
}, },
@ -282,7 +311,7 @@ export default {
* 设置音量vol为0-1的实数ios和部分android会失效 * 设置音量vol为0-1的实数ios和部分android会失效
* @return player * @return player
*/ */
setVolume(v){ setVolume (v) {
// console.log(`vol${v}`); // console.log(`vol${v}`);
this.player && this.player.setVolume(v); this.player && this.player.setVolume(v);
}, },
@ -292,7 +321,7 @@ export default {
* 暂不支持直播rtmp流切换 * 暂不支持直播rtmp流切换
* @return player * @return player
*/ */
loadByUrl(url, time){ loadByUrl (url, time) {
// console.log(`url${url}time${time}`); // console.log(`url${url}time${time}`);
this.player && this.player.loadByUrl(url, time); this.player && this.player.loadByUrl(url, time);
}, },
@ -302,7 +331,7 @@ export default {
* @param vid 视频id * @param vid 视频id
* @param 播放凭证 * @param 播放凭证
*/ */
replayByVidAndPlayAuth(vid, playauth){ replayByVidAndPlayAuth (vid, playauth) {
// console.log(`replayByVidAndPlayAuth vid${vid}playauth${playauth}`); // console.log(`replayByVidAndPlayAuth vid${vid}playauth${playauth}`);
this.player && this.player.replayByVidAndPlayAuth(vid, playauth); this.player && this.player.replayByVidAndPlayAuth(vid, playauth);
}, },
@ -313,7 +342,7 @@ export default {
* @param 播放凭证 * @param 播放凭证
* @description 仅MPS用户时使用 仅MPS用户时使用 参数顺序为vidaccIdaccSecretstsTokenauthInfodomainRegion * @description 仅MPS用户时使用 仅MPS用户时使用 参数顺序为vidaccIdaccSecretstsTokenauthInfodomainRegion
*/ */
replayByVidAndAuthInfo(vid, accId, accSecret, stsToken, authInfo, domainRegion){ replayByVidAndAuthInfo (vid, accId, accSecret, stsToken, authInfo, domainRegion) {
// console.log(`replayByVidAndAuthInfo vidaccIdaccSecretstsTokenauthInfodomainRegion`,vid, accId, accSecret, stsToken, authInfo, domainRegion); // console.log(`replayByVidAndAuthInfo vidaccIdaccSecretstsTokenauthInfodomainRegion`,vid, accId, accSecret, stsToken, authInfo, domainRegion);
this.player && this.player.replayByVidAndAuthInfo(vid, accId, accSecret, stsToken, authInfo, domainRegion); this.player && this.player.replayByVidAndAuthInfo(vid, accId, accSecret, stsToken, authInfo, domainRegion);
}, },
@ -324,7 +353,7 @@ export default {
* @param h 宽度 * @param h 宽度
* @description chrome浏览器下flash播放器分别不能小于397x297 * @description chrome浏览器下flash播放器分别不能小于397x297
*/ */
setPlayerSize(w, h){ setPlayerSize (w, h) {
// console.log(` :${w},:${h}`); // console.log(` :${w},:${h}`);
this.player && this.player.setPlayerSize(w, h); this.player && this.player.setPlayerSize(w, h);
}, },
@ -336,7 +365,7 @@ export default {
* @param h 宽度 * @param h 宽度
* @description {namespeedButtonaligntrx10y23} * @description {namespeedButtonaligntrx10y23}
*/ */
setSpeed(speed){ setSpeed (speed) {
// console.log(`:${speed}`); // console.log(`:${speed}`);
this.player && this.player.setSpeed(speed); this.player && this.player.setSpeed(speed);
}, },
@ -347,7 +376,7 @@ export default {
* @param height 高度 * @param height 高度
* @param rate 截图质量 * @param rate 截图质量
*/ */
setSanpshotProperties(width, height, rate){ setSanpshotProperties (width, height, rate) {
// console.log(`:`,width, height, rate); // console.log(`:`,width, height, rate);
this.player && this.player.setSanpshotProperties(width, height, rate); this.player && this.player.setSanpshotProperties(width, height, rate);
}, },
@ -355,7 +384,7 @@ export default {
/** /**
* 播放器全屏仅H5支持 * 播放器全屏仅H5支持
*/ */
requestFullScreen(){ requestFullScreen () {
// console.log(`H5`); // console.log(`H5`);
this.player && this.player.fullscreenService && this.player.fullscreenService.requestFullScreen(); this.player && this.player.fullscreenService && this.player.fullscreenService.requestFullScreen();
}, },
@ -363,7 +392,7 @@ export default {
/** /**
* 播放器退出全屏iOS调用无效仅H5支持 * 播放器退出全屏iOS调用无效仅H5支持
*/ */
cancelFullScreen(){ cancelFullScreen () {
// console.log(`H5`); // console.log(`H5`);
this.player && this.player.fullscreenService && this.player.fullscreenService.cancelFullScreen(); this.player && this.player.fullscreenService && this.player.fullscreenService.cancelFullScreen();
}, },
@ -371,7 +400,7 @@ export default {
/** /**
* 获取播放器全屏状态仅H5支持 * 获取播放器全屏状态仅H5支持
*/ */
getIsFullScreen(){ getIsFullScreen () {
// console.log(`H5`,this.player && this.player.fullscreenService && this.player && this.player.fullscreenService.getIsFullScreen()); // console.log(`H5`,this.player && this.player.fullscreenService && this.player && this.player.fullscreenService.getIsFullScreen());
return this.player && this.player.fullscreenService && this.player.fullscreenService.getIsFullScreen(); return this.player && this.player.fullscreenService && this.player.fullscreenService.getIsFullScreen();
}, },
@ -380,7 +409,7 @@ export default {
* 获取播放器状态包含的值, * 获取播放器状态包含的值,
* @returns init ready loading play pause playing waiting error ended * @returns init ready loading play pause playing waiting error ended
*/ */
getStatus(){ getStatus () {
// console.log(``,this.player && this.player.fullscreenService && this.player && this.player.fullscreenService.getStatus()); // console.log(``,this.player && this.player.fullscreenService && this.player && this.player.fullscreenService.getStatus());
return this.player && this.player.getStatus(); return this.player && this.player.getStatus();
}, },
@ -391,7 +420,7 @@ export default {
* @param endTime 结束时间 * @param endTime 结束时间
* @description 例子player.liveShiftSerivce.setLiveTimeRange(2018/01/04 20:00:00) * @description 例子player.liveShiftSerivce.setLiveTimeRange(2018/01/04 20:00:00)
*/ */
setLiveTimeRange(beginTime, endTime){ setLiveTimeRange (beginTime, endTime) {
// console.log(`:${beginTime},:${endTime}使`); // console.log(`:${beginTime},:${endTime}使`);
this.player && this.player.liveShiftSerivce && this.player.liveShiftSerivce.setLiveTimeRange(beginTime, endTime); this.player && this.player.liveShiftSerivce && this.player.liveShiftSerivce.setLiveTimeRange(beginTime, endTime);
}, },
@ -401,7 +430,7 @@ export default {
* @param rotate 旋转角度 * @param rotate 旋转角度
* @description 例如: setRotate(90)详情参见旋转和镜像 * @description 例如: setRotate(90)详情参见旋转和镜像
*/ */
setRotate(rotate){ setRotate (rotate) {
// console.log(`:${rotate}`); // console.log(`:${rotate}`);
this.player && this.player.setRotate(rotate); this.player && this.player.setRotate(rotate);
}, },
@ -410,7 +439,7 @@ export default {
* 获取旋转角度详情参见旋转和镜像 * 获取旋转角度详情参见旋转和镜像
* @return rotate 旋转角度 * @return rotate 旋转角度
*/ */
getRotate(){ getRotate () {
// console.log(`:${this.player && this.player.getRotate()}`); // console.log(`:${this.player && this.player.getRotate()}`);
return this.player && this.player.getRotate(); return this.player && this.player.getRotate();
}, },
@ -420,7 +449,7 @@ export default {
* @param image 镜像类型 可选值为horizon,vertical * @param image 镜像类型 可选值为horizon,vertical
* @description 例如: setImage(horizon)详情参见旋转和镜像 * @description 例如: setImage(horizon)详情参见旋转和镜像
*/ */
setImage(image){ setImage (image) {
// console.log(`:${image}`); // console.log(`:${image}`);
this.player && this.player.setImage(image); this.player && this.player.setImage(image);
}, },
@ -428,7 +457,7 @@ export default {
/** /**
* 播放器销毁 * 播放器销毁
*/ */
dispose(){ dispose () {
// console.log(``); // console.log(``);
this.player && this.player.dispose(); this.player && this.player.dispose();
}, },
@ -437,7 +466,7 @@ export default {
* 设置封面 * 设置封面
* @param cover 封面地址 * @param cover 封面地址
*/ */
setCover(cover){ setCover (cover) {
// console.log(`:${cover}`); // console.log(`:${cover}`);
this.player && this.player.setCover(cover); this.player && this.player.setCover(cover);
}, },
@ -446,7 +475,7 @@ export default {
* 设置封面 * 设置封面
* @param markers 设置打点数据 * @param markers 设置打点数据
*/ */
setProgressMarkers(markers){ setProgressMarkers (markers) {
// console.log(`markers:${markers}`); // console.log(`markers:${markers}`);
this.player && this.player.setProgressMarkers(markers); this.player && this.player.setProgressMarkers(markers);
}, },
@ -455,7 +484,7 @@ export default {
* 设置试看时间单位为秒详情参见 * 设置试看时间单位为秒详情参见
* @param time 试看时间 * @param time 试看时间
*/ */
setPreviewTime(time){ setPreviewTime (time) {
// console.log(`:${time}`); // console.log(`:${time}`);
this.player && this.player.setPreviewTime(time); this.player && this.player.setPreviewTime(time);
}, },
@ -464,7 +493,7 @@ export default {
* 获取试看时间 * 获取试看时间
* @return rotate 旋转角度 * @return rotate 旋转角度
*/ */
getPreviewTime(){ getPreviewTime () {
// console.log(`:${this.player && this.player.getPreviewTime()}`); // console.log(`:${this.player && this.player.getPreviewTime()}`);
return this.player && this.player.getPreviewTime(); return this.player && this.player.getPreviewTime();
}, },
@ -472,7 +501,7 @@ export default {
/** /**
* 是否试看 * 是否试看
*/ */
isPreview(){ isPreview () {
// console.log(``); // console.log(``);
this.player && this.player.isPreview(); this.player && this.player.isPreview();
}, },
@ -481,11 +510,35 @@ export default {
* @param ev 事件名 * @param ev 事件名
* @param handle 回调方法 * @param handle 回调方法
*/ */
off(ev,handle){ off (ev, handle) {
this.player && this.player.off(ev,handle); this.player && this.player.off(ev, handle);
},
/**
* 深度拷贝
* @param {*} obj
*/
deepCloneObject (obj) {
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
//ojb
if (obj[key] && typeof obj[key] === 'object') {
objClone[key] = this.deepCloneObject(obj[key]);
} else {
//
objClone[key] = obj[key];
}
}
}
}
return objClone;
} }
}, },
beforeDestroy(){ // beforeDestroy () { //
this.dispose(); //(,,bug) this.dispose(); //(,,bug)
// const head = document.querySelector('head'); // const head = document.querySelector('head');
// const cssNodes = document.querySelectorAll(`link.app__aliplayer-min-css`); // const cssNodes = document.querySelectorAll(`link.app__aliplayer-min-css`);

25
pages.sh Normal file
View File

@ -0,0 +1,25 @@
echo "打包 => dist";
# 打包 => dist
npm run build;
# 更新gh-pages
echo "更新gh-pages";
git branch -D gh-pages;
echo "删除gh-pages";
git checkout -b gh-pages;
echo "创建并切换到gh-pages";
git add -f dist;
git commit -m 'create gh-pages';
git push origin -d gh-pages;
git subtree push --prefix dist origin gh-pages;
echo "已推送gh-pages";