live555之openRTSP----- continueAfterDESCRIBE()

openrtsp在发送完DISCRIBE之后,server端就会返回描述信息SDP。
DISCRIBE请求报文格式
这里写图片描述
响应报文格式
这里写图片描述
例如:


> DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0 CSeq: 2 
> token:
> Accept: application/sdp 
> User-Agent: VLC media player (LIVE555
RTSP/1.0 200 OK  
Cseq: 2  
x-prev-url:rtsp://192.168.20.136:5000 
x-next-url: rtsp://192.168.20.136:5000
x-Accept-Retransmit: our-retransmit 
x-Accept-Dynamic-Rate: 1
Cache-Control: must-revalidate 
Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT 
Date: Fri, 10 Nov 2006 12:34:38 GMT 
Expires: Fri, 10 Nov 2006 12:34:38 GMT 
Content-Base: rtsp://192.168.20.136:5000/xxx666/
Content-Length: 344 Content-Type: application/sdp v=0 //以下都是sdp信息
o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136
s=/xxx666 
u=http:/// 
e=admin@ 
c=IN IP4 0.0.0.0 
t=0 0
a=isma-compliance:1,1.0,1 
a=range:npt=0- 
m=video 0 RTP/AVP 96//m表示媒体描述, 下面是对会话中视频通道的媒体描述 
a=rtpmap:96 MP4V-ES/90000 
a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307a=control:trackID=0 //trackID=0表示视频流用的是通道0 ```

continueAfterDESCRIBE函数的流程我参考了这篇博客,排版比较清晰
这里写图片描述

注: session = MediaSession::createNew(*env, sdpDescription); //MediaSession类似于个个容器、链表用来管理MediaSubsession。
在创建MediaSession的时候,顺便根据SDP信息中的m=部分创建了一个MediaSubsession对象。
// We have a “m=” line, representing a new sub-session:
MediaSubsession* subsession = createNewMediaSubsession();


这里面重点说一下initiate函数
subsession->initiate(simpleRTPoffsetArg)
先根据sdp信息协商,采用UDP传输方式,创建两个Groupsock对象用于RTP/RTCP的接收,fRTPSocket,fRTCPSocket.
之后在创建source,“fRTPSource”and “fReadSource”,和live555服务端原理一样,source和sink,分管生产和消费。

createSourceObjects();
这里根据返回的SDP信息创建对应的source,我这边是H264视频源,所以

 } else if (strcmp(fCodecName, "H264") == 0) {
    fReadSource = fRTPSource
      = H264VideoRTPSource::createNew(env(), fRTPSocket,
                      fRTPPayloadFormat,
                      fRTPTimestampFrequency);
      } 

然后创建一个fRTCPInstance = RTCPInstance::createNew,如果是多录视频fRTCPInstance 专门接受RTCP包,

基本上初始化工作已经完成了。但是疑问是我们接受server端发送的rtp包的前提,我们必须要监听一个端口才行啊。其实这一步是放在创建fRTPSocket,fRTCPSocket.的时候就完成了。
new Groupsock()->OutputSocket(env,port)->Socket(env,port)->setupDatagramSocket(fEnv,port)->bind ;

总结一下,获取SDP信息之后,我们干了哪些事。
1.创建MediaSession MediaSubsession
2.创建套接字fRTPSocket,fRTCPSocket.
3.bind接收端口,为后面做准备
4.初始化一个大的接收buffer
5.创建source
6.创建RTCPInstance

然后下一篇在讲一下获取SETUP反馈信息之后的内容。

猜你喜欢

转载自blog.csdn.net/sstya/article/details/52384087
今日推荐