当前位置: 首页 > article >正文

vue+wsplayer对接大华的rtsp实时预览视频流

参考大佬教程:

vue/react+wsplayer对接大华的rtsp实时预览视频流_wsplayer 前端使用-CSDN博客

//HTML
  <!-- 大华播放器容器 -->
      <div class="video" id="video"></div>
        
//JS
  import { defineProps, reactive, watch,onMounted } from 'vue';
  import {
    cameraDetail
  } from '../../../../src/api/basic/screen';
  import PlayerManager from '../icc/PlayerManager.js';

  const props = defineProps<{
    cameraId: string;
  }>();
  const emit = defineEmits(['closeCameraMonitor']);
  const state = reactive({
    cameraId: props.cameraId,
    title: '摄像头视频',
    F_Url: '',
    F_Token: '',
    channelId: '',
    wsUrl: '',
  });
  
  let videoPlayer;

  watch(
    () => props.cameraId,
    newVal => {
      state.cameraId = newVal;
    },
  );

 // 启动播放器
 function startPlayer(rtspUrl: string) {
  console.log('RTSP URL:', videoPlayer); 
 if (!videoPlayer) {
  console.error('播放器实例未创建');
  return;
 }

 let arr = rtspUrl.match(/^rtsp:\/\/([^\/:]+)(:\d*)?/);
 console.log('arr:', arr);
 if (arr) {
  const host = arr[1];
  const port = arr[2] || '';
  state.wsUrl = `ws://${host}${port}`;
  console.log('WebSocket URL:', state.wsUrl);
 } else {
  console.error('Invalid RTSP URL');
 }

 videoPlayer.realByUrl({
  playType: 'url', // 播放类型
  rtspURL: rtspUrl, // RTSP 地址
  wsURL: state.wsUrl, // WebSocket 地址
  channelId: state.channelId, // 通道 ID
  streamType: '1', // 码流类型 (1-主码流, 2-辅码流)
  selectIndex: '0', // 播放窗口序号
  channelData: {}, // 通道数据
 });}

   async function init(data) {
 console.log('初始化数据:', data);
 // 构建 RTSP URL
 const rtspUrl =  data.F_Url+'?token=' + data.F_Token;
//  const rtspUrl ="rtsp://192.168.1.250:9100/dss/monitor/param/cameraid=1000007%241%26substream=1";
 videoPlayer = new PlayerManager({
  el: 'video', // 播放器容器
  type: 'real', // 实时预览
  maxNum: 1, // 最大播放路数
  num: 1, // 初始化显示路数
  showControl: false, // 是否显示工具栏
  isIntranet: true, // 固定写死 true
  showRecordProgressBar: true, // 是否显示录像进度条
  prefixUrl: '../dhPro', // 文件位置
  importLoad: true, // 必填
  receiveMessageFromWSPlayer: (methods, data) => {
   switch (methods) {
   case 'initializationCompleted':
    console.log('初始化完成:', data);
    startPlayer(rtspUrl); // 初始化完成后启动播放器
    break;
   case 'realSuccess':
    console.log('实时预览成功');
    break;
   case 'realError':
    console.error('实时预览失败:', data);
    break;
   case 'errorInfo':
    console.error('错误信息:', data);
    break;
   }
  },
  });
 }

  // 获取摄像头详情
  const getCameraDetail = async () => {
    const res = await cameraDetail(state.cameraId);
    if (res.code === 200) {
      state.title = res.data.F_CameraName;
      state.F_Url = res.data.F_Url
      state.F_Token = res.data.F_Token;
      state.channelId = res.data.F_channel_code;
      init(res.data);
    } else {
      console.error('获取摄像头详情失败');
    }
  };

 onMounted(() => {
    getCameraDetail();
  });


http://www.kler.cn/a/568253.html

相关文章:

  • LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法
  • ORM Bee V2.5.2.x 发布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片
  • 六十天前端强化训练之第五天响应式设计原理深度解析
  • 0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点
  • java数据结构_Map和Set_9.1
  • 【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)
  • CES Asia 2025前瞻:网络安全与数据隐私成焦点
  • 在Linux上安装go环境
  • 【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)
  • 1.2.3 使用Spring Initializr方式构建Spring Boot项目
  • 学习路程十一 langchain核心组件 Memory
  • 万能Prompt模板:三步打造高效Deep Research工作流
  • Python的pdf2image库将PDF文件转换为PNG图片
  • etcd 3.15 三节点集群管理指南
  • MySQL表字段数量上限解析
  • 【自学笔记】Oracle基础知识点总览-持续更新
  • 基于Spring Boot和Vue的餐饮管理系统设计与实现
  • PHP面试题--前端篇
  • Redis Cluster集群详解
  • 边缘渲染架构深度解析:从CDN到边缘计算的性能跃迁