live555源代码学习(处理DESCRIBE过程)

1、

RTSP的建立过程大概有这么几个
OPTIONS请求:询问有哪些方法可用,这个请求似乎不太会用到
DESCRIBE请求:查询服务器发送的媒体流的信息
SETUP请求:告知服务器建立连接,并告知端口号
PLAY请求:告知服务器开始以RTP包的形式发送数据
TEARDOWN请求:关闭连接

源代码中请求的处理函数有很多,上面的几个是比较有代表性的

2、

来看下服务器是如何处理一个DESCRIBE请求的的
在这之前,要有一个认识,在服务器端我们会建立一个RTSPSever,建立ServerMediaSession来表示服务器下的媒体文件,建立ServerMediaSubsession表示一个媒体文件中的视频或音频,一个ServerMediaSession可以包含多个ServerMediaSubsession。

(1)、

对应DESCRIBE的处理函数在RTSPServer::RTSPClientConnection::handled_DESCRIBE
(这里提一下,在最新的live555源代码中,请求的处理函数被分成了两个类,一个是RTSPClientConnection,一个是RTSPClientSession。看一些之前的博客,以前的版本似乎是没有RTSPClientConnection这个类的)
在处理函数handled_DESCRIBE中,又调用ServerMediaSession::generateSDPDescription函数,这个函数是为了获取SDP信息
(这里提一下,ServerMediaSession的SDP信息是有其包含的所有ServerMediaSubsession的SDP信息组合在一起形成的)
该函数将产生的SDP消息发送给客户端,客户端以此得到媒体流信息

(2)、

为了获取每个ServerMediaSubsession的SDP信息,程序调用sdplines函数(我的源代码在OnDemandServerMediaSubsession类中)
(这里提一下,live555获取SDP信息的方法是让媒体文件播放一下,建个“零时”的FramedSource和RTPSink来模拟下发送接收,而且FramedSource和RTPSink的建立不同编码格式调用不同的函数(同名,虚函数重写))
FramedSource:获取数据
RTPSink:用来保存RTP数据包
获取sdp的函数
setSDPLinesFromRTPSink(dummyRTPSink, inputSource, estBitrate);
dummyRTPSink:RTPSink类对象
inputSource:FramedSource类对象
estBitrate: int(sdp信息应该就在这里面)

(3)、

在函数setSDPLinesFromRTPSink中,调用分工明确的子函数获取SDP的不同字段的信息
(再类RTPSink中定义了很多用于获取sdp信息的成员函数)

(4)、

可以单独拿出来写一下的事获取SDP中的auxSDPLine,调用函数getAuxSDPLine(rtpSink, inputSource)。不过不同的编码格式重写了这个函数

(5)、

到这里,服务器成功获得了媒体文件的SDP消息,接着,客户端就可以向服务器发送SETUP请求,建立连接,连接建立好后就可以发送PLAY开始接收媒体流数据了

发布了46 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42718004/article/details/90069452
今日推荐