浏览器播放rtsp视频流:4、jsmpeg+go实现局域网下的rtsp视频流web端播放

news/2024/4/29 19:42:55/文章来源:https://blog.csdn.net/weixin_39510813/article/details/127622924

文章目录

    • 1.前言
    • 2.资料准备
    • 3.兼容性及适用性说明
    • 4.jsmpeg架构
    • 5.基于以上架构的go方案可行性分析
    • 6.编译和结果展示(编译坑点)
    • 7.最后

1.前言

之前的rtsp转webrtc的方案存在如下缺陷:1.只支持h264;2.受限于webrtc的理解难度以及搭建turn/stun的p2p服务等问题,对于局域网下的业务需求来说有些杀猪用牛刀的意思;3.ios不支持webrtc。

基于以上原因,我又找到了一些其它的方案进行了测试,目前看jsmpeg的方案更加适合我们的需求,而且普通压缩大小为135kb,gzip方式压缩后仅仅42kb,在嵌入式场景下也可以使用。只是转码服务需要ffmpeg,在不进程裁剪开发的情况下,需要在设备或者PC或者局域网路由器设备等上安装的该插件服务会比较大。

2.资料准备

官网:https://jsmpeg.com/

https://blog.csdn.net/a843334549/article/details/120697574

https://segmentfault.com/a/1190000040622805

https://juejin.cn/post/7057406701565116452

https://github.com/vCloudSail/jsmpeg-player

https://studygolang.com/articles/25474

3.兼容性及适用性说明

  • 这种方案适合局域网使用,目前测试实时性也非常不错,就像jempeg官网说的最低可达50ms,我测试下来对实时性是很满意的。
  • 此外,这种方案的视频编码和浏览器的兼容性非常棒,支持h264/h265,支持目前市面上的很多浏览器,我测试过Chrome浏览器、QQ浏览器、360浏览器、搜狗浏览器、Firefox浏览器、UC浏览器、Opera浏览器、Microsoft Edge浏览器、Safari 浏览器等都是可以运行的。

4.jsmpeg架构

  • jsmpeg比较重要的两个技术点:webgl、wasm,只需大致了解即可,若不对这两个模块进行二次开发,则无需深究
  • jsmpeg.js采用软解码方式,仅支持mpeg1格式视频、mp2格式音频!!! ,将视频流解码成图片并渲染到canvas上,并且可在源码基础上二次开发

在这里插入图片描述

根据这个架构我们的想法是jsmpeg客户端使用前端开发,该客户端唯一比较大的就是jsmpeg.js,不压缩也就100k多一点,压缩后更小,这样就可以放到很多设备中了,甚至很多嵌入式设备都都可以,然后我们将http、websocket服务端使用后端语言来开发,比如node.js、Java、Go、c++等,ffmpeg转码这里快速开发可以直接用ffmpeg,要再裁剪的话可以自己用C再开发一下,我们只需要转H264/H265到mpeg1,AAC到mp2,然后将对应的音视频格式的流通过websocket分发到jsmpeg客户端就可以了。

5.基于以上架构的go方案可行性分析

本来想自己开发的,结果随便搜了一下,已经有人用go的gin框架写了,互联网和开源拯救了大家,直接参考一下:https://studygolang.com/articles/25474

代码我整体看了一下,也跑了一下,修改了三个部分:

  • 1.一分钟后就会自动断开,这里注释就可以了(这里过一分钟就发送q主动断开了);
case <-time.After( 60 * time.Second):_, _ = stdin.Write([] byte ( "q" ))err := cmd.Wait()if err != nil {util.Log().Error( "Run ffmpeg err %v" , err.Error())} 

在这里插入图片描述

  • 2.ffmpeg调用使用当前路径的ffmpeg,否则如果你设备上安装了ffmpeg的话可能路径会乱
util.Log().Debug("FFmpeg cmd: ./ffmpeg %v", strings.Join(params, " "))
cmd := exec.Command("./ffmpeg", params...)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cwQNq0I1-1667219726107)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c4f8be20a05d4fab9f93cc33960bc92f~tplv-k3u1fbpfcp-zoom-1.image)]

  • 3.html的js中增加了主动发送http请求获取ws地址的response处理部分,方便测试
<!DOCTYPE html>
<html>
<head><title>JSMpeg Stream Client</title><style type="text/css">html, body {text-align: center;}</style></head>
<body><canvas id="video-canvas"></canvas><canvas id="video-canvas1"></canvas><script type="text/javascript" src="jsmpeg.min.js"></script><script type="text/javascript">var request = new XMLHttpRequest();var url = "http://127.0.0.1:3000/stream/play"; //接口url
request.open("POST", url, true);request.setRequestHeader("Content-type", "application/json");request.send('{"url": "rtsp://192.168.31.204/main_stream"}'); //传入的数据,不同摄像头修改这里的rtsp地址即可
request.onreadystatechange = function(){//若响应完成且请求成功
if(request.readyState === 4 && request.status === 200){//do something, e.g. request.responseText
console.log("response:"+request.responseText)const resObj = JSON.parse(request.responseText);if (resObj['data']) {if (resObj['data']['path']) {console.log("ws path:"+resObj['data']['path'])var canvas1 = document.getElementById('video-canvas1');// var url = 'ws://127.0.0.1:3000/stream/live/test';
var wsUrl = 'ws://127.0.0.1:3000'+resObj['data']['path']console.log("ws url:"+wsUrl)var player = new JSMpeg.Player(wsUrl, {canvas: canvas1});}}}}</script>
</body>
</html>

这里还有一个坑点,留给大家去探索吧:长时间运行后如果推流的rtsp服务存在断流的话就没有画面了,这个没有webrtc服务的容错机制,需要自行判断处理,否则长时间跑之后画面就没了。

此外,http接口还可以增加ptz、preset等接口,这个仍然可以使用onvif协议来处理。

6.编译和结果展示(编译坑点)

编译Go代码很方便,但是我这里建议使用go1.18,go1.19在Windows下使用“./”会报错,必须使用“.\”,这个需要注意,然后就go build即可生成可执行程序了。

之后修改html中的request.send中的rtsp的地址后访问该html即可看到效果了:

在这里插入图片描述

7.最后

很多时候,共同讨论才能更快的进步,开源让Linux成长的很快,不管是家电还是汽车、手机等等,生活中很多东西都可以见到Linux,而固步自封的结果大家也已经看到不少了。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hproxy项目前端

hproxy项目前端使用vue-element-admin框架&#xff0c;页面为hook列表&#xff0c;和一个添加hook页面。 添加路由 编辑src/router/index.js文件&#xff0c;在constantRoutes列表追加如下路由内容 {path: /hproxy,component: Layout,redirect: /hproxy/index,hidden: false,c…

各省市软考准考证打印时间,一起来看!

距离软考还有一周&#xff0c;各个省市的准考证也开始打印了&#xff01; 各地防疫政策一定要遵守&#xff0c;不然错过&#xff0c;又等一年&#xff01; 周末也有一些省市因疫情推迟、取消考试的。 一起来看&#xff01; 考完之后&#xff0c;会在这里讨论一些答案&#x…

UWB室内定位系统铸造智能化企业安全管理系统

进入工业4.0时代以来&#xff0c;数字技术不断成熟、扩散和融合&#xff0c;加速推动工业企业数字化、智能化转型。企业推进数字化转型要整体规划、分布实施&#xff0c;需要考虑企业经营管理活动的全过程、全范围、全层级。各大行业已经开始配备UWB人员定位系统&#xff0c;提…

电脑C盘怎么清理到最干净

如果你的电脑C盘运行内存已经快满了&#xff0c;这个时候你怎么处理&#xff1f;让我们来看看如何清理C盘。 c如何清理盘&#xff1a; 方法一&#xff1a;存储状态 点击电脑win键&#xff0c;在设备左侧弹出提示框&#xff0c;进入系统配置&#xff0c;然后点击系统软件选项…

MyBatis Plus实现动态字段排序

利用周末时间&#xff0c;对已有的项目进行了升级&#xff0c;原来使用的是tkmybatis&#xff0c;改为mybatis plus。但是由于修改了返回数据的格式&#xff0c;前端页面字段排序失效了&#xff0c;需要刷新表格才会排序。页面效果如下 easyui的数据表格datagrid支持多字段排序…

商用车进入回暖周期,哪些供应商在领跑「主动安全」前装赛道

由于受到经济周期性影响&#xff0c;去年开始商用车市场出现一波下行行情。 中国汽车工业协会发布数据显示&#xff0c;2022年1-9月&#xff0c;商用车产销分别完成242.6万辆和248.4万辆&#xff0c;同比下降32.6%和34.2%&#xff0c;降幅较1-8月收窄1.5个百分点和2个百分点&a…

ZAB协议

1、定义 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 协议&#xff0c;基于该协议&#xff0c;Zookeeper 实现了一种 主备模式 的…

什么是行内元素的盒模型

目录 行内元素的盒模型 display 可选值&#xff1a; visibility 可选值&#xff1a; 行内元素的盒模型 行内元素不支持设置宽度和高度 但是这并不是说明行内元素没有内容区 而是通过width和height不能改变内容区的大小 行内元素的内容区是由他里面的内容决定的&#xff0…

【视觉基础篇】14 # 如何使用片元着色器进行几何造型?

说明 【跟月影学可视化】学习笔记。 如何用片元着色器控制局部颜色&#xff1f; 把图片绘制为纯黑色&#xff1a; const fragment #ifdef GL_ESprecision highp float;#endifvarying vec2 vUv;void main() {gl_FragColor vec4(0, 0, 0, 1);} ;根据纹理坐标值来绘制&#…

工地ai智能视频监控系统

工地ai智能视频监控系统在监控摄像头监控的画面范围之内&#xff0c;对人的不安全行为&#xff08;违规行为&#xff09;或者物的不安全状态进行实时分析识别&#xff0c;当工地ai智能视频监控系统发现现场违规行为时&#xff0c;可根据需要设置各种警戒要求&#xff0c;工地ai…

【计算机网络--物理层】编码和调制与数据交换方式

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录基带信号与宽带信号基带信号宽带信号小结编码与调制编码调制的方法数字数据编码为数字信号数字数字调制为模拟信号模拟数据编码为数字信号模拟信号调制为模拟信号数据交换电路交换报文交换分组交换数据报方式…

windows系统命令行查看已连接过的WiFi密码

展示所有连接过的WiFi列表netsh wlan show profiles 显示具体某个WiFi的密码netsh wlan show profiles name="XXXXXX" key=clear name - 所要显示配置文件的名称。就是WiFi的名称 interface - 已配置此配置文件的接口的名称。 key - 以纯…

跨境电商万圣节社媒营销:8个方法助你冲出重围

今天是西方一年一度的万圣节前夜&#xff0c;同时也是跨境电商第四季度第一个大促日。Nox聚星获悉&#xff0c;2022年万圣节期间会有69%的美国民众参与这场万圣节狂欢&#xff0c;预计人均消费将达到100.45美金&#xff0c;预计将产生106亿的销售额。作为四季度第一个促销日&am…

【飞桨PaddleSpeech语音技术课程】— 多语言合成与小样本合成技术应用实践

(以下内容搬运自飞桨PaddleSpeech语音技术课程&#xff0c;点击链接可直接运行源码) 多语言合成与小样本合成技术应用实践 一 简介 1.1 语音合成的简介 语音合成是一种将文本转换成音频的技术。通常语音合成的整体流程如图1所示。可以分为&#xff1a;文本前端&#xff0c;…

团队分工越明确,工作效率越低?

一个团队各项任务能否顺利完成,关键看员工的执行力,而员工执行力的发挥,取决于组织对员工的合理分工。 分工合理,能调动员工的积极性,分工不合理,便会扼杀积极性。 那么如何才能做到合理分工呢?有些人认为分工就是把工作内容拆成一个个小任务,然后让员工去分头完成。…

C语言学习推荐---小游戏

文章目录控制台文字游戏srand、rand、time猜拳游戏控制台动作游戏运动的小球贪吃蛇音乐图形界面easyx介绍后续学习c语言的时候&#xff0c;想写例子&#xff0c;但是课后习题又太枯燥怎么办&#xff1f; 写小游戏可以锻炼我们的编程抽象能力和思维&#xff0c;而且比较有趣&…

基于nodejs电影交流网站设计与实现-计算机毕业设计源码+LW文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把电影交流管理与现在网络相结合&#xff0c;利用nodejs技术建设电影交流网站&#xff0c;实现电影交流的信息化。则对于进一步提高电影交流管理发展&#xff0c;丰富电影交流管理经验能起到不少的促进作用。 电影交流网站能…

论文研读1——对抗样本(Adversarial Example)综述

论文地址&#xff1a;Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey 部分内容参考科研篇二&#xff1a;对抗样本&#xff08;Adversarial Example&#xff09;综述 一、主要内容 肯定了深度学习在计算机视觉等领域的贡献&#xff0c;但深度…

后端开发总结(2):go语言的知识点

go语言知识点1 append 列表2 如何打印指针结构体的值3 * 和 & 的用法1 append 列表 append() 切片需要增加 ... var a []inta append(a, 1) // 追加1个元素 a append(a, 1, 2, 3) // 追加多个元素 a append(a, []int{1,2,3}...) // 追加切片,2 如何打印指针结构体的值…

如何将程序打包成exe

我们经常需要将我们写的程序打包发给用户使用&#xff0c;很多时候为了方便会直接将文件夹或者压缩包发出去。这种方式对于一些不太懂电脑的用户来说的话&#xff0c;假如程序中有多个可执行文件&#xff0c;就会完全不知道怎么使用。众所周知&#xff0c;客户体验也是评判软件…