EasyDarwin源码分析(三)——rtsp-client

article/2025/9/24 15:51:10

rtsp-client.go

这个模块主要实现了客户端的拉流功能。也就是在网页上点击“拉流分发”按钮后,easydarwin会向用户填写的源地址拉流,然后再转发出去,在向源地址拉流的时候,easydarwin相当于是一个rtsp客户端。所以这里使用rtsp-client.go。

EasyDarwin中有两个模块分别是rtsp-server和rtsp-client,rtsp-server分析见:rtsp-server源码分析
乍一看这两个模块,一个server一个cilent,好像正好是一对服务器和客户端,其实两者关系不大,各自完成不同的功能。
rtsp-server是EasyDarwin提供rtsp服务,监听554端口(默认)。而rtsp-client的作用是主动向某个音视频源地址进行拉流,在拉流的过程中充当客户端的角色,所以叫client。

这个功能的开始是从网页上点击“拉流分发”开始的,这么说其实并不是完全正确,因为前端点击“拉流分发”后是向后端发送了一个http请求,你从别的地方发这个请求也是可以的。所以我们从接收http请求开始讲起。

routers/routers.go

routers.go主要就是用来接收前端发来的请求,这里使用的是第三方包gin,其实主要看以下代码就行。第一行Group,对请求做了一个分组,也就是api接收的请求都是/api/v1/xxx形式的。

下面就是具体的请求,第一个参数:请求路径,第二个参数:处理这个请求的函数。

“拉流分发”处理的请求是/stream/start
在这里插入图片描述

请添加图片描述

首先定义一个结构体,用来接收前端发来的数据。

请添加图片描述

给这个client创建一个pusher,当easydarwin作为一个客户端向第三方源拉流后,得把这个媒体流再次转发出去,供用户拉取,所以这里的pusher(推流者),就是将client拉取到的流转发、再次推送出去。

请添加图片描述

client.Start(),启动这个向第三方源拉流的rtsp客户端。
将上面new的pusher添加到rtsp-server的pusher队列中。
在client成功从第三方源拉到媒体流后,会将这些媒体流数据添加到pusher中,等待用户来拉取。

下面分析刚才提到的那些函数(在rtsp/rtsp-client.go中)

NewRTSPClient()

请添加图片描述

函数的主体部分就是对RTSPClient的实例化。RTSPClient结构体如下(部分)

请添加图片描述

client.Start()

请添加图片描述

可以看到Start()函数里面主要就调用了另外两个方法。requestStream()主要负责RTSP命令交互,startStream()负责媒体流的收发(rtp)

requestStream()

请添加图片描述

首先解析客户端的URL,我在这里打了个断点,当我在页面上点击拉流分发、输入好摄像头源地址等信息,最后点击确定时,到达此断点。
这里的client.URL是摄像头的源地址。url.Parse对这个地址进行了解析,这是一个工具包,返回的 l 不是一个字符串而是一个结构体。如下

在这里插入图片描述
在这里插入图片描述
请添加图片描述

建立Tcp连接,准备进行命令交互。为客户端client创建Reader和Writer,用来读写连接conn中的数据。

请添加图片描述

发送OPTIONS请求,这里的Request()是一个封装好的,用于RTSP命令交互的接口,该接口发送报文,并且接受响应。两个返回值,分别是RTSP响应和错误,在代码里,每一个请求都判断了错误。

请添加图片描述

发送DESCRIBE请求,并接受响应。使用第三方包解析响应中的SDP信息。

请添加图片描述

在一般情况下,视频和音频各有一个媒体流。上面的代码根据客户端使用TCP/UDP来给首部字段的"Transport"字段赋值。

请添加图片描述

然后发送SETUP请求:

请添加图片描述

最后发送发送PLAY命令

startStream()

请添加图片描述

初始化,这里的OptionIntervalMillis是心跳间隔,如果设置了这个值,则以这个值为周期,定时发送OPTIONS请求。

请添加图片描述

connRW是之前已经初始化的读写器

ReadByte()函数:读取一个字节。如果是 0×24 ,则是rtp数据,不然就是rtsp命令。
如果看了之前的rtsp-server源码分析会发现很眼熟,没错,他把处理rtsp命令和rtp包的代码,在这里又写了一遍,也就是说通过ffmpeg推来的流,和easydarwin通过rtsp-client主动去拉的流,虽然这些都是音视频流,但是在代码里却在不同的模块里分别处理了(但是代码内容基本相似),并没有使用同一份代码。

请添加图片描述

请添加图片描述

这里是RTP包的解析过程,可以看到,首先收取一个包的长度,然后根据这个长度,接收完成所有的一整包。再去解析包的内容,最后将包回调出去。RTP包有四种类型,VIDEO、AUDIO、VIDEOCONTROL、AUDIOCONTROL,这些类型通过channel来区分开来。

最后处理这些pack的是RTPHandles,详解:EasyDarwin源码分析(四)—— RTPHandles

非RTP数据包的接收,就比较简单了。由于RTSP是文本协议,逐行读取文本,直到读出一个长度为0的行。同时判断是否包括Content-Length, 如果有的话,再读取Content-Length长度的数据包。否则接收完成。

总结:

在用EasyDarwin之前就知道他就是一个流媒体服务器,在分析完rtsp-client和rtsp-server之后,我们可以总结他的功能为“拉转推”和“收转推”,也就是一个是主动拉流(使用rtsp-client),一个是被动接收流再转推出去(使用rtsp-server和rtsp-session)。

当初学习这一部分时一篇很重要的文章:EasyDarwinGo拉转推功能之拉流


http://chatgpt.dhexx.cn/article/gYbvw2Rh.shtml

相关文章

EasyDarwin源码分析(一)——main.go

main.go ​ easydarwin源码的代码量不是很多,主要的代码也就集中在下面的几个文件夹中,核心业务的代码也就主要集中在rtsp包中。 ​ 而且用Go语言写的代码,不像springboot那样,你在读源码前至少要对Springboot框架有一定的学习&a…

关于EasyDarwin二次开发编译后无法以服务启动的问题

问题描述: 在win7上二次开发EasyDarwin后,编译出的EasyDarwin.exe运行正常,或是使用ServiceInstall-EasyDarwin.exe在系统中注册服务,启动服务也正常。 于是打包将其部署在win server 2008上,发现如果直接运行EasyDar…

EasyDarwin接口的使用——使用C++编写客户端实现与EasyDarwin服务器的交互

EasyDarwin提供了接口供客户端使用,以实现客户端与其的交互。比如,根据EasyDarwin的8.1.0版本的接口文档,有获取推流列表的接口如下所示: 我们可以测试一下上述接口。首先启动EasyDarwin服务器,启动后在浏览器&#xf…

EasyDarwin的交叉编译

easyDarwin的交叉编译 前言一、EasyDarwin简介二、配置环境介绍三、交叉编译过程1.go环境的搭建2.编译 后记 前言 最近项目有个需求是在嵌入式设备中运行一个RTSP服务器,满足推流到该服务器后,其他终端设备能够从这个RTSP服务器中拉RTSP流出来。找来找去…

EasyDarwin 流服务器搭建及相关软件教程

一、产品 运行 exe 文件 启动 服务器 双击 运行 EasyDarwin.exe 会出现如下界面: 在 浏览器打开 http://192.168.10.80:10008 2.解压ffmpeg 添加环境变量:复制C:\SoftWare\ffmpeg-6.0-essentials_build\bin路径,添加环境变量中 的用户变…

EasyDarwin —— ubuntu搭建rtsp服务,使用FFmpeg进行rtsp推拉流

开源流媒体服务器 EasyDarwin是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒体开发者和创业型企…

EasyDarwin测试

EasyDarwin是由国内开源流媒体团队维护的一款开源流媒体平台框架,开发语言是go语言。本文主要使用它作为RTSP服务器使用,并以此进行测试。方便之后记录。 (1)软件获取(自行下载,具体代码编译方式&#xff0…

流媒体开发之EasyDarwin搭建rtsp server

0 背景 EasyDarwin 旭帆科技开源的流媒体服务器软件,EasyDarwin 社区专注于传统安防(RTSP/RTP/Onvif)流媒体技术,能够帮助开发者快速搭建流媒体服务平台,更快、更简单地实现流媒体直播与点播功能。本文主要介绍 rtsp …

EasyDarwin ffmpeg+EasyDarwin开源流媒体服务器平台试用笔记(视频流rtsp)

服务 Github https://github.com/EasyDarwin/EasyDarwin , server will invoking ffmpeg. 1. download server 下载EasyDarwin-windows-8.1.0-1901141151 双击EasyDarwin.exe 访问http://127.0.0.1:10008/#/ 2. download FFmpeg 下载FFmpeg : https://github.com/BtbN…

从零开始搭建EasyDarwin环境——linux系统共享目录实现

EasyDarwin是一款高性能开源RTSP流媒体服务器,基于Go语言研发,维护和优化:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、Web后台管理、分布式负载均衡。EasyDarwin从最初的c到后面的nodejs再到现在…

使用EasyDarwin搭建Rtsp Server从大华摄像头拉流进行多路分发

使用EasyDarwin搭建Rtsp Server从大华摄像头拉流进行多路分发 问题服务搭建推流命令大华摄像头配置 问题 大华摄像头(型号: DH-IPC-HDW1235C-A 2.8MM 200万高清网络摄像机 )目前支持20路连接,实际使用测试过程中,只能…

EasyDarwin —— windows搭建rtsp服务,使用FFmpeg进行rtsp推拉流

开源流媒体服务器 EasyDarwin是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒体开发者和创业型企业快速构建流媒体服务平台,更快、更简单地…

简单的流媒体服务器(EasyDarwin的安装搭建)

再项目中需要用到简单的视频播放,想着干脆搭建一个流媒体服务器,后期做视频点播 直播包括视频服务器的负载,所以索性开始自己探索搭建视频流媒体服务器,用于存储和传输视频资源 相关概念 流媒体 流媒体(Streaming Me…

【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例

定时器简介 在 ZYNQ 嵌入式系统中,定时器的资源是非常丰富的,每个 Cortex-A9 处理器都有各自独立的 32 位私有定时器和 32 位看门狗定时器,这两个 CPU 同时共享一个 64 位的全局定时器(GT)。 系统框图 私有定时器 特…

ZYNQ开发系列——使用AXI4LITE接口进行PS和PL交互

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列——使用AXI4LITE接口进行PS和PL交互 前言PS端AXI接口AXI4LITE slave模块的设计后记前言 前面我们讲到使用AXI4LITE来作为总线接口来实现PS和PL的交互。同时我们为了支持《从零开始研发GPS接收…

Xilinx ZYNQ简介

ZYNQ 是赛灵思公司(Xilinx)推出的新一代全可编程片上系统(APSoC),它将处理器的软件可编程性与 FPGA 的硬件可编程性进行完美整合,以提供无与伦比的系统性能、灵活性与可扩展性。与传统 SoC解决方案不同的是…

ZYNQ ARM核之SCU

Snoop Control Unit,窥探控制单元,详情见UG585。SCU主要是解决ARM的L1和L2的缓存协调(因为两个processor的缓存是共用的)和AXI总线的ACP存取的,也就是DMA等高速中断需求的外设。 SCU 块将两个 Cortex-A9 处理器连接到内存子系统,并包含智能管…

ZYNQ开发系列——PS开发之HelloWorld

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列——PS开发之HelloWorld 前言外设接口SDK建立工程相关操作记录前言 俗话说一日不见,如隔三秋。两年没搞PS的开发,居然连HelloWorld怎么出来都不记得了,可见知识记录的重要性,知识真的是有保…

ZYNQ开发系列——PS响应PL中断请求

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列——PS响应PL中断请求 前言中断的设置PS部分代码前言 PS和PL的交互中,还有一个中断没有讲到,在《从零开始研发GPS接收机连载》中,将会有两个中断,一个中断是505us中断,一个中断是10ms中断…

ZYNQ PS简介

ZYNQ 实际上是一个以处理器为核心的系统,PL 只是它的一个外设。Zynq-7000 系列的亮点在于它包含了完整的 ARM 处理器系统,且处理器系统中集成了内存控制器和大量的外设,使 Cortex-A9 处理器可以完全独立于可编程逻辑单元。而且实际上在 ZYNQ …