|
@@ -1,53 +1,53 @@
|
|
|
-import { ref, onMounted, watch } from 'vue'
|
|
|
-import { postMessage } from '../utils/iframePip.js'
|
|
|
-import Player, { Events } from 'xgplayer'
|
|
|
-import 'xgplayer/dist/index.min.css'
|
|
|
+import { ref, onMounted, watch } from "vue";
|
|
|
+import { postMessage } from "../utils/iframePip.js";
|
|
|
+import Player, { Events } from "xgplayer";
|
|
|
+import "xgplayer/dist/index.min.css";
|
|
|
// xgplay相关的
|
|
|
const useInitPlayer = (props, emits) => {
|
|
|
- const xgplayer = ref(null)
|
|
|
+ const xgplayer = ref(null);
|
|
|
// 是否全屏
|
|
|
- const isCssFullScreenRef = ref(false)
|
|
|
+ const isCssFullScreenRef = ref(false);
|
|
|
// 是否展示问题
|
|
|
- const questionShowRef = ref(false)
|
|
|
+ const questionShowRef = ref(false);
|
|
|
// 视频历史记录
|
|
|
- const historyListRef = ref([])
|
|
|
+ const historyListRef = ref([]);
|
|
|
|
|
|
// 是否是移动端设备
|
|
|
const isMobileDevice = () => {
|
|
|
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
|
|
navigator.userAgent
|
|
|
- )
|
|
|
- }
|
|
|
+ );
|
|
|
+ };
|
|
|
// 是否是手机
|
|
|
- const isMobile = isMobileDevice()
|
|
|
+ const isMobile = isMobileDevice();
|
|
|
// 获取全屏设置
|
|
|
const getFullscreen = () => {
|
|
|
const defaultConfig = {
|
|
|
- needBackIcon: true
|
|
|
- }
|
|
|
+ needBackIcon: true,
|
|
|
+ };
|
|
|
return isMobile
|
|
|
? {
|
|
|
rotateFullscreen: true,
|
|
|
- ...defaultConfig
|
|
|
+ ...defaultConfig,
|
|
|
}
|
|
|
: {
|
|
|
useCssFullscreen: true,
|
|
|
- ...defaultConfig
|
|
|
- }
|
|
|
- }
|
|
|
+ ...defaultConfig,
|
|
|
+ };
|
|
|
+ };
|
|
|
|
|
|
// 播放器容器对外发送信息
|
|
|
const viewerPostMessage = (data) => {
|
|
|
- props.ifSendMsg && postMessage(data)
|
|
|
- }
|
|
|
+ props.ifSendMsg && postMessage(data);
|
|
|
+ };
|
|
|
|
|
|
// 初始化播放器
|
|
|
const initPlay = () => {
|
|
|
- historyListRef.value = []
|
|
|
+ historyListRef.value = [];
|
|
|
|
|
|
return new Player({
|
|
|
- id: 'mse',
|
|
|
- lang: 'zh',
|
|
|
+ id: "mse",
|
|
|
+ lang: "zh",
|
|
|
url: props.videoUrl,
|
|
|
height: props.height,
|
|
|
width: props.width,
|
|
@@ -60,102 +60,104 @@ const useInitPlayer = (props, emits) => {
|
|
|
// 全屏插件配置
|
|
|
fullscreen: getFullscreen(),
|
|
|
// 需要忽略的插件
|
|
|
- ignores: ['cssfullscreen']
|
|
|
- })
|
|
|
- }
|
|
|
+ ignores: ["cssfullscreen"],
|
|
|
+ });
|
|
|
+ };
|
|
|
const playNext = (url, poster) => {
|
|
|
// 关闭问题
|
|
|
- questionShowRef.value = false
|
|
|
+ questionShowRef.value = false;
|
|
|
// 播放下一个视频
|
|
|
xgplayer.value.playNext({
|
|
|
- url: url
|
|
|
- })
|
|
|
+ url: url,
|
|
|
+ });
|
|
|
// 设置封面,playNext里面设置有点问题,时常不生效
|
|
|
xgplayer.value.setConfig({
|
|
|
- poster: poster
|
|
|
- })
|
|
|
- }
|
|
|
+ poster: poster,
|
|
|
+ });
|
|
|
+ };
|
|
|
// 初始化事件
|
|
|
const initHandler = (xgplayer) => {
|
|
|
- if (!xgplayer) return
|
|
|
+ if (!xgplayer) return;
|
|
|
// 全屏变化
|
|
|
xgplayer.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {
|
|
|
- isCssFullScreenRef.value = isFullScreen
|
|
|
- emits('onFullscreenChange', isFullScreen)
|
|
|
- })
|
|
|
+ isCssFullScreenRef.value = isFullScreen;
|
|
|
+ emits("onFullscreenChange", isFullScreen);
|
|
|
+ });
|
|
|
// 视频播放结束
|
|
|
xgplayer.on(Events.ENDED, () => {
|
|
|
- questionShowRef.value = true
|
|
|
- })
|
|
|
+ questionShowRef.value = true;
|
|
|
+ });
|
|
|
// 视频开始播放
|
|
|
xgplayer.on(Events.PLAY, () => {
|
|
|
- questionShowRef.value = false
|
|
|
- })
|
|
|
+ questionShowRef.value = false;
|
|
|
+ });
|
|
|
// 视频资源加载成功
|
|
|
xgplayer.on(Events.LOADED_DATA, () => {
|
|
|
- console.log('视频资源加载成功')
|
|
|
+ console.log("视频资源加载成功");
|
|
|
// 表示视频切换后加载成功
|
|
|
if (historyListRef.value.length > 0) {
|
|
|
- xgplayer.currentTime = 0
|
|
|
+ xgplayer.currentTime = 0;
|
|
|
setTimeout(() => {
|
|
|
xgplayer
|
|
|
.play()
|
|
|
.then(() => {
|
|
|
// 播放成功
|
|
|
- console.log('播放成功')
|
|
|
+ console.log("播放成功");
|
|
|
})
|
|
|
.catch((err) => {
|
|
|
- console.log('播放失败', err)
|
|
|
+ console.log("播放失败", err);
|
|
|
// 播放失败,一般发生于未经用户交互时的自动播放
|
|
|
- })
|
|
|
- }, 50)
|
|
|
+ });
|
|
|
+ }, 50);
|
|
|
}
|
|
|
- historyListRef.value.push(props.videoUrl)
|
|
|
- })
|
|
|
- }
|
|
|
+ historyListRef.value.push(props.videoUrl);
|
|
|
+ });
|
|
|
+ };
|
|
|
const init = () => {
|
|
|
- if (!props.videoUrl) return
|
|
|
- console.log('开始初始化视频播放器')
|
|
|
+ // 有视频源的时候才进行初始化
|
|
|
+ if (!props.videoUrl) return;
|
|
|
+ // console.log('开始初始化视频播放器')
|
|
|
try {
|
|
|
- xgplayer.value = initPlay()
|
|
|
- initHandler(xgplayer.value)
|
|
|
+ xgplayer.value = initPlay();
|
|
|
+ initHandler(xgplayer.value);
|
|
|
viewerPostMessage({
|
|
|
- msgType: 'video_init',
|
|
|
- content: '视频播放器初始化成功'
|
|
|
- })
|
|
|
+ msgType: "video_init",
|
|
|
+ content: "视频播放器初始化成功",
|
|
|
+ });
|
|
|
} catch (error) {
|
|
|
viewerPostMessage({
|
|
|
- msgType: 'video_init_fail',
|
|
|
- content: '视频播放器初始失败'
|
|
|
- })
|
|
|
+ msgType: "video_init_fail",
|
|
|
+ content: "视频播放器初始失败",
|
|
|
+ });
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
watch(
|
|
|
() => props.videoUrl,
|
|
|
(val, oldVal) => {
|
|
|
// 首次加载视频进行初始化
|
|
|
- if (val && !oldVal) init()
|
|
|
+ if (val && !oldVal) init();
|
|
|
}
|
|
|
- )
|
|
|
+ );
|
|
|
|
|
|
onMounted(() => {
|
|
|
- init()
|
|
|
+ init();
|
|
|
+ // 这里延迟一下在通知,不然父页面不一定能接收到
|
|
|
setTimeout(() => {
|
|
|
viewerPostMessage({
|
|
|
- msgType: 'video_ready',
|
|
|
- content: '视频容器准备就绪'
|
|
|
- })
|
|
|
- }, 250)
|
|
|
- })
|
|
|
+ msgType: "video_ready",
|
|
|
+ content: "视频容器准备就绪",
|
|
|
+ });
|
|
|
+ }, 250);
|
|
|
+ });
|
|
|
|
|
|
return {
|
|
|
xgplayer,
|
|
|
isMobile,
|
|
|
isCssFullScreenRef,
|
|
|
questionShowRef,
|
|
|
- playNext
|
|
|
- }
|
|
|
-}
|
|
|
+ playNext,
|
|
|
+ };
|
|
|
+};
|
|
|
|
|
|
-export default useInitPlayer
|
|
|
+export default useInitPlayer;
|