本人现在在做有关AXIS方面的应用,昨天花了一天时间终于读到了视频流数据,虽然是AXIS产品开发,但是我相信RTSP部分的内容对初学者应该会有一些帮助,可能会有错误的地方,希望大家更正。
首先说的是,如果你能够从socket方面理解windows网络编程的话,那么无论RTSP还是RTP,或者可以说大部分网络协议,从本质上都是一样的,都是基于套接字socket的编程。这样的话RTSP就是轻车熟路了。
实时流协议(RTSP)是应用层协议,控制实时数据的传送。RTSP 提供了一个可扩展框架,使受控、按需传输实时数据(如音频与视频)成为可能。数据源包括现场数据与存储在剪辑中的数据。本协议旨在于控制多个数据发送会话,提供了一种选择传送途径(如UDP、组播UDP 与TCP)的方法,并提供了一种选择基于RTP (RFC1889)的传送机制的方法。
RTSP和HTTP非常相似,在开发RTSP客户端程序时有几种方式可以选择:
1. RTP/RTSP/TCP 采用RTSP通过TCP协议连接服务器,控制媒体流信息传输,然后通过此连接接收媒体流信息。
2. RTP/RTSP/HTTP 通过HTTP协议携带RTS控制信息和RTP数据信息实现流媒体的传输,这种方式有一个好处就是可以顺利的通过防火墙。
3. RTP/RTSP/UDP 采用RTSP通过TCP协议连接服务器,控制媒体流信息传输,并告知客户端UDP接收端口,然后通过UDP接收媒体流信息。
各个服务器支持的方式可能不一样,大家要先准确知道服务器支持什么方式。
RTSP发送指令格式:<CRLF>是回车换行("\r\n”)的意思
COMMAND rtsp://<servername>/axis-media/media.amp [?<parameter>=<value>[&<parameter>=<value>...]] RTSP/1.0<CRLF>
Headerfield1: val1<CRLF>
Headerfield2: val2<CRLF>
...
<CRLF>
[Body]
第一行包含有命令、协议、服务器地址、流媒体参数(编码方式、分辨率等)。
接着是头信息,这和HTTP非常相似,AXIS RTSP常用信息头如下:
Authorization :Authorization information from the client.
CSeq :Request sequence number.
Session :Session identifier (returned by server in SETUP response).
Content-Length :Length of content.
Content-Type :The media type of the content.
User-Agent :Information about the client that initiates the request.
Body就是要发送的信息实体。
RTSP返回信息格式:
RTSP/1.0 <Status Code> <Reason Phrase> <CRLF>
Headerfield3: val3<CRLF>
Headerfield4: val4<CRLF>
...
<CRLF>
[Body]
RTSP编程从原理上很简单,以方式1为例介绍RTSP编程的主要步骤:
1. 建立WinSock:
SOCKET sock(AF_INET,SOCK_STREAM,0);
2. 与RTSP服务器建立TCP连接:
connect(sock,server_addr,sizeof(server_addr));
3. 发送RTSP指令,这一部分也是整个程序和其他协议不一样的部分:
RTSP定义了很多方法,这里介绍AXIS开发中常用的几个:OPTIONS, DISCRIBE, SETUP, PLAY, PAUSE, TEARDOWN.
OPTIONS指令:用于得到RTSP服务器支持的指令
发送信息包如下:
OPTIONS rtsp://<servername>/axis-media/media.amp RTSP/1.0
CSeq: 1
User-Agent: Axis AMC
Authorization: Basic cm9vdDpwYXNz
其中Authorization为身份验证信息,采用base64编码
返回信息如下:
RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, GET_PARAMETER, PAUSE, PLAY, SETUP, SET_PARAMETER, TEARDOWN
Date: Sat, 16 Jun 2001 12:38:56 GMT
4. DESCRIBE指令:得到媒体流的一个SDP(Session Description Protocol)描述
DESCRIBE rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0
CSeq: 2
Accept: application/sdp
User-Agent: Axis MAC
Authorization: Basic cm9vdDpwYXNz
返回信息如下:
RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Base: rtsp://172.16.200.254:554/axis-media/media.amp/
Date: Sat, 16 Jun 2001 12:38:56 GMT
Content-Length: 570
v=0
o=- 992695136526595 992695136526595 IN IP4 172.16.200.254
s=Media Presentation
e=NONE
c=IN IP4 0.0.0.0
b=AS:50000
t=0 0
a=control:rtsp://172.16.200.254:554/axis-media/media.amp?videocodec=h264&resolution=640x480
a=range:npt=0.000000-
m=video 0 RTP/AVP 96
b=AS:50000
a=framerate:25.0
a=transform:1,0,0;0,1,0;0,0,1
a=control:rtsp://172.16.200.254:554/axis-media/media.amp/trackID=1?videocodec=h264&resolution=640x480
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeKQFAe2AtwEBAeHiRFQ,aM48gA==
5. SETUP指令:设置流媒体传输方式,让服务器给流分配资源,启动RTSP 会话。
在SETUP指令中,需要多加一个信息头:
Transport :Specify how the data stream is transported. Supported variants are
RTP/AVP;unicast;client_port=port1-port2
RTP/AVP;multicast;client_port=port1-port2
RTP/AVP/TCP;unicast
在AXIS开发中,虽然datasheet说明支持UDP传输,但是选择方式一RTp/AVP时,服务器并不发送数据,只好用第三种方式RTP/AVP/TCP。
当使用第三种方式的时候,可以在添加一个信息头,设置blocksize为64000:
Blocksize :64000
发送指令如下:
SETUP rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast;
Blocksize: 64000
User-Agent: Axis MACAuthorization: Basic cm9vdDpwYXNz
返回信息如下:
RTSP/1.0 200 OK
CSeq: 3
Session: C306C41C; timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=737F3A5E;mode="PLAY"
Date: Sat, 16 Jun 2001 12:38:56 GMT
这里有个地方要注意,返回信息中有一个Session:C306C41C;这个会议标识要存起来,在后边的指令中都要加入这个信息头以表示是同一个会话。
6. PLAY指令:请求服务器开始给客户端发送流数据
PLAY rtsp://<servername>/axis-media/media.amp?videocodec=h264&resolution=640x480 RTSP/1.0
CSeq: 4
User-Agent: Axis AMC
Session: C306C41C
Authorization: Basic cm9vdDpwYXNz
返回信息如下:
RTSP/1.0 200 OK
CSeq: 4
Session: C306C41C
Range: npt=0-
RTP-Info: url=rtsp://172.16.200.254:554/axis-media/media.amp/trackID=1?videocodec=h264&resolution=640x480;seq=42296;rtptime=295889231
Date: Sat, 16 Jun 2001 12:38:57 GMT
此命令返回成功之后,服务器应该就开始发送RTP数据包了,接下来就接受这些数据报。
7. PAUSE和TEARDOWN就不一一介绍了,直接讲接收RTP数据包
int size=recv(sock,(char *)pos,i_size,0);
可以使用wireshark来分析数据包中的实时数据,很容易看出那些事协议信息,哪些是实时数据信息,接下来的事情就不属于RTSP了。
如图,找到一个抓到的RTP数据包,在Real-Time Transport Protocol中点击Payload就可以看到其对应的信息。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。