Vue + RTP 视频实时监控

一、环境

// Vue: 2.6.10
// kurento-utils: 6.15.0

// 安装kurento-utils
npm install kurento-utils

二、代码

    1、JS封装

// Time:   2021/11/17 11:16
// Author: Dily
// Remark:
import kurentoUtils from 'kurento-utils'

let websocket = null
let webRtcPeer = null
let video = null // DOM元素
let videourl = ''  // 视频流获取地址
let wssUrl = ''    // 连接后台websocket

// 初始化
function initVideo(video_dom, wsUrl, videoUrl) {
  websocket = new WebSocket(wsUrl)
  wssUrl = wsUrl
  videourl = videoUrl
  video = video_dom
}

// 获取数据并播放
function playVideo(isAudio, isVideo) {
  websocket.onopen = () => getVideo(isAudio, isVideo)
  websocket.onerror = () => initVideo(video, wssUrl, videourl)
  websocket.onmessage = onMessage
}

// 关闭websocket
function destroyVideo() {
  if (websocket) websocket.close()
}

// 使用RTP获取视频流
function getVideo(isAudio, isVideo) {
  // Video and audio by default
  const userMediaConstraints = {
    audio: isAudio,
    video: isVideo
  }

  const options = {
    remoteVideo: video,
    mediaConstraints: userMediaConstraints,
    onicecandidate: onIceCandidate
  }
  webRtcPeer = new kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, error => {
    error ? console.error(error) : ''
    webRtcPeer.generateOffer(onOffer)
  })
}

// candidate对象
function onIceCandidate(candidate) {
  const message = {
    id: 'onIceCandidate',
    candidate: candidate
  }
  sendMessage(message)
}

// 开始请求数据
function onOffer(error, offerSdp) {
  error ? console.error('Error generating the offer :' + error) : ''
  const message = {
    id: 'start',
    sdpOffer: offerSdp,
    videoUrl: videourl
  }
  sendMessage(message)
}

// 发送后台数据
function sendMessage(message) {
  const jsonMessage = JSON.stringify(message)
  websocket.send(jsonMessage)
}

// 接收数据
function onMessage(message) {
  const parsedMessage = JSON.parse(message.data)
  switch (parsedMessage.id) {
    case 'startResponse':
      startResponse(parsedMessage)
      break
    case 'error':
      console.error('Error message from server: ' + parsedMessage.message)
      break
    case 'playEnd':
      console.log('playEnd')
      break
    case 'videoInfo':
      showVideoData(parsedMessage)
      break
    case 'iceCandidate':
      webRtcPeer.addIceCandidate(parsedMessage.candidate, error => error ? console.error(error) : '')
      break
    case 'position':
      document.getElementById('videoPosition').value = parsedMessage.position
      break
    default:
      console.error('Unrecognized message: ' + parsedMessage.message)
  }
}

// 接收视频流信息
function startResponse(message) {
  webRtcPeer.processAnswer(message.sdpAnswer, error => error ? console.error(error) : '')
}

// 设置Seek
function showVideoData(parsedMessage) {
  document.getElementById('initSeek') ? document.getElementById('initSeek').value = parsedMessage.initSeekable : ''
  document.getElementById('endSeek') ? document.getElementById('endSeek').value = parsedMessage.endSeekable : ''
  document.getElementById('durations') ? document.getElementById('duration').value = parsedMessage.videoDuration : ''
}

export {
  initVideo,
  playVideo,
  destroyVideo
}

 2、页面

<template>
  <div class="dashboard-container">
        <video id="video" autoplay width="640px" height="480px" controls onseeking />
  </div>
</template>
<script type="module">
import { destroyVideo, initVideo, playVideo } from '@/utils/video-rtc'

export default {
  name: 'Resource',
  data() {
    return {
      // HTTP环境
      wsUrl: 'ws://' + window.location.hostname + ':8082/kurento/player',
      // HTTPS环境
      // wsUrl: 'wss://' + window.location.hostname + ':8082/kurento/player',
      // 这里写自己的视频流地址,不同相机格式不同,这里是海康相机
      videoUrl: 'rtsp://用户名:密码@海康相机地址/:554/Streaming/Channels/101'
    }
  },
  mounted() {
    this.init()
  },
  beforeDestroy() {
    this.destroy()
  },
  methods: {
    init() {
      this.video = document.getElementById('video')
      initVideo(this.video, this.wsUrl, this.videoUrl)
      playVideo(true, true)
    },
    destroy() {
      destroyVideo()
    }
  }
}

</script>
<style>
video {
  border-radius: 10px;
  width: 500px;
  height: 100%;
  border: 2px solid #124968;
}
</style>

三、后台代码
WebSocket RTP 视频实时监控https://blog.csdn.net/qq_42151956/article/details/121403771

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Vue Echarts交通视频监控模板实例模板是一种基于Vue和Echarts技术的应用模板,主要用于展示交通视频监控数据。其核心技术是通过使用Vue框架进行页面组件化开发,在页面中嵌入Echarts图表,从而实现对交通视频监控数据的实时可视化分析。该模板具有丰富的功能和灵活的组件配置,支持多种数据输入方式和数据展示形式,可以适应不同的数据分析需求。 该模板主要功能包括实时视频监控、车流量统计、车速分布、事故预警等多项功能,视觉效果清晰、直观。在实现数据可视化的同时,还可以实现数据导出、共享、实时刷新等常用功能,方便用户对数据进行深入分析。此外,该模板还提供了丰富的组件库,用户可以根据自己的需求自由组合和配置,实现更加个性化的数据分析和可视化。 总体而言,Vue Echarts交通视频监控模板实例模板是一种高效、易用、灵活的数据可视化方案,能够帮助用户更好地理解、分析和应用交通监控数据,具有较高的实用性和推广价值。 ### 回答2: Vue Echarts交通视频监控模板是一种基于Vue框架和Echarts图表库的模板,用于快速开发交通视频监控系统。该模板提供了一些常见的交通视频监控场景的示例,如高速公路、城市街道、车站等,并且可以根据需求进行自定义配置。通过该模板,开发者可以快速搭建出一个功能完整、具有良好可视化效果的交通视频监控系统。 模板提供了良好的可扩展性和灵活性。开发者可以根据自己的需求进行自定义配置,比如修改地图坐标、添加新的监控点、调整数据源等等。同时,该模板使用了Echarts作为图表库,支持各类图表的展示,开发者可以在模板的基础上进行更进一步的数据可视化。 模板还提供了一些基础功能,如预览视频、打开音频、云台控制等等,使得交通视频监控系统更加实用。能够帮助开发者更快地开发出具有完善功能的交通监控系统,以期提高交通管理和安全水平。此外,该模板还提供了文档和代码示例,方便开发者快速上手和理解模板的内部实现。 总之,Vue Echarts交通视频监控模板是一个开发交通监控系统的优秀模板,相信会在交通管理和城市建设等方面发挥积极的作用。 ### 回答3: Vue Echarts交通视频监控模板实例模板是一种基于Vue技术以及Echarts图表库的前端模板,它主要针对交通视频监控领域开发,可以快速实现视频监控系统的数据可视化和实时监控功能。 该模板提供多种交通监控场景的展示方式,例如道路车流量统计、交通拥堵情况、交通事故发生情况等,通过Echarts图表库实现了多样化的可视化效果,用户可以通过图表呈现的方式快速了解当前交通情况。 同时,该模板还集成了多项实时监控功能,包括摄像头视频实时播放、浏览器端人脸识别、车辆追踪等,用户可以通过这些功能实时监控交通情况并及时采取应对措施。 该模板还具备高度的可扩展性和个性化定制能力,用户可以根据实际需求进行自定义修改和扩展。该模板已经广泛应用于各种交通行业的视频监控系统中,为交通管理、路况监测等领域提供了强有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值