live555之openRTSP----- continueAfterDESCRIBE()

原创 2016年08月31日 14:19:54

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

Swift中的条件操作和循环

在Swift中,使用if和switch语句来进行条件操作,使用for-in、for、while和repeat-while语句来进行循环。...
  • zhouzxi
  • zhouzxi
  • 2016年10月28日 20:20
  • 802

Live555学习之(六)---------- 在Live555中实现录像

Live555还提供了录像的示例程序,在testProgs目录下的playCommon.cpp中,Live555录像的基本原理就是创建一个RTSPClient去请求指定rtsp地址的视频,然后保存到文...

live555简介、整体框架 、openRTSP客户端流程

live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多种音视频编码...

live555中openRTSP用法

openRTSP openRTSP是一个命令行程序,它sk

流媒体Live555(五)——openRTSP流程分析

openRTSP是对RTSPClient的实现,与服务器对应的客户端功能 1、初始化 BasicTaskschedular::createNew() BasicUsageEnvironment:...
  • leiych
  • leiych
  • 2013年12月10日 18:35
  • 840

live555 分析—— OpenRtsp

通过分析live库提供的例子程序 OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协...

live555 分析- openRtsp

通过分析live库提供的例子程序 OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协...

[RTSP]live555-openRTSP客户端流程

1、创建TaskScheduler和BasicUsageEnvironment类; 2、命令行解析,获取流媒体地址和其他选项; 3、创建RTSPClient对象; 4、如果需要,RTSPClie...
  • faihung
  • faihung
  • 2017年06月03日 07:21
  • 498

流媒体Live555(五)——openRTSP流程分析

openRTSP是对RTSPClient的实现,与服务器对应的客户端功能 1、初始化 BasicTaskschedular::createNew() BasicUsageEnvironment:...
  • xu_fu
  • xu_fu
  • 2013年07月13日 15:34
  • 6197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:live555之openRTSP----- continueAfterDESCRIBE()
举报原因:
原因补充:

(最多只允许输入30个字)