Live555源码分析

来源:互联网 发布:露华浓淘宝是真的吗 编辑:程序博客网 时间:2024/05/16 06:49

前言

Live555是一套开源的支持http的RTSP服务器,可以通过解析本地MP4,mp3,h264,等等编码的文件,如果想了解RTSP的通讯协议,和视频文件的编解码,这套代码还是值得阅读的。

正文

上一篇讲述了LIve555的任务进程管理,这里通过一个进程,通过添加任务的方式,完成了任务的调度,可是真的关于通讯和文件的解析,就没太多分析,这次我从整体结构来分析一下Live555的结构。

2.1 消息通讯过程

这里一共要通过五次信息交换,才可以实现通讯。

1.C->S:OPTION request //询问S 有哪些方法可用  1.S->C:OPTION response //S 回应信息中包括提供的所有可用方法  2.C->S:DESCRIBE request //要求得到S 提供的媒体初始化描述信息  2.S->C:DESCRIBE response //S 回应媒体初始化描述信息,主要是sdp  3.C->S:SETUP request //设置会话的属性,以及传输模式,提醒S 建立会话  3.S->C:SETUP response //S 建立会话,返回会话标识符,以及会话相关信息  4.C->S:PLAY request //C 请求播放  4.S->C:PLAY response //S 回应该请求的信息  S->C:发送流媒体数据  5.C->S:TEARDOWN request //C 请求关闭会话  5.S->C:TEARDOWN response //S 回应该请求

上述的过程是标准的、友好的rtsp 流程,但实际的需求中并不一定按部就班来。其中第3和4步是必需的!第一步,只要服务器客户端约定好,有哪些方法可用,则option 请求可以不要。第二步,如果我们有其他途径得到媒体初始化描述信息(比如http 请求等等),则我们也不需要通过rtsp 中的describe 请求来完成。第五步,可以根据系统需求的设计来决定是否需要。
但是我们的live555是支持五条全部指令的,当然请求,也是按部就班的请求,我们一一回应,着前四步很重要,所有的代码逻辑都是围绕着写来的,以后我们会一一讲解这些请求和应答。

2.2 主要的请求指令

这里我介绍几种主要的通讯过程,主要是跟踪开始初始化,和传输数据,至于说后面的结束,这里当然不管了。

2.2.1 OPTION

目的是得到服务器提供的可用方法:

OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0CSeq: 1 //每个消息都有序号来标记,第一个包通常是option 请求消息User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器的回应信息包括提供的一些方法,例如:

RTSP/1.0 200 OKServer: UServer 0.9.7_rc1Cseq: 1 //每个回应消息的cseq 数值和请求消息的cseq 相对应Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服务器提供的可用的方法

2.2.2 DESCRIBE

C 向S 发起DESCRIBE 请求,为了得到会话描述信息(SDP):

DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0CSeq: 2token:Accept: application/sdpUser-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器回应一些对此会话的描述信息(sdp):

RTSP/1.0 200 OKServer: UServer 0.9.7_rc1Cseq: 2x-prev-url: rtsp://192.168.20.136:5000x-next-url: rtsp://192.168.20.136:5000x-Accept-Retransmit: our-retransmitx-Accept-Dynamic-Rate: 1Cache-Control: must-revalidateLast-Modified: Fri, 10 Nov 2006 12:34:38 GMTDate: Fri, 10 Nov 2006 12:34:38 GMTExpires: Fri, 10 Nov 2006 12:34:38 GMTContent-Base: rtsp://192.168.20.136:5000/xxx666/Content-Length: 344Content-Type: application/sdpv=0 //以下都是sdp 信息o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136s=/xxx666u=http:///e=admin@c=IN IP4 0.0.0.0t=0 0a=isma-compliance:1,1.0,1a=range:npt=0-m=video 0 RTP/AVP 96 //m 表示媒体描述,下面是对会话中视频通道的媒体描述a=rtpmap:96 MP4V-ES/90000a=fmtp:96profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307a=control:trackID=0//trackID=0表示视频流用的是通道0

2.2.3 SETUP

客户端提醒服务器建立会话,并确定传输模式:

SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0CSeq: 3Transport: RTP/AVP/TCP;unicast;interleaved=0-1User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)//uri 中带有trackID=0,表示对该通道进行设置。Transport 参数设置了传输模式,包的结构。接下来的数据包头部第二个字节位置就是interleaved,它的值是每个通道都不同的,trackID=0的interleaved 值有两个0或1,0表示rtp 包,1表示rtcp 包,接受端根据interleaved 的值来区别是哪种数据包。

服务器回应信息:

RTSP/1.0 200 OKServer: UServer 0.9.7_rc1Cseq: 3Session: 6310936469860791894 //服务器回应的会话标识符Cache-Control: no-cacheTransport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567

2.2.4 PLAY

客户端发送播放请求:

PLAY rtsp://192.168.20.136:5000/xxx666 RTSP/1.0CSeq: 4Session: 6310936469860791894Range: npt=0.000- //设置播放时间的范围User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服务器回应信息:

RTSP/1.0 200 OKServer: UServer 0.9.7_rc1Cseq: 4Session: 6310936469860791894Range: npt=0.000000-RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309//seq 和rtptime 都是rtp 包中的信息

这里我们目标明确,总共只有这四条关键的指令,也就是我们执行四次响应,我们以后分成篇博客来讲解这里到底如何实现的。

  1. 服务器的搭建
  2. DESCRIBE指令处理
  3. PLAY指令处理

后记

这里这篇博客很大程度上是复制别人的博客,我也没找到原作者,这里就不附链接,共勉加油。

原创粉丝点击