Commit 879642eabbfd6acf1134dc406efe154b62ceeaf7
1 parent
9a1b9a75
fix: camer split screen mode can not play stream
Showing
3 changed files
with
58 additions
and
13 deletions
... | ... | @@ -28,14 +28,9 @@ |
28 | 28 | import type { StreamingManageRecord, CameraModel } from '/@/api/camera/model/cameraModel'; |
29 | 29 | import { videoPlay } from 'vue3-video-play'; // 引入组件 |
30 | 30 | import 'vue3-video-play/dist/style.css'; // 引入css |
31 | - import { AccessMode } from './config.data'; | |
31 | + import { AccessMode, MediaType } from './config.data'; | |
32 | 32 | import { getStreamingPlayUrl } from '/@/api/camera/cameraManager'; |
33 | 33 | |
34 | - enum MediaType { | |
35 | - MP4 = 'mp4', | |
36 | - M3U8 = 'm3u8', | |
37 | - } | |
38 | - | |
39 | 34 | const heightNum = ref(800); |
40 | 35 | const showVideo = ref(false); |
41 | 36 | const options = reactive({ | ... | ... |
... | ... | @@ -10,11 +10,16 @@ |
10 | 10 | import { useFullscreen } from '@vueuse/core'; |
11 | 11 | import CameraDrawer from './CameraDrawer.vue'; |
12 | 12 | import { useDrawer } from '/@/components/Drawer'; |
13 | - import { PageMode } from './config.data'; | |
13 | + import { AccessMode, MediaType, PageMode } from './config.data'; | |
14 | 14 | import SvgIcon from '/@/components/Icon/src/SvgIcon.vue'; |
15 | 15 | import { isDef } from '/@/utils/is'; |
16 | + import { getStreamingPlayUrl } from '/@/api/camera/cameraManager'; | |
16 | 17 | |
17 | - type CameraRecordItem = CameraRecord & { canPlay?: boolean }; | |
18 | + type CameraRecordItem = CameraRecord & { | |
19 | + canPlay?: boolean; | |
20 | + type?: string; | |
21 | + isTransform?: boolean; | |
22 | + }; | |
18 | 23 | |
19 | 24 | const emit = defineEmits(['switchMode']); |
20 | 25 | const organizationIdTreeRef = ref(null); |
... | ... | @@ -76,13 +81,48 @@ |
76 | 81 | organizationId: unref(organizationId)!, |
77 | 82 | }); |
78 | 83 | pagination.total = total; |
84 | + | |
85 | + for (const item of items) { | |
86 | + // await beforeVideoPlay(item); | |
87 | + (item as CameraRecordItem).isTransform = false; | |
88 | + beforeVideoPlay(item); | |
89 | + } | |
79 | 90 | cameraList.value = items; |
80 | - console.log({ url: cameraList.value.map((item) => item.videoUrl) }); | |
81 | 91 | } catch (error) { |
82 | 92 | } finally { |
83 | 93 | loading.value = false; |
84 | 94 | } |
85 | 95 | }; |
96 | + const getMediaType = (suffix: string) => { | |
97 | + return suffix === MediaType.M3U8 ? suffix : `video/${suffix}`; | |
98 | + }; | |
99 | + | |
100 | + const beforeVideoPlay = async (record: CameraRecordItem) => { | |
101 | + let reg = /(?:.*)(?<=\.)/; | |
102 | + if (record.accessMode === AccessMode.ManuallyEnter) { | |
103 | + if (record.videoUrl) { | |
104 | + const type = record.videoUrl.replace(reg, ''); | |
105 | + record.type = getMediaType(type); | |
106 | + record.isTransform = true; | |
107 | + } | |
108 | + } | |
109 | + if (record.accessMode === AccessMode.Streaming) { | |
110 | + try { | |
111 | + const { data: { url } = { url: '' } } = await getStreamingPlayUrl(record.id!); | |
112 | + const type = url.replace(reg, ''); | |
113 | + const index = unref(cameraList).findIndex((item) => item.id === record.id); | |
114 | + if (~index) { | |
115 | + const oldRecord = unref(cameraList).at(index)!; | |
116 | + unref(cameraList)[index] = { | |
117 | + ...oldRecord, | |
118 | + videoUrl: url, | |
119 | + type: getMediaType(type), | |
120 | + isTransform: true, | |
121 | + }; | |
122 | + } | |
123 | + } catch (error) {} | |
124 | + } | |
125 | + }; | |
86 | 126 | |
87 | 127 | const handleSwitchLayoutWay = (pageSize: number, layout: number) => { |
88 | 128 | pagination.colNumber = layout; |
... | ... | @@ -115,7 +155,7 @@ |
115 | 155 | ~index && |
116 | 156 | !unref(cameraList).at(index)!.canPlay && |
117 | 157 | (unref(cameraList).at(index)!.canPlay = false); |
118 | - }, 10000); | |
158 | + }, 30000); | |
119 | 159 | }; |
120 | 160 | |
121 | 161 | const handleLoadData = (record: CameraRecordItem) => { |
... | ... | @@ -171,8 +211,8 @@ |
171 | 211 | :page-size="pagination.pageSize" |
172 | 212 | :show-size-changer="false" |
173 | 213 | @change="getCameraList" |
214 | + :simple="true" | |
174 | 215 | :show-quick-jumper="true" |
175 | - size="small" | |
176 | 216 | :show-total="(total) => `共 ${total} 条`" |
177 | 217 | /> |
178 | 218 | </div> |
... | ... | @@ -203,16 +243,21 @@ |
203 | 243 | :span="getColLayout" |
204 | 244 | > |
205 | 245 | <div class="box-border w-full h-full p-3"> |
206 | - <div class="bg-yellow-50 w-full h-full overflow-hidden relative video-container"> | |
246 | + <div class="bg-black w-full h-full overflow-hidden relative video-container"> | |
247 | + <Spin v-show="!item.isTransform" :spinning="!item.isTransform"> | |
248 | + <div class="bg-black text-light-50"> </div> | |
249 | + </Spin> | |
207 | 250 | <VideoPlay |
251 | + v-show="item.isTransform" | |
208 | 252 | @loadstart="handleLoadStart(item)" |
209 | 253 | @loadeddata="handleLoadData(item)" |
210 | 254 | v-bind="options" |
211 | 255 | :src="item.videoUrl" |
212 | 256 | :title="item.name" |
257 | + :type="item.type" | |
213 | 258 | /> |
214 | 259 | <div |
215 | - v-if="isDef(item.canPlay) && !item.canPlay" | |
260 | + v-if="item.isTransform && isDef(item.canPlay) && !item.canPlay" | |
216 | 261 | class="video-container-error-msk absolute top-0 left-0 text-lg w-full h-full text-light-50 flex justify-center items-center z-50 bg-black" |
217 | 262 | > |
218 | 263 | 视频加载出错了! | ... | ... |