Commit c44a27b8896b68ea494e014034af3d545add8d01
Merge branch 'fix/video-component' into 'main_dev'
fix: 视频组件视频流为必选&&视频新增loading加载 See merge request yunteng/thingskit-scada!222
Showing
2 changed files
with
63 additions
and
51 deletions
| ... | ... | @@ -66,9 +66,13 @@ const [register, { getFieldsValue, validate, setFieldsValue }] = useForm({ |
| 66 | 66 | field: VideoFormFieldsEnum.VIDEO_ID, |
| 67 | 67 | label: VideoFormFieldsNameEnum.VIDEO_ID, |
| 68 | 68 | component: ComponentEnum.API_SELECT, |
| 69 | + required: true, | |
| 69 | 70 | componentProps: ({ formModel }) => { |
| 70 | 71 | return { |
| 71 | - api: getCameraList, | |
| 72 | + api: async (params: Record<'organizationId', string>) => { | |
| 73 | + if (!params.organizationId) return [] | |
| 74 | + return await getCameraList(params) | |
| 75 | + }, | |
| 72 | 76 | params: { |
| 73 | 77 | organizationId: formModel[ContentDataFieldsEnum.ORG_ID], |
| 74 | 78 | }, |
| ... | ... | @@ -167,9 +171,10 @@ createPublicFormContext(nodeDataActinType) |
| 167 | 171 | |
| 168 | 172 | <style lang="less" scoped> |
| 169 | 173 | .form-container { |
| 174 | + @apply text-sm; | |
| 175 | + | |
| 176 | + :deep(.ant-divider) { | |
| 170 | 177 | @apply text-sm; |
| 171 | - :deep(.ant-divider) { | |
| 172 | - @apply text-sm; | |
| 173 | - } | |
| 174 | 178 | } |
| 179 | +} | |
| 175 | 180 | </style> | ... | ... |
| 1 | 1 | <script setup lang="ts"> |
| 2 | +import { Spin } from 'ant-design-vue' | |
| 2 | 3 | import { computed, nextTick, onMounted, onUnmounted, ref, toRaw, unref } from 'vue' |
| 3 | 4 | import 'video.js/dist/video-js.css' |
| 4 | 5 | |
| ... | ... | @@ -21,6 +22,7 @@ const props = defineProps<{ |
| 21 | 22 | // 获取节点数据 |
| 22 | 23 | const contentDataStore = useContentDataStore() |
| 23 | 24 | const { getResult } = useFingerprint() |
| 25 | +const loading = ref(false) | |
| 24 | 26 | |
| 25 | 27 | const getOptions = computed<VideoJsPlayerOptions>(() => { |
| 26 | 28 | const { config } = props || {} |
| ... | ... | @@ -47,53 +49,58 @@ const playSource = ref<Record<'src' | 'type', string>>( |
| 47 | 49 | |
| 48 | 50 | // 数据绑定获取的url |
| 49 | 51 | const handleGetVideoPlay = async () => { |
| 50 | - const { dataSourceJson } = unref(videoConfig)[0] || {} | |
| 51 | - const { videoOption } = dataSourceJson || {} | |
| 52 | - const { id, accessMode, videoUrl, deviceId, channelId } = videoOption || {} | |
| 53 | - let type = getVideoTypeByUrl(videoUrl!) | |
| 54 | - let playUrl = videoUrl | |
| 55 | - | |
| 56 | - // 判断是否是流媒体播放 | |
| 57 | - if (accessMode === VideoAccessModeEnum.Streaming && id) { | |
| 58 | - const { data: { url } = { url: '' } } = await getStreamingPlayUrl(id!) | |
| 59 | - playUrl = url | |
| 60 | - playUrl && (type = getVideoTypeByUrl(playUrl!)) | |
| 61 | - } | |
| 62 | - else if (accessMode === VideoAccessModeEnum.GBT28181 && deviceId && channelId) { | |
| 63 | - const { | |
| 64 | - data: { flv }, | |
| 65 | - } = await getVideoControlStart({ channelId, deviceId }) | |
| 52 | + try { | |
| 53 | + loading.value = true | |
| 54 | + const { dataSourceJson } = unref(videoConfig)[0] || {} | |
| 55 | + const { videoOption } = dataSourceJson || {} | |
| 56 | + const { id, accessMode, videoUrl, deviceId, channelId } = videoOption || {} | |
| 57 | + let type = getVideoTypeByUrl(videoUrl!) | |
| 58 | + let playUrl = videoUrl | |
| 59 | + // 判断是否是流媒体播放 | |
| 60 | + if (accessMode === VideoAccessModeEnum.Streaming && id) { | |
| 61 | + const { data: { url } = { url: '' } } = await getStreamingPlayUrl(id!) | |
| 62 | + playUrl = url | |
| 63 | + playUrl && (type = getVideoTypeByUrl(playUrl!)) | |
| 64 | + } | |
| 65 | + else if (accessMode === VideoAccessModeEnum.GBT28181 && deviceId && channelId) { | |
| 66 | + const { | |
| 67 | + data: { flv }, | |
| 68 | + } = await getVideoControlStart({ channelId, deviceId }) | |
| 66 | 69 | |
| 67 | - playUrl = flv | |
| 68 | - type = VideoPlayerType.flv | |
| 69 | - } | |
| 70 | + playUrl = flv | |
| 71 | + type = VideoPlayerType.flv | |
| 72 | + } | |
| 70 | 73 | |
| 71 | - // 判断是否是rtsp播放 | |
| 72 | - if (isRtspProtocol(videoUrl!)) { | |
| 73 | - const result = await getResult() | |
| 74 | - const { visitorId } = result | |
| 75 | - playUrl = getFlvPlayUrl(playUrl!, visitorId) | |
| 76 | - withToken.value = true | |
| 77 | - } | |
| 74 | + // 判断是否是rtsp播放 | |
| 75 | + if (isRtspProtocol(videoUrl!)) { | |
| 76 | + const result = await getResult() | |
| 77 | + const { visitorId } = result | |
| 78 | + playUrl = getFlvPlayUrl(playUrl!, visitorId) | |
| 79 | + withToken.value = true | |
| 80 | + } | |
| 78 | 81 | |
| 79 | - playSource.value = { | |
| 80 | - src: playUrl!, | |
| 81 | - type, | |
| 82 | - } | |
| 82 | + playSource.value = { | |
| 83 | + src: playUrl!, | |
| 84 | + type, | |
| 85 | + } | |
| 83 | 86 | |
| 84 | - const instance = unref(basicVideoPlayEl)?.customInit((options) => { | |
| 85 | - if (unref(withToken)) { | |
| 86 | - (options as any).flvjs.config.headers = { | |
| 87 | - 'X-Authorization': `Bearer ${isShareMode() ? getShareJwtToken() : getJwtToken()}`, | |
| 87 | + const instance = unref(basicVideoPlayEl)?.customInit((options) => { | |
| 88 | + if (unref(withToken)) { | |
| 89 | + (options as any).flvjs.config.headers = { | |
| 90 | + 'X-Authorization': `Bearer ${isShareMode() ? getShareJwtToken() : getJwtToken()}`, | |
| 91 | + } | |
| 88 | 92 | } |
| 89 | - } | |
| 90 | - return { | |
| 91 | - ...options, | |
| 92 | - sources: [toRaw(unref(playSource))], | |
| 93 | - } as VideoJsPlayerOptions | |
| 94 | - }) | |
| 93 | + return { | |
| 94 | + ...options, | |
| 95 | + sources: [toRaw(unref(playSource))], | |
| 96 | + } as VideoJsPlayerOptions | |
| 97 | + }) | |
| 95 | 98 | |
| 96 | - instance?.play() | |
| 99 | + instance?.play() | |
| 100 | + } | |
| 101 | + finally { | |
| 102 | + loading.value = false | |
| 103 | + } | |
| 97 | 104 | } |
| 98 | 105 | |
| 99 | 106 | // 默认播放 |
| ... | ... | @@ -135,12 +142,12 @@ onUnmounted(async () => { |
| 135 | 142 | |
| 136 | 143 | <template> |
| 137 | 144 | <div class="w-full h-full flex justify-center items-center"> |
| 138 | - <!-- <Spin :spinning="loading" wrapper-class-name="video-spin" class="w-full h-full"> --> | |
| 139 | - <BasicVideoPlay | |
| 140 | - ref="basicVideoPlayEl" :options="getOptions" :with-token="withToken" | |
| 141 | - :immediate-init-on-mounted="false" | |
| 142 | - /> | |
| 143 | - <!-- </Spin> --> | |
| 145 | + <Spin :spinning="loading"> | |
| 146 | + <BasicVideoPlay | |
| 147 | + ref="basicVideoPlayEl" :options="getOptions" :with-token="withToken" | |
| 148 | + :immediate-init-on-mounted="false" | |
| 149 | + /> | |
| 150 | + </Spin> | |
| 144 | 151 | </div> |
| 145 | 152 | </template> |
| 146 | 153 | ... | ... |