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反馈信息之后的内容。