Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2765053
  • 博文数量: 505
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 2514
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-23 18:24
文章分类

全部博文(505)

文章存档

2019年(12)

2018年(15)

2017年(1)

2016年(17)

2015年(14)

2014年(93)

2013年(233)

2012年(108)

2011年(1)

2009年(11)

分类: LINUX

2013-05-14 19:46:43

RTSP

RTSP信令的交互我们一般用TCP方式,RTP而是用UDP方式


RTSP 有如下信令:


在这之前建立一个TCP socket用来作信令交互,叫做TCPSockfd

OPTIONS:

功能:请求用于返回服务端支持的 RTSP 命令列表

信令交互:

C->S: 

OPTIONS * RTSP/1.0
CSeq: 1
Require: implicit-play
Proxy-Require: gzipped-messages


S->C: 

RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

这个信令不常用,一般client端知道对接的服务器有哪些命令

CSeq:信令序列号,后面的序列号累计增加。


DESCRIBE:

功能:用于请求指定的媒体流的 SDP 描述信息

信令交互:

C->S:

DESCRIBE rtsp://10.50.108.17/vod/957509 RTSP/1.0
CSeq: 2
Accept: application/sdp

S->C:

RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 376


v=0
o=- 2890844526 2890842807 IN IP4 10.50.108.17
s=RTSP Session
t=0 0
r=15 0 0 0
i=
b=AS:1600
c=IN IP4 0.0.0.0
m=video 0 RTP/AVP 33
a=rtpmap:33 MP2T/90000
a=range:npt=0.000-566.000//媒体流的开始时间和结束时间,以S为单位


在descripe之后,我们建立一个UDP的socket,用于RTP包的传输,UDPSockfd,bind到一个端口,比如:26958

SETUP:

功能: 命令用于配置数据交付的方法

信令交互:

C->S:

SETUP rtsp://10.50.108.17/vod/957509/ RTSP/1.0
CSeq: 2
Transport: RTP/AVP;unicast;client_port=26958-26959//通知server 发送RTP包给client这个端口,后面的26959是rtcp端口,一般没有实现
User-Agent: CTC RTSP 1.0

S->C:

RTSP/1.0 200 OK
CSeq: 2
Session: 10145778//rtsp的session,之后的信令都要带上这个参数,并保持一致
Transport: MP2T/RTP/UDP;unicast;destination=172.19.133.128:26958;control_address=10.50.108.17:554;mode=play;QAM_FRQ=131073


172.19.133.128:26958 client端IP和port

10.50.108.17:554 server端IP和port


setup之后有必要做一个natdetect:私有信令,这个信令是是用UDPSockfd发的,收也是UDPSockfd来收,这样就做了一个nat穿越

NAT_DETECT

C->S:

NAT_DETECT rtsp://10.50.108.17/vod/957509 RTSP/1.0
CSeq: 1

S->C:



PLAY:

功能:请求流

C->S

rtsp://10.50.108.17/vod/957509 RTSP/1.0

CSeq: 3
Session: 10145778
User-Agent: CTC RTSP 1.0


S->C:

RTSP/1.0 200 OK
CSeq: 3
Session: 10145778
Scale: 1.0
Range: npt=0.000-0.000


PAUSE

功能:暂停

C->S

PAUSE rtsp://10.50.108.17/vod/957509 RTSP/1.0
CSeq: 5
Session: 10145778
User-Agent: CTC RTSP 1.0

S->C

RTSP/1.0 200 OK
CSeq: 5
Session: 10016005


GET_PARAMETER:心跳作用

C->S:

GET_PARAMETER rtsp://10.50.108.17/vod/957509 RTSP/1.0
CSeq: 4
Session: 10145778
User-Agent: CTC RTSP 1.0

S->C:

RTSP/1.0 200 OK
CSeq: 4
Session: 10145778


ANNOUNCE:

也是用UDPSockfd来收的,用来处理边界值







RTP头:

前12个字节在每一个RTP packet中都存在,而一系列的CSRC标记只有存在Mixer时才有。

   version (V): 2 bits
      标明RTP版本号。协议初始版本为0,RFC3550中规定的版本号为2。

   padding (P): 1 bit
      如果该位被设置,则在该packet末尾包含了额外的附加信息,附加信息的最后一个字节表示额外附加信息的长度(包含该字节本身)。该字段之所以存在是因为一些加密机制需要固定长度的数据块,或者为了在一个底层协议数据单元中传输多个RTP packets。

   extension (X): 1 bit
      如果该位被设置,则在固定的头部后存在一个扩展头部,格式定义在RFC3550 5.3.1节。

   CSRC count (CC): 4 bits
      在固定头部后存在多少个CSRC标记。

   marker (M): 1 bit
      该位的功能依赖于profile的定义。profile可以改变该位的长度,但是要保持marker和payload type总长度不变(一共是8 bit)。

   payload type (PT): 7 bits
      标记着RTP packet所携带信息的类型,标准类型列出在RFC3551中。如果接收方不能识别该类型,必须忽略该packet。

   sequence number: 16 bits
      序列号,每个RTP packet发送后该序列号加1,接收方可以根据该序列号重新排列数据包顺序。

   timestamp: 32 bits
      时间戳。反映RTP packet所携带信息包中第一个字节的采样时间。

   SSRC: 32 bits
      标识数据源。在一个RTP Session其间每个数据流都应该有一个不同的SSRC。

   CSRC list: 0 to 15 items, 32 bits each
      标识贡献的数据源。只有存在Mixer的时候才有效。如一个将多声道的语音流合并成一个单声道的语音流,在这里就列出原来每个声道的SSRC。

阅读(1498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~