index.vue
2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<script lang="ts" setup>
import { ComponentMode, ComponentPropsConfigType } from '/@/views/visual/packages/index.type';
import { option } from './config';
import { BasicVideoPlay, getVideoTypeByUrl } from '/@/components/Video';
import { computed } from 'vue';
import { VideoJsPlayerOptions } from 'video.js';
import { AccessMode } from '/@/views/camera/manage/config.data';
import { onMounted } from 'vue';
import { unref } from 'vue';
import { getStreamingPlayUrl } from '/@/api/camera/cameraManager';
import { ref } from 'vue';
import { Spin } from 'ant-design-vue';
const props = defineProps<{
config: ComponentPropsConfigType<typeof option>;
}>();
const loading = ref(true);
const getIsSelectPreviewMode = computed(() => {
return props.config.option.mode === ComponentMode.SELECT_PREVIEW;
});
const getIsStreamingMode = computed(() => {
const { option } = props.config;
const { videoConfig } = option;
return videoConfig?.accessMode === AccessMode.Streaming;
});
const playSource = ref<Record<'src' | 'type', string>>(
{} as unknown as Record<'src' | 'type', string>
);
const exampleVideoPlay =
'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm';
const getVideoPlaySources = computed(() => {
const { option } = props.config;
const { videoConfig } = option;
const { url } = videoConfig || {};
return Object.assign(
{
src: unref(getIsSelectPreviewMode) ? exampleVideoPlay : url,
type: getVideoTypeByUrl(url || ''),
},
unref(playSource)
);
});
const getOptions = computed<VideoJsPlayerOptions>(() => {
const { option } = props.config;
const { itemHeightRatio, itemWidthRatio, widthPx, heightPx } = option;
const currentW = widthPx * (itemWidthRatio / 100);
const currentH = heightPx * (itemHeightRatio / 100);
return {
width: currentW - 8,
height: currentH - 8,
sources: unref(getVideoPlaySources).src
? ([unref(getVideoPlaySources)] as VideoJsPlayerOptions['sources'])
: [],
};
});
const handleGetVideoPlayUrl = async () => {
try {
if (unref(getIsStreamingMode) && !unref(getVideoPlaySources).src) {
const { option } = props.config;
const { videoConfig } = option;
if (!videoConfig?.id) return;
const { data: { url } = { url: '' } } = await getStreamingPlayUrl(videoConfig?.id);
playSource.value = {
src: url,
type: getVideoTypeByUrl(url),
};
}
} finally {
loading.value = false;
}
};
onMounted(() => {
handleGetVideoPlayUrl();
});
</script>
<template>
<main class="w-full h-full flex flex-col justify-center items-center p-2">
<Spin :spinning="loading" wrapper-class-name="video-spin">
<BasicVideoPlay :options="getOptions" />
</Spin>
</main>
</template>
<style lang="less" scoped>
.video-spin {
@apply w-full h-full;
:deep(.ant-spin-container) {
@apply w-full h-full;
}
}
</style>