记一次vue3实现TRSP大华相机拉流的经历

news2024/9/24 5:28:55

一、背景

业务场景,大华IP相机安装在A城市某建筑场所,工控机是内网通过4G流量卡上网,工控机通过相机采集数据后做故障识别并上传故障信息到地面服务器,地面服务器在B城市。
现需要在地面服务器提供的WEB界面上实现IP相机实时拉流显示。由于A城市相机环境没有固定IP,这里采用了花生壳内网穿透,成功打通了外网访问渠道,在浏览器上直接输入trsp网址可以用PotPlayer进行拉流播放,证明链路是通的。接下来是解决TRSP在WEB上播放的问题。

第一次做这样的功能,技术栈用的是vue3,面向百度编程后,找到一篇文章:
vue播放rtsp流(简单易操作,无flash,跨平台,小白可入)
https://blog.csdn.net/yunbabac/article/details/120740547
按照文章的实施步骤一步步尝试,却未能解决问题。技术思路大概是要部署一个媒体服务器借助ffmpeg进行解码。浏览器页面上提供trsp地址,并将地址转发到这个媒休服务器,媒体服务器拿到地址后拉流解析并返回给浏览器。遇到的问题 要么浏览器报跨域问题,要么媒体服务器视频解码出错。

转换思路:有没有可能每家厂商的相机会有一些定制导致通用解码失败?于是按相机厂商名称加技术类继续百度找到以下文章,里面有提到用大华官网插件实现:
Vue3下的视频直播流方法(RTSP和HLS流)
https://blog.csdn.net/python_small_pan/article/details/124944602
还找了很多其他相关文章,但无一例外没有试验成功。

最后在网上找到一个rtsp2web的开源项目。
github网址:https://github.com/Neveryu/rtsp2web

二、准备工作

1、安装node并配置环境变量

在cmd窗口的任意路径输入 node -v和npm -v能返回版本信息。如下

>node -v
v14.18.3
>npm -v
6.14.15

2、安装ffmpeg并配置环境变量

在cmd窗口任意路径输入ffmpeg --version能返回版本信息,如下:

>ffmpeg -version
ffmpeg version N-92308-g32d021cfa6 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20181017
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
libavutil      56. 21.100 / 56. 21.100
libavcodec     58. 34.100 / 58. 34.100
libavformat    58. 19.102 / 58. 19.102
libavdevice    58.  4.106 / 58.  4.106
libavfilter     7. 38.100 /  7. 38.100
libswscale      5.  2.100 /  5.  2.100
libswresample   3.  2.100 /  3.  2.100
libpostproc    55.  2.100 / 55.  2.100

三、代理服务搭建

我用的是windows电脑
根据github上的文档一步步实现如下
1、用CMD窗口创建并进入目录D:\rtsp-demo\rtsp-server
2、在CMD窗口执行npm init --yes
在这里插入图片描述
3、安装rtsp2web模块
npm i rtsp2web 如下图:
在这里插入图片描述

4、在该目录下创建main.js文件,并输入以下代码

// main.js
const RTSP2web = require('rtsp2web')

// 服务端长连接占据的端口号;你也可以不传,默认是:9999
let port = 9999

// 创建一个RTSP2web服务实例出来
new RTSP2web({
  port
})

在这里插入图片描述
5、在cmd窗口中执行node main.js启动服务,如下图:
在这里插入图片描述
此时,我们已经在本地启动了一个端口为9999的服务。

四、客户端搭建(浏览器端)

1、下载rtsp2web的源码(主要用它的example示例),如下图:

在这里插入图片描述
将下载后的文件解压到D:/rtsp-demo目录,解压后目录结构如下:
在这里插入图片描述
用Vscode打开D:/rtsp-demo/rtsp2web-master目录,并编辑里面的example/index.html文件。
修改变量rtsp1的值为自己的rtsp路径。示意如下:
在这里插入图片描述
点击鼠标右键,选择Open with Live Server如下图:
在这里插入图片描述
看到运行的效果大失所望,因为页面上并没有显示出视频窗口。
其实之前找了好多篇指南,按所有步骤走完都是这样的结果。这不禁让人感到非常困惑,如果这些指南有错,为什么那么多网友去写这样的指南?如果指南没有错,是不是我忽略了什么呢?
经过一番苦苦思索,仍然没有结果。后来想起”穷则呼天“的古训,于是我向神祈祷,求祂则给我智慧悟性和灵感,使我能够找到问题的关键。解决办法看后面。
在这里插入图片描述
后来我经过反复查看官网文档,找到一个transportType,如文档所述,它是用来配置网络传输协议的,并且默认值是“无”。 也就是说直接根据文档描述的步骤,默认真的是什么都看不到的。
在这里插入图片描述
于是我尝试修改main.js中的代码,然后重新启用 node main.js服务。如下所示:
在这里插入图片描述
再次刷新网页,相机视频能够播放了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕设 opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往…

Python基础教程:列表推导式详解

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 我们经常需要这样处理一个列表: 把一个列表里面的每个元素, 经过相同的处理 ,生成另一个列表。 比如: 一个列表…

量子计算与量子密码(入门级)

量子计算与量子密码 写在最前面一些可能带来的有趣的知识和潜在的收获 1、Introduction导言四个特性不确定性(自由意志论)Indeterminism不确定性Uncertainty叠加原理(线性)superposition (linearity)纠缠entanglement 虚数的常见基本运算欧拉公式&#x…

操作教程|如何注册成为Moonbeam社区代表参与治理

社区代表是高度参与社区治理的社区成员,其主要职责是将社区成员委托给他们的投票权参与社区投票,并确保链上治理稳健发展和活跃参与度。本文将向您展示如何快速注册成为社区代表。 首先,前往Moonbeam委托网站,点击网页右上角的“…

有财务自由的思维,才能实现财务自由!

前两天在洋哥、竹子姐以及渡心总等大佬的带领下,第一次体验了穷爸爸富爸爸的作者研发的现金流游戏,收获颇丰! 游戏规则说明 心灵创富 现金流游戏分为三步: 一局游戏,时间两个小时;总结分享时刻&#xff…

NSSCTF做题第9页(2)

[SWPUCTF 2022 新生赛]ez_1zpop <?php error_reporting(0); class dxg { function fmm() { return "nonono"; } } class lt { public $impohi; public $md51weclome; public $md52to NSS; function __construct() { $this-&…

buuctf_练[羊城杯2020]easyphp

[羊城杯2020]easyphp 文章目录 [羊城杯2020]easyphp掌握知识解题思路关键paylaod 掌握知识 ​ .htaccess文件的利用&#xff0c;把自己指定当做 php文件处理&#xff1b;preg_match正则匹配的了解&#xff0c;stristr函数的绕过&#xff1b;file_put_contents文件写入操作的了…

Kubernetes速成课程:掌握容器编排的精髓

微服务演进方向 • 面向分布式设计(Distribution):容器、微服务、API 驱动的开发; • 面向配置设计(Configuration):⼀个镜像&#xff0c;多个环境配置; • 面向韧性设计(Resistancy):故障容忍和自愈; • 面向弹性设计(Elasticity):弹性扩展和对环境变化(负载)做出响应; •…

初识Java篇

1.介绍Java语言 1.1Java是什么 Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义。 不仅如此&#xff0c;Java还是一个有一系列计算机软件和规范形成的技术体系&#xff0c;这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境&am…

JS:将秒数转化为时分秒的形式

要求 将秒数转化为时分秒的形式,比如12&#xff1a;34&#xff1a;09代表12小时34分钟9秒注意&#xff1a; &#xff08;1&#xff09;如果只有一位数&#xff0c;前面要用0补齐&#xff0c;比如9秒要用09表示 &#xff08;2&#xff09;如果对应单位上的数字为0&#xff0c;要…

提升用户体验的利器:揭秘Spring框架中国际化的奇妙魔力

国际化 简单来说&#xff0c;国际化就是让应用&#xff08;app、web&#xff09;适应不同的语言和地区的需要&#xff0c;比如根据地区选择页面展示语言。 i18ninternationalization&#xff0c;首末字符i和n&#xff0c;18为中间的字符数 原理 基于传入语言or地区标识进行判…

【面试经典150 | 链表】两数相加

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 Tag 【单向链表】【数组】 题目来源 2. 两数相加 题目解读 对两个链表对应位置进行相加&#xff0c;最后返回结果链表的头结点。 解题思路 很多同学对链表操作不是很熟悉&#xff0c…

如何在 Chrome 中设置HTTP服务器?

首先&#xff0c;定义问题&#xff1a;在 Chrome 浏览器中设置HTTP服务器主要涉及到修改网络设置&#xff0c;使用HTTP服务器可以帮助用户访问网络内容&#xff0c;提高网络速度或者保护隐私。 亲身经验&#xff1a;我曾在使用 Chrome 浏览器时&#xff0c;为了访问一些受限的网…

找搭子平台小程序开发制作方案

找搭子小程序是一个基于地理位置的社交平台&#xff0c;旨在帮助用户找到附近的人&#xff0c;一起进行各种活动。的目标是打造一个安全、便捷、有趣的社交平台&#xff0c;让用户在享受活动的同时&#xff0c;也能结识新朋友。 找搭子平台小程序的目标用户主要是年轻人&#x…

Go语言入门心法(十五):Go微服务实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

【从删库到跑路】MySQL数据库 | 存储过程 | 存储函数(使用代码辅助理解)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The Right Path】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f384;存储过程介绍&#x1f384;存储过程特点&#x1f33a;存储过…

Uniapp 原生设置的动态tabbar如何传参数动态 ?

在 UniApp 中设置原生 TabBar 并实现动态传参&#xff0c;可以通过使用Vue的响应式机制或者Vuex状态管理来实现。 以下是一个简单的示例&#xff1a; 以上这就是一个大概代码框架示例&#xff0c;具体实现应该根据项目需求做相应调整。欢迎来 注册 体验

大数据-Storm流式框架(二)--wordcount案例

一、编写wordcount案例 1、新建java项目 2、添加storm的jar包 storm软件包中lib目录下的所有jar包 3、编写java类 WordCountTopology.java package com.bjsxt.storm.wc;import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.genera…

ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 在线商务管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

轮胎尺寸后面的91W、101Y是啥意思?解释一下:轮胎载重指数和轮胎速度等级。

轮胎载重指数 轮胎的语言沟通是一组数字&#xff0c;并表示数据规格&#xff0c;品牌和类型的一系列信件的形式。这是普遍的&#xff0c;并得到了所有轮胎制造商全球达成一致。 “载重指数”是一个对应于最大载重量的数字&#xff08;单位&#xff1a;公斤&#xff09;&#xf…