| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- import { defineComponent, PropType } from 'vue';
- import styles from './index.module.less';
- import Plyr from 'plyr';
- import 'plyr/dist/plyr.css';
- import { Button, Icon, Loading, Toast } from 'vant';
- import TCPlayer from 'tcplayer.js';
- import 'tcplayer.js/dist/tcplayer.css';
- // import iconVideoPlay from '@/common/images/icon_video_play.png';
- // import { browser } from '@/helpers/utils';
- export default defineComponent({
- name: 'o-video',
- props: {
- setting: {
- type: Object,
- default: () => {}
- },
- controls: {
- type: Boolean,
- default: true
- },
- height: String,
- src: {
- type: String,
- default: ''
- },
- poster: {
- type: String,
- default: ''
- },
- styleValue: {
- type: Object,
- default: () => ({})
- },
- preload: {
- type: String as PropType<'auto' | 'metadata' | 'none'>,
- default: 'auto'
- },
- currentTime: {
- type: Boolean,
- default: true
- },
- playsinline: {
- type: Boolean,
- default: true
- },
- onPlay: {
- type: Function,
- default: () => {}
- }
- },
- emits: ['exitfullscreen'],
- data() {
- return {
- videoID: 'video' + Date.now() + Math.floor(Math.random() * 100),
- player: null as any,
- loading: true // 首次进入加载中
- };
- },
- mounted() {
- this._init();
- },
- methods: {
- _init() {
- // controls: [
- // 'play-large' , // 中间的大播放按钮
- // 'restart' , // 重新开始播放
- // 'rewind' , // 按寻道时间倒带(默认 10 秒)
- // 'play' , // 播放/暂停播放
- // 'fast-forward' , // 快进查找时间(默认 10 秒)
- // 'progress' , // 播放和缓冲的进度条和滑动条
- // 'current-time' , // 播放的当前时间
- // ' duration' , // 媒体的完整持续时间
- // 'mute' , // 切换静音
- // 'volume', // 音量控制
- // 'captions' , // 切换字幕
- // 'settings' , // 设置菜单
- // 'pip' , // 画中画(当前仅 Safari)
- // 'airplay' , // Airplay(当前仅 Safari)
- // 'download ' , // 显示一个下载按钮,其中包含指向当前源或您在选项中指定的自定义 URL 的链接
- // 'fullscreen' , // 切换全屏
- // ] ;
- const Button = TCPlayer.getComponent('Button');
- const BigPlayButton = TCPlayer.getComponent('BigPlayButton');
- BigPlayButton.prototype.createEl = function () {
- const el = Button.prototype.createEl.call(this);
- const _html =
- '<button><svg width="41px"height="41px"viewBox="0 0 41 41"version="1.1"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="none"stroke-width="1"fill="none"fill-rule="evenodd"><g transform="translate(-167.000000, -155.000000)"><g transform="translate(0.000000, 85.000000)"><g transform="translate(158.000000, 70.000000)"><g transform="translate(9.000000, 0.000000)"><circle id="椭圆形"stroke="#FFFFFF"fill-opacity="0.1"fill="#D8D8D8"cx="20.5"cy="20.5"r="20"></circle><path d="M14.5483871,27.6859997 L14.5483871,13.4342349 C14.5480523,12.8729571 14.8729597,12.356555 15.3949624,12.0887034 C15.9169651,11.8208518 16.5522696,11.8445472 17.0503046,12.1504437 L28.6530473,19.2778563 C29.1119763,19.5602271 29.3887725,20.0426422 29.3887725,20.5601173 C29.3887725,21.0775924 29.1119763,21.5600075 28.6530473,21.8423783 L17.0503046,28.9697909 C16.5522696,29.2756874 15.9169651,29.2993828 15.3949624,29.0315312 C14.8729597,28.7636796 14.5480523,28.2472775 14.5483871,27.6859997 Z"id="路径"fill="#FFFFFF"fill-rule="nonzero"></path></g></g></g></g></g></svg></button>';
- el.appendChild(
- TCPlayer.dom.createEl('div', {
- className: 'vjs-button-icon',
- innerHTML: _html
- })
- );
- return el;
- };
- this.player = TCPlayer(this.videoID, {
- appID: '',
- controls: this.controls
- }); // player-container-id 为播放器容器 ID,必须与 html 中一致
- if (this.player) {
- this.player.src(this.src); // url 播放地址
- this.player.poster(this.poster || '');
- if (this.preload === 'none') {
- this.loading = false;
- }
- this.player.on('loadstart', () => {
- this.loading = false;
- this.domPlayVisibility(false);
- });
- this.player.on('play', () => {
- this.onPlay && this.onPlay(this.player);
- });
- this.player.on('fullscreenchange', () => {
- if (this.player.isFullscreen()) {
- console.log('fullscreen');
- const i = document.createElement('i');
- i.id = 'fullscreen-back';
- i.className = 'van-icon van-icon-arrow-left video-back';
- i.addEventListener('click', () => {
- this.player.exitFullscreen();
- });
- // console.log(document.getElementsByClassName('video-js'))
- document.getElementsByClassName('video-js')[0].appendChild(i);
- } else {
- console.log('exitfullscreen');
- const i = document.getElementById('fullscreen-back');
- i && i.remove();
- }
- });
- }
- },
- // 操作功能
- domPlayVisibility(hide = true) {
- const controls = document.querySelector('.vjs-big-play-button');
- const controls2 = document.querySelector('.vjs-control-bar');
- if (hide) {
- controls?.setAttribute('style', 'display:none');
- controls2?.setAttribute('style', 'display:none');
- } else {
- controls?.removeAttribute('style');
- setTimeout(() => {
- controls2?.removeAttribute('style');
- }, 200);
- }
- },
- onReplay() {
- this.player.currentTime(0);
- this.player.play();
- this.domPlayVisibility(false);
- },
- onStop() {
- this.player.currentTime(0);
- this.player.pause();
- }
- },
- unmounted() {
- this.player?.pause();
- this.player?.src('');
- this.player?.dispose();
- },
- render() {
- return (
- <div class={styles['video-container']}>
- <video
- ref="video"
- id={this.videoID}
- class={styles['video']}
- src={this.src}
- playsinline={this.playsinline}
- poster={this.poster}
- preload={this.preload}
- style={{ ...this.styleValue }}></video>
- {/* </div> */}
- {/* 加载视频使用 */}
- {/* {this.loading && (
- <div
- class={styles.loadingVideo}
- style={{
- height: this.height || '210px'
- }}>
- <Loading
- size={36}
- color="#FF8057"
- vertical
- style={{ height: '100%', justifyContent: 'center' }}>
- 加载中...
- </Loading>
- </div>
- )} */}
- </div>
- );
- }
- });
|