0x01 RTSP和RTMP简介
RTSP协议是流媒体协议,通过在播放器和服务端交互建立连接以后,服务器在不同的通道通过UDP把音频/视频数据发送给播放器。
RTSP协议传输的数据格式一般为TS,MP4。因为音视频是分别通过不同的UDP通道传输的,所以在服务端需要把ts/mp4文件做demux,然后再传输。我们可以采用live555,vlc,ffmpeg等作为rtsp服务器。
而RTMP协议则是通过一个TCP通道把音视频数据从服务端发送到播放器,RTMP协议传输的一般为flv格式数据。开源的RTMP服务器有red5,nginx-rtmp-module,srs。red5是java实现的服务器,nginx-rtmp-module是基于web服务器nginx开发的rtmp流媒体服务器,而srs的实现基于st(state-threads)的单线程多协程服务器。
0x02 RTSP交互过程
RTSP服务端和RTSP客户端的交互过程如下。
C表示RTSP客户端,S表示RTSP服务端
0x21 OPTION
C->S: OPTION request //C询问S有哪些方法可用
S->C: OPTION response //S回应提供的所有可用方法
0x22 DESCRIBE
C->S: DESCRIBE request //C要求得到S提供的媒体初始化描述信息
S->C: DESCRIBE response //S回应媒体初始化描述信息(SDP)
0x23 SETUP
C->S: SETUP request //C请求S建立会话
S->C: SETUP response //S建立会话,返回会话相关信息
0x24 PLAY
C->S: PLAY request //C请求播放
S->C: PLAY response //S回应请求
S->C: //RTP发送流媒体数据
0x25 TEARDOWN
C->S: TEARDOWN request //C请求关闭会话
S->C: TEARDOWN response //S回应请求
0x03 抓包分析
RTSP服务端和客户端的整体交互过程如下。
0x31 OPTION
客户端询问服务器有哪些方法可用。
服务器返回可以使用的方法。
DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER\r\n
0x32 DESCRIBE
客户端请求服务端发送SDP,服务端发送SDP给客户端。
如下所示,SDP中包括H264的sps和pps信息。
0x33 SETUP
客户端请求建立Audio和Video的UDP连接。
下面的Request请求建立Video的UDP连接。
Request: SETUP rtsp://192.168.40.1:8554/1/trackID=0 RTSP/1.0\r\n
下面的Request请求建立Audio的UDP连接。
Request: SETUP rtsp://192.168.40.1:8554/1/trackID=1 RTSP/1.0\r\n
0x34 PLAY
客户端请求服务端开始提供流媒体服务,开始发送音视频数据到客户端。
如下所示,Payload type为DynamicRTP-Type-96 (96)的RTP包发送的是Video数据,Payload type为MPEG-I/II Audio (14)的RTP包发送的是Audio数据。
0x35 RTCP包
在开始传输音视频RTP包以后,RTCP用来提供客户端和服务端之间的传输反馈。服务端发送给客户端的RTCP包是Sender Report,客户端发送给服务端的RTCP包是Receiver Report。