vue+flv.js+SpringBoot+websocket实现视频监控与回放

本文介绍如何利用vue、flv.js、SpringBoot和websocket实现视频监控与回放功能。通过设备注册、socket连接、后端推流接口,实现实时监控和回放。在前端,遇到ie浏览器flv.js引用问题,通过修改webpack配置解决。后端使用SDK实现设备服务和推流。在播放时注意hasAudio参数设置,否则可能导致播放错误。这种方式虽支持多种浏览器但对服务器压力较大,可能导致卡顿。

vue+flv.js+SpringBoot+websocket实现视频监控与回放

需求:vue+springboot的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能.

  1. 之前项目里是纯前端实现视频监控和回放功能.但是有局限性.就是ip地址必须固定.新的需求里设备ip不固定.所以必须换一种思路.
  2. 通过设备的主动注册,让设备去主动连接服务器后端通过socket推流给前端实现实时监控和回放功能;

思路:

1:初始化设备.后端项目启动时就调用初始化方法.
2:开启socket连接.前端页面加载时尝试连接socket.
3:点击播放,调用后端推流接口.并且前端使用flv.js实现播放.

准备工作:

1:vue项目引入flv.js。
npm install --save flv.js
main.js里面引入
import flvjs from ‘flv.js’;
Vue.use(flvjs)
但是这里我遇见一个坑.开发模式没有问题.但是打包之后发现ie浏览器报语法错误.不支持此引用.所以修改引用地址.
在webpack.base.conf.js的module.exports下添加

  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'flvjs':'flv.js/dist/flv.js'
    }
  },

plugins下添加

  plugins: [
    new webpack.ProvidePlugin({
      flvjs:'flvjs',
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery"
    })
  ],

最后页面引入时:

import flvjs from "flv.js/dist/flv.js";

2.准备一个硬盘录像机,并添加一个摄像头设备以做测试使用.
硬盘录像机设置为主动注册模式.并配置好ip和端口以及子设备ID
在这里插入图片描述
在设置里的网络设置里面
在这里插入图片描述

3.后端搭建好websocket工具类
包含通用的OnOpen,onClose,onError等方法.

实现:
1.项目启动开启设备服务.这个SDKLIB里面都有就不介绍了.
2.页面加载尝试开启socket连接.

//尝试连接websocket
    startSocket(channelnum, device_value) {
      try {
        let videoWin = document.getElementById(this.currentSelect);
        if (flvjs.isSupported()) {
          let websocketName =
            "/device/monitor/videoConnection/" + channelnum + device_value;
          console.log("进入连接websocket", this.ipurl + websocketName);
          const flvPlayer = flvjs.createPlayer(
            {
              type: "flv",
              //是否是实时流
              isLive: true,
              //是否有音频
              hasAudio: false,
              url: this.ipurl + websocketName,
              enableStashBuffer: true,
            },
            {
              enableStashBuffer: false,
              stashInitialSize: 128,
            }
          );
          flvPlayer.on("error", (err) => {
            console.log("err", err);
          });
          flvjs.getFeatureList();
          flvPlayer.attachMediaElement(videoWin);
          flvPlayer.load();
          flvPlayer.play();
          return true;
        }
      } catch (error) {
        console.log("连接websocket异常", error);
        return false;
      }
    },

这里传的参数是通道号和设备信息.无需在意.只要是唯一key就可以.

2.socke

<think>首先,用户的问题是:“我想在Vue2项目中集成海康威视监控视频流,并部署到服务器上 请问vue2 海康威视 监控视频实现部署”。这是一个关于在Vue2项目中集成海康威视监控视频流的实现和部署的查询。 在系统级指令中,有引用[1]和[^2],它们提供了关于Vue2和Vue3集成海康威视监控的信息。具体来说: - 引用[^1]:针对Vue2/3,详细对接海康监控实时视频预览和录像回放功能,包括取流协议、实时预览、录像回放等。 - 引用[^2]:针对Vue3,但提到类似功能如实时显示、回放等。 用户的问题指定了Vue2,所以我需要基于引用[^1]来回答,因为它明确提到了Vue2/3。 关键点: - 使用海康开放平台,通过取流协议(如RTSP、HLS、FLV)来获取视频流。 - 在Vue项目中实现实时预览、录像回放等功能。 - 部署到服务器时,需要注意连接问题、视频卡顿、黑屏等常见问题。 我的回答需要: 1. 使用中文。 2. 结构清晰,逐步解决问题。 3. 保证真实可靠。 4. 在行内数学表达式使用$...$,独立公式用$$...$$,但这个问题可能不需要数学公式,除非涉及计算。 5. 生成相关问题。 6. 在引用段落末尾添加引用标识,如[^1]。 回答结构: 1. **介绍**:简要概述如何在Vue2项目中集成海康威视视频流。 2. **准备工作**:列出所需的东西,如海康威视账号、SDK、API密钥等。 3. **实现步骤**: - 安装依赖(如使用video.js、hls.js或其他库来处理视频流)。 - 获取视频流URL(通过海康开放平台)。 - 在Vue组件中嵌入视频播放器。 - 处理实时预览和录像回放。 4. **部署考虑**:部署到服务器时,处理跨域、HTTPS、视频流稳定性等。 5. **常见问题解决**:如视频卡顿、黑屏、连接失败。 6. **代码示例**:提供简单的Vue2组件代码示例。 7. **生成相关问题**:在最后添加相关问题。 引用标识:在引用信息时,添加[^1]。例如,基于引用[^1],提到取流协议。 生成相关问题:在回答末尾,添加类似示例的“相关问题”部分。 确保LaTeX语法正确:由于问题可能不涉及数学,我会避免不必要的LaTeX,但如果有变量,使用$...$。 现在,构建回答: - **标题**:在Vue2项目中集成海康威视监控视频实现部署 - **内容**: 1. **准备工作**: - 注册海康威视开放平台账号。 - 获取设备信息(如设备序列号、验证码)。 - 申请API密钥或Token。 - 选择取流协议(如RTMP、HLS、FLV)。 2. **实现步骤**: - 在Vue2项目中安装视频播放库,如video.js或使用海康提供的Web组件。 - 创建Vue组件来显示视频。 - 使用axios或fetch从海康平台获取视频流URL。 - 嵌入视频播放器,处理实时流。 - 实现控制功能(如播放、暂停、回放)。 3. **部署到服务器**: - 确保服务器支持HTTPS(因为视频流可能要求安全连接)。 - 处理跨域问题(CORS)。 - 优化视频流以减少卡顿(如使用CDN、调整码率)。 - 测试在公网环境下的连接。 4. **常见问题**: - 黑屏:检查URL是否正确,网络连接。 - 卡顿:优化网络,使用合适的协议。 - 部署后失败:确保API调用有权限,服务器配置正确。 5. **代码示例**:提供一个简单的Vue2组件代码。 6. **引用**:基于引用[^1]的信息。 最后,添加相关问题: - 例如:1. 如何优化海康威视视频流的性能?2.Vue2中如何处理视频流的安全问题?3. 部署后如何监控视频流的稳定性? 确保回答真实可靠:基于一般知识和提供的引用。</think>### 在Vue2项目中集成海康威视监控视频实现部署指南 在Vue2项目中集成海康威视监控视频流,需要结合海康开放平台的取流协议(如RTSP、HLS或FLV)来实现实时预览、录像回放等功能,并确保部署到服务器后稳定运行。以下是基于海康威视官方文档和最佳实践的逐步解决方案[^1]。整个过程分为准备工作、实现步骤、部署注意事项和常见问题解决四部分。 --- #### 一、准备工作 在开始编码前,确保完成以下基础配置: 1. **注册海康开放平台账号**: - 访问[海康威视开放平台](https://open.hikvision.com/),注册开发者账号。 - 创建应用,获取`AppKey`和`AppSecret`(用于API认证)。 2. **准备设备信息**: - 获取监控设备的序列号(如`DS-2CD3XXX`)和验证码(设备初始密码)。 - 在平台中添加设备,生成设备访问令牌(Token)。 3. **选择取流协议**: - 实时预览:推荐使用HLS或FLV协议(兼容性更好)。 - 录像回放:使用RTSP或HLS协议。 - 注意:协议需根据设备型号支持情况选择[^1]。 4. **Vue2项目环境**: - 安装Node.js(≥v12)和Vue CLI(`npm install -g @vue/cli`)。 - 创建Vue2项目:`vue create my-vue2-project`。 --- #### 二、实现步骤:在Vue2中集成视频流 核心是使用视频播放库(如`video.js`或`flv.js`)解析海康视频流,并通过Vue组件嵌入。以下是关键步骤: ##### 步骤1: 安装依赖库 在Vue2项目中安装视频处理库: ```bash npm install video.js flv.js axios --save # video.js用于播放,flv.js处理FLV流,axios用于API调用 ``` ##### 步骤2: 获取视频流URL 通过海康API获取实时流或回放流的URL。示例API调用(在Vue组件方法中): ```javascript import axios from 'axios'; async function getVideoStreamUrl(deviceId, protocol = 'hls') { const token = 'YOUR_HIK_TOKEN'; // 替换为实际Token const apiUrl = `https://open.hikvision.com/api/v1/devices/${deviceId}/streams?protocol=${protocol}`; try { const response = await axios.get(apiUrl, { headers: { 'Authorization': `Bearer ${token}` } }); return response.data.data.streamUrl; // 返回流地址,如"https://stream.hikvision.com/live/123.flv" } catch (error) { console.error('获取视频流失败:', error); return null; } } ``` ##### 步骤3: 创建视频播放组件 在Vue组件中嵌入视频播放器。示例代码(`src/components/HikVideoPlayer.vue`): ```vue <template> <div> <video ref="videoPlayer" class="video-js vjs-default-skin" controls></video> </div> </template> <script> import videojs from 'video.js'; import 'video.js/dist/video-js.css'; // 引入样式 import flvjs from 'flv.js'; export default { props: { streamUrl: String, // 父组件传入的视频流URL streamType: { type: String, default: 'flv' } // 流协议类型:flv, hls等 }, mounted() { this.initPlayer(); }, beforeDestroy() { if (this.player) { this.player.dispose(); // 销毁播放器,避免内存泄漏 } }, methods: { initPlayer() { if (!this.streamUrl) return; const videoElement = this.$refs.videoPlayer; // 根据协议初始化播放器 if (this.streamType === 'flv' && flvjs.isSupported()) { const flvPlayer = flvjs.createPlayer({ type: 'flv', url: this.streamUrl }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } else { // 使用video.js处理HLS等其他协议 this.player = videojs(videoElement, { sources: [{ src: this.streamUrl, type: `video/${this.streamType}` }], autoplay: true, controls: true }); } } } }; </script> <style scoped> .video-js { width: 100%; max-width: 800px; height: auto; } </style> ``` ##### 步骤4: 在父组件中调用 在页面组件(如`src/views/VideoPage.vue`)中使用视频播放器: ```vue <template> <div> <hik-video-player :stream-url="liveStreamUrl" stream-type="flv" /> <button @click="loadReplay">加载回放视频</button> </div> </template> <script> import HikVideoPlayer from '@/components/HikVideoPlayer.vue'; export default { components: { HikVideoPlayer }, data() { return { liveStreamUrl: '' // 存储实时流URL }; }, async mounted() { const deviceId = 'YOUR_DEVICE_ID'; // 替换为设备ID this.liveStreamUrl = await this.getVideoStreamUrl(deviceId, 'flv'); }, methods: { async loadReplay() { // 示例:获取回放流(需指定时间范围) const replayUrl = await getVideoStreamUrl('DEVICE_ID', 'hls', { startTime: '2023-01-01T00:00:00Z', endTime: '2023-01-01T01:00:00Z' }); this.liveStreamUrl = replayUrl; } } }; </script> ``` --- #### 三、部署到服务器的注意事项 部署时需解决网络、安全和性能问题: 1. **服务器环境配置**: - 使用Nginx或Apache作为Web服务器,配置HTTPS(视频流要求安全连接)。 - 示例Nginx配置(处理跨域和流代理): ```nginx server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { root /path/to/vue-project/dist; try_files $uri $uri/ /index.html; } # 代理海康流地址,解决跨域 location /proxy/ { proxy_pass https://stream.hikvision.com/; add_header 'Access-Control-Allow-Origin' '*'; } } ``` 2. **优化视频流性能**: - 使用CDN加速视频流分发,减少延迟。 - 在Vue中启用懒加载或分块加载(如`video.js`的`adaptive`插件)。 3. **处理常见部署问题**: - **连接失败或黑屏**:确保服务器IP在白名单中(海康平台需配置),检查HTTPS证书有效性[^1]。 - **视频卡顿**: - 降低视频码率(通过海康设备配置)。 - 使用WebSocket替代HTTP流(如FLV over WebSocket)。 - **移动端兼容**:在`video.js`中启用H5原生播放器选项。 --- #### 四、常见问题解决 - **本地开发正常,部署后不显示视频**: 检查服务器防火墙是否开放海康流端口(默认554 for RTSP),或使用Nginx代理绕过限制[^1]。 - **视频流延迟高**: 切换到低延迟协议(如RTMP),或在Vue中使用`WebRTC`集成(需设备支持)。 - **离开页面视频继续推流**: 在Vue组件的`beforeDestroy`钩子中手动停止播放器(参考步骤3代码)。 > **提示**:以上实现基于海康开放平台的取流协议,完整流程可参考官方文档[^1]。部署时建议先在测试环境验证,再上线生产环境。 ---
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值