EasyDarwin源码分析(二)——rtsp-server、rtsp-session
rtsp-server.go
这个模块提供了rtsp服务,概括的说就是监听554端口(默认),有ffmpeg推流过来,或者是有播放器(vlc)来拉流时,做出响应并进行处理。
GetServer() *Server
GetServer() 返回了Instance(①) , 他是一个 *Server , Instance 在 rtsp-server.go 中已经被简单的初始化了(②),Server类型是我们自己定义的,不是官方的包(③)。
也就是说 main 函数里面的 rtspServer 已经有了一些初始化信息
rtspServer.Start()
在main.go中的StartRTSP()中调用了这个函数,开启RTSP服务。
ResolveTCPAddr 和 ListenTCP方法都是官方包 net包中的方法,用来设置监听端口、得到listener,正式开启监听的代码还在下面。
这里的server.TCPListener就是上面的listener,赋值的那一行代码我没截出来。这里的Accept()方法也是官方net包中的方法,作用是开启监听,监听的端口在前面已经设置好了。
x.(T) 是Go语言中的断言,也就是判断x是不是T类型的,返回两个参数,第一个是x转换成T类型后的变量,另一个返回判断的结果(true/false)。这里如果conn是net.TCPConn类型的, 则设置一个大小1048576的读缓存和写缓存。
NewSession(),根据conn和server,创建一个新的会话,然后session.Start(),开启会话。
rtsp-session.go
NewSession()
读取配置文件,然后对session进行初始化。这里注意,session中的connRW也是有缓存大小的,并且和server中的读写缓存使用的是一个配置文件中的条目,但是默认值却不一样。配置文件中默认是不配置的,所以如果想要自定义缓存大小,要在配置文件中配置。
Start()
session.Start()里面就主要是对会话的处理了,这里就分了两种情况,一种是处理rtp数据,一种是处理rtsp命令。
处理rtp数据的过程大致就是将conn中的数据读出来,然后把他们放到RTPPack中,然后用session.RTPHandles处理他们。RTPHandles的分析见:EasyDarwin源码分析(四)—— RTPHandles
对于RTSP命令的内容进行真正处理的是session.handleRequest(req)函数。
handleRequest()
这个方法的大体结构如上,就是对不同的RTSP命令进行了处理,返回的数据放在了res中。
里面具体的处理就不多讲了,因为会涉及到还没有提到的Pusher或者Player,这些"OPTION" "SETUP"都是RTSP协议中的知识,因此在了解这部分代码之前肯定还是要学习RTSP协议的相关内容的。
总结
总的来说,rtsp-server提供了rtsp服务,监听554端口(默认,可修改),当有ffmpeg推流过来或者有客户端的拉流请求过来时,为这个请求,新开一个会话(session),session会话回处理这个请求并做出相应的操作(如新开Pusher转推ffmpeg推来的流或者是给新开Player把某个流推给客户端),包括建立流连接后的数据包的接收和发送,都是由session来完成的。
但是EasyDarwin转推流不止只有这一种情况,我们知道在EasyDarwin的“推流列表”页面,是有“拉流分发”的功能的,这个功能可以输入某个音视频流的源地址(比如某个网络摄像头),就可以进行主动拉流,再转推出去。也就是说,ffmpeg推流过来可以理解为EasyDarwin是处于“被动”接收流,使用“拉流分发”是主动向某个源地址拉流。
被动接收流的处理过程就是这篇所讲的 rtsp-server和rtsp-session配合完成。而完成“主动拉流”功能的是另一个模块:rtsp-client,见文章:EasyDarwin源码分析(三)——rtsp-client
EasyDarwin源码分析(二)——rtsp-server、rtsp-session相关推荐
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- gSOAP 源码分析(二)
gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...
- Nouveau源码分析(二):Nouveau结构体的基本框架
Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...
- ENS最新合约源码分析二
ENS(以太坊域名服务)智能合约源码分析二 0.简介 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...
- EasyDarwin源码分析(一)——main.go
main.go easydarwin源码的代码量不是很多,主要的代码也就集中在下面的几个文件夹中,核心业务的代码也就主要集中在rtsp包中. 而且用Go语言写的代码,不像springboot那 ...
- live555源码分析(二):testRTSPClient分析
流程概述 1)创建任务对象(TaskScheduler): 2)创建环境对象(UsageEnvironment): 3)处理用户输入的参数(RTSP地址记录) 4)创建RTSPClient实例(RTS ...
- Docker源码分析(二):Docker Client创建与命令执行
http://www.infoq.com/cn/articles/docker-source-code-analysis-part2 1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引 ...
最新文章
- ROS学习笔记_创建工作空间(一)
- 后台开发必读书籍--计算机操作系统
- 跟我一起写udev规则
- SpringBoot+layUI上传图片功能
- JAVA 向文本文件中换行插入字符
- 尽说大实话!周鸿祎:有的软件会偷偷打开你的摄像头或麦克风
- Java设计模式学习总结(6)——创建型模式之原型模式
- 与context的关系_Go中的Context超时和关闭是如何实现的呢?
- java基础_集合List与Set接口
- 三个月可更改用户昵称两次
- html如何实现表格效果,DIV+CSS技术实现类似table表格的效果
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
- Linux 查看本机串口方法
- 图片转文字软件哪个好?推荐这几款良心软件
- linux 防火墙服务器,Linux服务器上适用的防火墙分析
- 网页占满整个屏幕_网页打开后占满了全部电脑屏幕怎么办
- 登上大别山主景区天堂寨
- php怎么做地图源代码,php直播源码百度地图坐标拾取系统自定义页面
- oracle数据库user表空间不足,oracle 表空间不足解决办法大全
- 微服务(一)--Common