From 2d881eae08d7430ddaf1a98bde655e48d28d17d9 Mon Sep 17 00:00:00 2001 From: zjc <1034206993@qq.com> Date: Sat, 22 Feb 2025 12:59:47 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E5=96=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 27 +--------- package.json | 2 - src/components/CoreVideo/index.vue | 54 ++++++++++---------- src/components/VideoDialog/index.vue | 68 +++++++++++++++++++------- src/hooks/socket.js | 1 + src/layout/index.vue | 8 +-- src/views/home/components/box-1.vue | 16 ------ src/views/monitor/components/box-2.vue | 44 +++++------------ 8 files changed, 96 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87e8056..0d0e5c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,10 +12,8 @@ "echarts": "^5.5.1", "echarts-wordcloud": "^2.0.0", "element-plus": "^2.9.0", - "flv.js": "^1.6.2", "hls.js": "^1.5.18", "lodash": "^4.17.21", - "mitt": "^3.0.1", "pinia": "^2.2.6", "pubsub-js": "^1.9.5", "vue": "^3.5.13", @@ -1752,12 +1750,6 @@ "dev": true, "peer": true }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "license": "MIT" - }, "node_modules/esbuild": { "version": "0.24.0", "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.0.tgz", @@ -1989,16 +1981,6 @@ "node": ">=8" } }, - "node_modules/flv.js": { - "version": "1.6.2", - "resolved": "https://registry.npmmirror.com/flv.js/-/flv.js-1.6.2.tgz", - "integrity": "sha512-xre4gUbX1MPtgQRKj2pxJENp/RnaHaxYvy3YToVVCrSmAWUu85b9mug6pTXF6zakUjNP2lFWZ1rkSX7gxhB/2A==", - "license": "Apache-2.0", - "dependencies": { - "es6-promise": "^4.2.8", - "webworkify-webpack": "^2.1.5" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -2583,7 +2565,8 @@ "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true }, "node_modules/mlly": { "version": "1.7.3", @@ -4007,12 +3990,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webworkify-webpack": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/webworkify-webpack/-/webworkify-webpack-2.1.5.tgz", - "integrity": "sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw==", - "license": "MIT" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index b6af09e..70c1645 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,8 @@ "echarts": "^5.5.1", "echarts-wordcloud": "^2.0.0", "element-plus": "^2.9.0", - "flv.js": "^1.6.2", "hls.js": "^1.5.18", "lodash": "^4.17.21", - "mitt": "^3.0.1", "pinia": "^2.2.6", "pubsub-js": "^1.9.5", "vue": "^3.5.13", diff --git a/src/components/CoreVideo/index.vue b/src/components/CoreVideo/index.vue index a089ba5..037584f 100644 --- a/src/components/CoreVideo/index.vue +++ b/src/components/CoreVideo/index.vue @@ -22,6 +22,7 @@ :controls="false" style="object-fit: cover" > + @@ -46,45 +47,46 @@ let webRtcServerList = ref([]) const handleItem = (item) => { - // src.value = item.hlsUrl - src.value = item.rtspUrl + src.value = item.hlsUrl + // src.value = item.rtspUrl cameraIndexCode.value = item.cameraIndexCode videoShow.value = true } const getVideoList = async () => { let res = await getVideoListApi({ - type: 'rtsp', businessVideoDisplayPosition: '核心景区视频' }) - console.log(res, '视频列表') list.value = res.data - nextTick(() => { - list.value.forEach(async (item, index) => { - let webRtcServer = new WebRtcStreamer( - `video${index}`, - `${mode == 'dev' ? baseUrl : proBaseUrl}/webrtc` - ) - webRtcServer.connect(item.rtspUrl) - webRtcServerList.value.push(webRtcServer) - }) - }) - // nextTick(() => { // list.value.forEach(async (item, index) => { - // var video = document.getElementById(`video${index}`) - // const hls = new Hls({ - // maxBufferLength: 10, // 最大缓冲长度(秒) - // maxMaxBufferLength: 15, // 缓冲区长度的上限 - // maxBufferSize: 20 * 1000 * 1000 // 最大缓冲大小(字节) - // }) - // hls.loadSource(item.hlsUrl) - // hls.attachMedia(video) - // hls.on(Hls.Events.MANIFEST_PARSED, () => { - // video.play() - // }) + // let webRtcServer = new WebRtcStreamer( + // `video${index}`, + // `${mode == 'dev' ? baseUrl : proBaseUrl}/webrtc` + // ) + // webRtcServer.connect(item.rtspUrl, '', 'rtptransport=tcp') + // webRtcServerList.value.push(webRtcServer) // }) // }) + + nextTick(() => { + list.value.forEach(async (item, index) => { + var video = document.getElementById(`video${index}`) + const hls = new Hls({ + enableWorker: false, // 禁用 Worker 来避免额外的线程 + enableSoftwareAES: true, // 使用软件解码器以避免硬件解码的额外请求 + cache: true, // 启用缓存 + maxBufferLength: 10, // 最大缓冲长度(秒) + maxMaxBufferLength: 15, // 缓冲区长度的上限 + maxBufferSize: 20 * 1000 * 1000 // 最大缓冲大小(字节) + }) + hls.loadSource(item.hlsUrl) + hls.attachMedia(video) + hls.on(Hls.Events.MANIFEST_PARSED, () => { + video.play() + }) + }) + }) } onMounted(() => { getVideoList() diff --git a/src/components/VideoDialog/index.vue b/src/components/VideoDialog/index.vue index ba77915..d616fec 100644 --- a/src/components/VideoDialog/index.vue +++ b/src/components/VideoDialog/index.vue @@ -1,11 +1,18 @@