diff --git a/electron/electron.js b/electron/electron.js index e8b906b..15a1a85 100644 --- a/electron/electron.js +++ b/electron/electron.js @@ -1,9 +1,106 @@ // electron/electron.js const path = require('path'); -const { app, BrowserWindow } = require('electron'); +const { app, BrowserWindow, ipcMain } = require('electron'); const isDev = process.env.IS_DEV == "true" ? true : false; +// rtsp相关,ffmpeg-static会自动下载对应平台windos,linux,mac(intle),mac(M1版本)的ffmpeg二进制文件 +const ffmpegPath = require('ffmpeg-static') +/** + stream相关配置及方法 + name = options.name + streamUrl = options.streamUrl + width = options.width + height = options.height + wsPort = options.wsPort + nputStreamStarted = false + stream = undefined + ffmpegPath = options?.ffmpegPath ?? ffmpeg + stop() + */ + const Stream = require('node-rtsp-stream') + /** + * rtsp列表 + * interface { + * rtspUrl: { + * ws: websocket地址 + * stream: stream实例 + * } + * } + */ + const rtspOpenders = {} + let addPort = 9000 + +/** + * 开启rtsp + * @param rtsp {String} rtsp流地址 + */ + + +ipcMain.on('openRtsp', (event, rtsp) => { + /** 判断是否已开启,若已开启,直接返回ws地址, 未开启则先开启再返回 */ + if (rtspOpenders[rtsp]) { + event.returnValue = { + code: 200, + msg: '开启成功', + ws: rtspOpenders[rtsp].ws + } + } else { + addPort++ + const stream = new Stream({ + name: `socket-${addPort}`, + streamUrl: rtsp, + wsPort: addPort, + ffmpegPath: app.isPackaged ? ffmpegPath.replace('app.asar', 'app.asar.unpacked') : ffmpegPath, + ffmpegOptions: { + '-stats': '', + '-r': 30 + } + }).on('exitWithError', () => { + stream.stop() + delete rtspOpenders[rtsp] + event.returnValue = { + code: 400, + msg: '开启失败' + } + }) + rtspOpenders[rtsp] = { + ws: `ws://localhost:${addPort}`, + stream: stream + } + event.returnValue = { + code: 200, + msg: '开启成功', + ws: rtspOpenders[rtsp].ws + } + } +}) + +/** + * 关闭rtsp + */ +ipcMain.on('closeRtsp', (event, rtsp) => { + if (rtspOpenders[rtsp]) { + // 停止解析 + rtspOpenders[rtsp].stream.stop() + // 删除该项 + delete rtspOpenders[rtsp] + // 返回结果 + event.returnValue = { + code: 200, + msg: '关闭成功' + } + } else { + event.returnValue = { + code: 400, + msg: '未找到该rtsp' + } + } +}) + + +/////////////////////////////////////////// + function createWindow() { // Create the browser window. const mainWindow = new BrowserWindow({ @@ -14,7 +111,11 @@ function createWindow() { javascript: true, plugins: true, allowRunningInsecureContent: true, + // 允许web断使用node nodeIntegration: true, + contextIsolation: false, + // 同源策略关闭 + webSecurity: false, }, }); diff --git a/package.json b/package.json index 99f9d79..8130076 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "zgx", "version": "3.5.1", "author": { - "name": "zgx", - "email": "zgx@163.com" + "name": "ZGX", + "email": "ZGX@163.com", + "url": "https://github.com/jeecgboot/jeecgboot-vue3" }, - "description":"边海防智能监控站", "main": "electron/electron.js", "build": { "appId": "com.my-website.my-app", @@ -14,6 +14,7 @@ "mac": { "category": "public.app-category.utilities" }, + "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true @@ -35,10 +36,11 @@ }, "scripts": { "electron:serve": "cross-env IS_DEV=true electron .", - "electron:start": "npm run dev & npm run electron:serve", + "electron:start": "npm run dev & npm run electron:serve", "electron:dev": "concurrently \"npm run dev\" \"npm run electron:serve\" ", "electron:build.win": "npm run build && electron-builder --win --dir", "electron:builder": "electron-builder --win --dir", + "electron:builder.ia32": "electron-builder --win --ia32", "bootstrap": "pnpm install", "serve": "npm run dev", "dev": "vite", @@ -97,8 +99,10 @@ "electron-packager": "^17.1.2", "emoji-mart-vue-fast": "^11.1.1", "enquire.js": "^2.1.6", + "ffmpeg-static": "^5.2.0", "intro.js": "^5.1.0", "jquery": "^3.7.0", + "jsmpeg-player": "^3.0.3", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "lodash.get": "^4.4.2", @@ -106,6 +110,7 @@ "mitt": "^3.0.1", "mockjs": "^1.1.0", "moment": "^2.29.4", + "node-rtsp-stream": "^0.0.9", "nprogress": "^0.2.0", "particles.vue3": "^2.11.0", "path-to-regexp": "^6.2.0", diff --git a/src/views/system/loginmini/ZGXLoginRTSPTest.vue b/src/views/system/loginmini/ZGXLoginRTSPTest.vue new file mode 100644 index 0000000..aa8f458 --- /dev/null +++ b/src/views/system/loginmini/ZGXLoginRTSPTest.vue @@ -0,0 +1,181 @@ + + + + + +