|
@@ -1,4 +1,11 @@
|
|
|
-import { defineComponent, onMounted, reactive, toRefs, watch } from 'vue';
|
|
|
+import {
|
|
|
+ defineComponent,
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ reactive,
|
|
|
+ toRefs,
|
|
|
+ watch
|
|
|
+} from 'vue';
|
|
|
import { ref } from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
|
|
@@ -37,8 +44,8 @@ export default defineComponent({
|
|
|
default: false
|
|
|
}
|
|
|
},
|
|
|
- emits: ['loadedmetadata', 'togglePlay', 'ended', 'reset', 'close'],
|
|
|
- setup(props, { emit }) {
|
|
|
+ emits: ['loadedmetadata', 'togglePlay', 'ended', 'reset', 'close', 'error'],
|
|
|
+ setup(props, { emit, expose }) {
|
|
|
const videoID = 'video' + Date.now() + Math.floor(Math.random() * 100);
|
|
|
const videoItem = ref();
|
|
|
const { item, isEmtry } = toRefs(props);
|
|
@@ -48,10 +55,9 @@ export default defineComponent({
|
|
|
duration: 0,
|
|
|
loop: false,
|
|
|
playState: 'pause' as 'play' | 'pause',
|
|
|
- vudio: null as any
|
|
|
+ vudio: null as any,
|
|
|
+ reload: false
|
|
|
});
|
|
|
- const canvasRef: any = ref();
|
|
|
- const elRef: any = ref();
|
|
|
const contetRef = ref();
|
|
|
|
|
|
watch(
|
|
@@ -75,16 +81,24 @@ export default defineComponent({
|
|
|
clearTimeout(playTimer);
|
|
|
if (state === 'play') {
|
|
|
playTimer = setTimeout(() => {
|
|
|
- videoItem.value.play();
|
|
|
+ videoItem.value?.play();
|
|
|
data.playState = 'play';
|
|
|
}, 100);
|
|
|
} else {
|
|
|
- videoItem.value.pause();
|
|
|
+ videoItem.value?.pause();
|
|
|
data.playState = 'pause';
|
|
|
}
|
|
|
emit('togglePlay', data.playState);
|
|
|
};
|
|
|
|
|
|
+ // 如果视屏异常后,需要重新播放视屏
|
|
|
+ const onPlay = () => {
|
|
|
+ if (videoItem.value) {
|
|
|
+ videoItem.value.src(item.value.content);
|
|
|
+ emit('reset');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
/** 改变播放时间 */
|
|
|
const handleChangeTime = (val: number) => {
|
|
|
data.currentTime = val;
|
|
@@ -97,19 +111,20 @@ export default defineComponent({
|
|
|
}, 300);
|
|
|
};
|
|
|
|
|
|
- onMounted(() => {
|
|
|
+ const __init = () => {
|
|
|
videoItem.value = TCPlayer(videoID, {
|
|
|
appID: '',
|
|
|
controls: false
|
|
|
}); // player-container-id 为播放器容器 ID,必须与 html 中一致
|
|
|
if (videoItem.value) {
|
|
|
+ console.log(videoItem.value);
|
|
|
videoItem.value.poster(props.item.coverImg); // 封面
|
|
|
videoItem.value.src(isEmtry.value ? '' : item.value.content); // url 播放地址
|
|
|
|
|
|
// 初步加载时
|
|
|
- videoItem.value.one('loadedmetadata', () => {
|
|
|
- console.log(' Loading metadata');
|
|
|
-
|
|
|
+ videoItem.value.one('loadedmetadata', (e: any) => {
|
|
|
+ console.log(' Loading metadata', e);
|
|
|
+ data.reload = false;
|
|
|
// 获取时长
|
|
|
data.duration = videoItem.value.duration();
|
|
|
|
|
@@ -127,33 +142,49 @@ export default defineComponent({
|
|
|
data.playState = 'pause';
|
|
|
emit('ended');
|
|
|
});
|
|
|
+
|
|
|
+ //
|
|
|
+ videoItem.value.on('pause', () => {
|
|
|
+ data.playState = 'pause';
|
|
|
+ });
|
|
|
+
|
|
|
+ videoItem.value.on('playing', () => {
|
|
|
+ data.playState = 'play';
|
|
|
+ });
|
|
|
+
|
|
|
+ videoItem.value.on('canplay', (e: any) => {
|
|
|
+ console.log('canplay', e);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 视频播放异常
|
|
|
+ videoItem.value.on('error', (e: any) => {
|
|
|
+ emit('error');
|
|
|
+ console.log(e, 'error');
|
|
|
+ });
|
|
|
}
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ __init();
|
|
|
+ });
|
|
|
+
|
|
|
+ expose({
|
|
|
+ onPlay
|
|
|
});
|
|
|
return () => (
|
|
|
<div class={styles.videoWrap}>
|
|
|
<div class={styles.content}>
|
|
|
<div ref={contetRef} class={styles.contentWrap}>
|
|
|
- {/* <video
|
|
|
- poster={props.item.coverImg}
|
|
|
- src={isEmtry.value ? '' : item.value.content}
|
|
|
- ref={elRef}
|
|
|
- loop={data.loop}
|
|
|
- onLoadedmetadata={onLoadedmetadata}
|
|
|
- onTimeupdate={() => {
|
|
|
- if (data.timer) return;
|
|
|
- data.currentTime = elRef.value.currentTime;
|
|
|
- }}
|
|
|
- onEnded={onEnded}
|
|
|
- playsinline="false"></video> */}
|
|
|
- <video
|
|
|
- style={{ width: '100%', height: '100%' }}
|
|
|
- poster={props.item.coverImg}
|
|
|
- src={isEmtry.value ? '' : item.value.content}
|
|
|
- ref={elRef}
|
|
|
- id={videoID}
|
|
|
- preload="auto"
|
|
|
- playsinline
|
|
|
- webkit-playsinline></video>
|
|
|
+ {!data.reload && (
|
|
|
+ <video
|
|
|
+ style={{ width: '100%', height: '100%' }}
|
|
|
+ poster={props.item.coverImg}
|
|
|
+ src={isEmtry.value ? '' : item.value.content}
|
|
|
+ id={videoID}
|
|
|
+ preload="auto"
|
|
|
+ playsinline
|
|
|
+ webkit-playsinline></video>
|
|
|
+ )}
|
|
|
</div>
|
|
|
<div class={styles.videoSection}></div>
|
|
|
</div>
|