live555源代码学习(处理SETUP PLAY PAUSE TEARDOWN等过程)

1、分别的含义

SETUP:告知服务器以TCP/UDP建立RTP、RTSP连接,并告知端口号
PLAY:告知服务器可以开始用RTP协议传输数据过来了
PAUSE:暂停
TEARDOWN:关闭连接

2、

在服务器程序端,有一个RTSPClientSession类(该类继承在RESPServer下),用来维护和客户端之间的对话。
在RTSPClientSession类中定义了很多handleCmd_xxxxx这样的函数,就是专门用来处理对应的请求的
例如,当处理SETUP时,就会调用handleCmd_SETUP

void RTSPServer::RTSPClientSession
::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection,
		  char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr)

RTP的建立过程无非是这样:client告诉server自己的rtp/rtcp端口号,
server建立自己的rtp/rtcp socket,然后在收到PLAY请求时向客户端发数据。


这点暂时不确定行不行:
当然在实际中,只要双方已经约定好端口号,可以省去SETUP请求
可以看一下handleCmd_SETUP是怎么做的


3、handleCmd_SETUP

1、服务器首先找到客户端请求的ServerMediaSession,在进一步找到ServerMediaSubsession,
2、从客户端的请求中获取信息(也就是客户端的RTP、RTCP端口)
3、最后调用OnDemandServerMediaSubsession::getStreamParameters创建RTP/RTCP连接

4、

至此,服务器和客户端之间已经建立好连接了,就等客户端PLAY信号,就可以开始传RTP包了

5、handleCmd_PLAY

若是收到客户端的PLAY信号,handleCmd_SETUP是怎么做的呢
1、提取Scale字段(播放速度)
2、提取Rang字段(播放的起止范围)
3、然后设置好传输的参数
Scale:setStreamScale
Rang:seekStream
4、设置好之后,调用startstream开始传输

void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId,
						void* streamToken,
						TaskFunc* rtcpRRHandler,
						void* rtcpRRHandlerClientData,
						unsigned short& rtpSeqNum,
						unsigned& rtpTimestamp,
						ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
						void* serverRequestAlternativeByteHandlerClientData)

在函数startstream中继续调用startPlaying

void StreamState
::startPlaying(Destinations* dests, unsigned clientSessionId,
	       TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData,
	       ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
	       void* serverRequestAlternativeByteHandlerClientData)

在函数StreamState::startPlaying中将客户端添加到目的客户端地址中去,继续调用 MediaSink::startPlaying

//这个函数,开始rtp包的发送
Boolean MediaSink::startPlaying(MediaSource& source,
				afterPlayingFunc* afterFunc,
				void* afterClientData)
6、网上高人的总结:

服务器通过RTPSink去读数据,在RTPSink中又通过FramedSource读数据(这里应该是将媒体文件 流化)读完数据后交给RTPSink处理,RTPSink处理完后又继续通过FramedSource去读数据,如此在RTPSink和FramedSource之间形成循环,这为live555读取数据的基本流程

7、PAUSE TEARDOWN

这两个请求暂没有去研究

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

猜你喜欢

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