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的分析见:
对于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
标签:RTSP,rtsp,server,session,拉流,源码,监听 来源: https://blog.csdn.net/sinat_41614489/article/details/121854604