vue项目接入海康威视H5player.js 2.0版(回放示例)

本文介绍如何在项目中集成海康威视H5播放器,实现监控视频实时播放与历史视频回放功能。文章详细记录了环境搭建过程、项目集成步骤及常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

公司项目接入海康威视的球形监控设备,需要项目支持使用海康威视监控视频,以及视频回放等功能。项目要求无插件接入,使用户体验最佳。所以采用海康威视的h5player.js,因为接入时,海康威视的js版本已经2.0,在网上没找到其他博客,所以特此记录。

环境搭建

因为被环境问题搞了好几次,所以特别在此提醒各位同学,在开发之前一定先把环境调好(真的会被搞死的,搞得我头都大了)

  1. 首先确认自身项目所在环境(http还是https),在http环境下使用ws协议,在https环境下使用wss协议,两者有严格区分,如果乱用会出现取流失败(流链接无效不通的情况)
    区分http和https的环境
  2. 确认完成自身项目环境之后,请通知后台(或海康威视技术人员)更改取流协议格式,将ws改为wss协议(更改wss协议需要海康威视技术人员给打补丁)
  3. 下载h5player.js的demo包 地址和跨域隔离方案 地址
  4. 按照demo代码进行项目集成

项目集成

  1. 将demo中的文件移至项目
    demo文件
    项目文件

  2. 将h5player.min.js引入index.html文件
    引入

  3. 页面引入
    播放器

  4. 变量引入
    全局变量
    data变量
    注意看demo,我这里的变量很多改过,进入高级模式(普通模式播不了)

  5. 方法引入

  //  选择时间段   查看历史监控视频
    searchHistoryTime(){
      if (!!!this.beginTime||!!!this.endTime){
        this.$message({
          message: '请先选择开始时间或结束时间',
          type: 'warning'
        })
        return;
      }
      let t1 = new Date(this.beginTime).getTime();
      let t2 = new Date(this.endTime).getTime();
      if (t2 - t1<=0){
        this.$message({
          message: '开始时间不得大于结束时间!',
          type: 'warning'
        })
        return;
      }
      if (t2-t1>=259200000){
        this.$message({
          message: '时间区间不得超过3天!',
          type: 'warning'
        })
        return;
      }
      $get('/device/hkdevice/info/videoPlayBack',{
        beginTime:this.beginTime,
        endTime:this.endTime,
        cameraIndexCode:this.cameraIndexCode
      }).then(res=>{
        this.monitorHistoryUrl = res.data.data.url;
        this.init();
        this.createPlayer();
        this.playbackStart();
      })
    },

    init() {
      // 设置播放容器的宽高并监听窗口大小变化
      window.addEventListener('resize', () => {
        this.player.JS_Resize()
      })
    },
    createPlayer() {
      let szBasePath = '';
      //因为项目配置在二级域名,所以文件需改变路径
      if (process.env.NODE_ENV == "production") {
        szBasePath = '/bzsv/js/'
      }
      else{
        szBasePath = '/js/'
      }

      this.player = new window.JSPlugin({
        szId: 'player',
        szBasePath: szBasePath,
        iMaxSplit: 4,
        iCurrentSplit: 1,
        openDebug: true,
        oStyle: {
          borderSelect: IS_MOVE_DEVICE ? '#000' : '#FFCC00',
        }
      })

      // 事件回调绑定
      this.player.JS_SetWindowControlCallback({
        windowEventSelect: function (iWndIndex) {  //插件选中窗口回调
          console.log('windowSelect callback: ', iWndIndex);
        },
        pluginErrorHandler: function (iWndIndex, iErrorCode, oError) {  //插件错误回调
          console.log('pluginError callback: ', iWndIndex, iErrorCode, oError);
        },
        windowEventOver: function (iWndIndex) {  //鼠标移过回调
          //console.log(iWndIndex);
        },
        windowEventOut: function (iWndIndex) {  //鼠标移出回调
          //console.log(iWndIndex);
        },
        windowEventUp: function (iWndIndex) {  //鼠标mouseup事件回调
          //console.log(iWndIndex);
        },
        windowFullCcreenChange: function (bFull) {  //全屏切换回调
          console.log('fullScreen callback: ', bFull);
        },
        firstFrameDisplay: function (iWndIndex, iWidth, iHeight) {  //首帧显示回调
          console.log('firstFrame loaded callback: ', iWndIndex, iWidth, iHeight);
        },
        performanceLack: function () {  //性能不足回调
          console.log('performanceLack callback: ');
        }
      });
    },
    /* 回放 */
    playbackStart() {
      let { player, mode, playback } = this,
          index = player.currentWindowIndex,
          playURL = this.monitorHistoryUrl,
          { startTime, endTime } = playback
      startTime = this.beginTime.slice(0,19);
      endTime = this.endTime.slice(0,19);
      startTime += 'Z'
      endTime += 'Z'
      console.log('111111111111111')
      console.log(playURL, mode, index, startTime, endTime)
      player.JS_Play(playURL, { playURL, mode }, index, startTime, endTime).then(
          () => {
            console.log('playbackStart success')
            this.playback.rate = 1
          },
          e => { console.error(e) }
      )
    },

问题及解决方案

1,打完wss补丁之后
取流失败
bug
2,出现<丢失现象
在这里插入图片描述
解决方案为:
只要console里面出现Uncaught SyntaxError: Unexpected token ‘<‘ 就是new JSPlugin的szBasePath不对导致的
确认h5player.min.js的整个bin目录是否都在,且未改变目录结构,并保证静态引入 h5player.min.js 的路径和 szBasePath 的路径一致,如下图:
注意:无论“静态引入”、“动态加载” 还是“szBasePath”,都是运行环境路径,而不是项目开发结构路径
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<think>嗯,用户想进行海康WSS服务或设备的在线测试,问到了测试方法和工具。首先,我需要回忆一下之前看到的相关引用内容。引用里提到了在Nginx环境下测试Web端显示,还有关于WSS协议在HTTPS系统中的注意事项,以及使用Node.js搭建WSS服务的方法。 用户可能需要知道具体的测试步骤和工具。首先,应该确认测试环境是否符合要求,比如Nginx配置、HTTPS证书的问题。引用2提到如果使用IP地址而不是域名,可能需要手动导入证书,这点很重要。然后,引用3里提到用Node.js搭建WSS服务,可能需要用到这个方法来测试流媒体的传输。 下来,测试工具方面,用户可能需要使用浏览器开发者工具检查WebSocket连,或者使用Postman、wscat这样的工具来手动发送WSS请求。另外,海康官方有没有提供测试工具呢?引用里没有提到,但可能需要引导用户查看官方文档或者社区资源。 还有,用户可能需要知道如何解析RTSP流,并转换成Web可播放的格式,比如WebRTC或HLS。这里可能需要FFmpeg或者相关中间件。同时,测试过程中常见的证书错误、跨域问题也需要提醒用户注意。 最后,生成相关问题的时候,要涵盖环境搭建、常见错误、实时显示优化、替代方案等,帮助用户全面了解可能遇到的问题和解决方法。</think>### 海康WSS服务/设备在线测试方法 #### 一、测试环境搭建步骤 1. **证书配置** - 若使用HTTPS协议且通过IP地址访问,需手动导入海康设备证书到浏览器信任列表(如麒麟系统的奇安信浏览器)[^2] - 生成合法域名证书(推荐Let's Encrypt免费证书),避免IP地址导致的证书不信任问题 2. **服务端部署** ```nginx # Nginx配置示例(反向代理) location /wss/ { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ``` 引用[1]提供的海康Web端显示方案可作为基础框架 3. **流媒体处理** - 使用Node.js搭建WSS服务,解析RTSP流: ```javascript const WebSocket = require('ws'); const wsServer = new WebSocket.Server({ port: 8000 }); wsServer.on('connection', (ws) => { // RTSP取流格式示例:rtsp://admin:password@192.168.1.64/h264/ch1/sub/av_stream const ffmpeg = spawn('ffmpeg', [...]); // 视频流转发逻辑 }); ``` 具体实现可参考引用[3]的RTSP取流方案 #### 二、测试工具与方法 1. **浏览器开发者工具** - 检查WebSocket连状态(Chrome DevTools -> Network -> WS) - 验证WSS握手过程是否成功 2. **命令行工具** ```bash # 使用wscat测试WSS连 wscat -c wss://yourdomain.com/wss/stream ``` 3. **视频流验证** - 通过H5播放器测试实时频: ```html <video id="hikVideo" controls> <source src="wss://yourdomain.com/wss/stream" type="application/webrtc"> </video> ``` #### 三、常见问题排查 1. **证书错误处理** - 当出现`SEC_ERROR_INVALID_HTTP_REQUEST`时,检查证书绑定域名与实际访问地址是否一致[^2] - IP地址访问需单独配置证书信任 2. **跨域问题** ```nginx add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; ``` 3. **频卡顿优化** - 调整RTSP取流参数:`h264`编码优于`h265` - 设置合适的频分辨率(200W像素建议720P)
评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值