RTSP会话

首先说说程序的大体结构。这是个服务端程序,客户端用的是VLC,因此首先需要开个线程来不断监听客户端的请求,也就是RTSP的请求与应答了(其实就是监听554端口)。RTSP的指令格式很多,最小系统的指令支持做到这几个就差不多了:OPTIONS,DESCRIBE,SETUP,TEARDOWN,PALY。下面是实际的请求与应答:

RTSPRecvData : OPTIONS rtsp://192.168.3.103:554/live/0 RTSP/1.0//客户端请求
CSeq: 2
User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)

RTSPSendMSG : RTSP/1.0 200 OK
Server: tvt.dvr.server
CSeq: 2
Public: OPTIONS,DESCRIBE,SETUP,TEARDOWN,PALY,PAUSE,SCALE

RTSPRecvData : DESCRIBE rtsp://192.168.3.103:554/live/0 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
Accept: application/sdp

RTSPSendMSG : RTSP/1.0 200 OK
Server: tvt.dvr.server
CSeq: 3
Content-Type: application/sdp
Content-Length: 165

m=audio 0 RTP/AVP 8 //音频,G711  A-LAW这里没指定客户端端口(为0),客户端会随即分配一个
a=rtpmap:8 PCMA/8000
a=control:trackID=1
m=video 0 RTP/AVP 96 //视频 :H264、PS封装    ES应该为98
a=rtpmap:96 h264/90000
a=control:trackID=2
c=IN IP4 0.0.0.0
a=framerate:25 //帧率不用指定,VLC应该可以根据流格式出来, 实际上也不好做,因为服务器发出的音视频可能是变化的

RTSPRecvData : SETUP rtsp://192.168.3.103:554/live/0/trackID=1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
Transport: RTP/AVP;unicast;client_port=50990-50991 //默认UDP传输方式,客户端给出它的端口

RTSPSendMSG : RTSP/1.0 200 OK
Server: tvt.dvr.server
CSeq: 4
Session: 220540936 //SETUP后  告知SESSION ID
Transport: RTP/AVP/UDP;unicast;client_port=50990-50991;server_port=6000-6001//服务器告知自己的端口

RTSPRecvData : SETUP rtsp://192.168.3.103:554/live/0/trackID=2 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
Transport: RTP/AVP;unicast;client_port=50992-50993
Session: 220540936

RTSPSendMSG : RTSP/1.0 200 OK
Server: tvt.dvr.server
CSeq: 5
Session: 220540936
Transport: RTP/AVP/UDP;unicast;client_port=50992-50993;server_port=6002-6003

RTSPRecvData : PLAY rtsp://192.168.3.103:554/live/0 RTSP/1.0
CSeq: 6
User-Agent: LibVLC/2.0.1 (LIVE555 Streaming Media v2011.12.23)
Session: 220540936
Range: npt=0.000-

RTSPSendMSG : RTSP/1.0 200 OK
CSeq: 6
============================== new rtp stream start ============================


其中关键的是RTSP中嵌套的SDP消息,下面逐行解释:

m=audio 0 RTP/AVP 8    

告诉客户端媒体含有audio,其端口未指定(0),采用UDP方式传输(RTP/AVP/UDP “UDP”字样未填就缺省了),媒体类型为8(g711-alaw)


a=rtpmap:8 PCMA/8000 

媒体类型为8的是PCMA,其采样频率为8000


a=control:trackID=1

可以通过请求trackID=1"来请求上面的音频


m=video 0 RTP/AVP 96

媒体包含video,其端口未指定(0),采用UDP方式传输,媒体类型为96,(国标中说96为PS流,98为H264,但是用VLC播放,不打PS流的H264数据96和98都可以)


a=rtpmap:96 h264/90000

媒体类型为96的是h264,其采样频率为90000


a=control:trackID=2

可以通过请求trackID=2"来请求上面的视频


c=IN IP4 0.0.0.0

IN:internet   IP4:IPV4   0.0.0.0  :  连接地址,发送改SDP消息的设备的地址


a=framerate:25 //帧率,实际在打时间戳时,可以不根据固定的帧率,而根据实际的帧间隔来打

你可能感兴趣的:(RTSP会话)