Skip to content

RTSP

使用rtsp拉流时,需要进行协议交互,流程如下(以tcp为例)

rtsp

  1. 客户端向服务端发送OPTIONS报文,带上rtsp的地址和版本信息,以及user-agent信息
  2. 服务端回复 200 OK,以及公开的方法
  3. 客户端发送DESCRIBE报文,请求接收sdp报文(Accept: application/sdp)
  4. 服务端回复 200 OK,以及Session Description Protocol信息(h264的话里面payload type一般为96,且含有被base64编码过的sps和pps信息)
  5. 客户端发送SETUP请求建立连接,附带上提供的客户端的rtp/rtcp的端口,并在rtsp地址上写明是那个track。(音视频的话是音频和视频两个track,一般视频是track1, 音频是track2,要发送两次SETUP请求
  6. 服务端回复 200 OK,返回session id信息,超时时间,服务端对应的端口信息以及ssrc
  7. 客户端发送PLAY请求,带上上一步返回的session信息,请求开始播放
  8. 服务端回复 200 OK,播放成功

H264

其中h264的sdp中含有的sps、pps信息是经过base64编码的

sdp

sprop-parameter-sets=后面的可打印字符串,通过将nal unit 1 string经过base64解码后,再以16进制显示(hexdump -C)就可以得到67开头的数据了

AAC

其中aac也有信息会在sdp中发送过去里面含有一个config字段

sdp

图中在a=rtpmap中显示音频的格式为MPEG4-GENERIC,采样率为48khz,通道数为2

a=fmtp中显示了一堆详细信息,其中比较重要的是config=1190这个字段,这是两个16进制的字节

audioObjectType samplingFrequencyIndex channelConfiguration unused
5 4 4 3

仅前13个bit有效,且audioObjectType通常是1或者2。

比如这0x1190=0001 0001 1001 0000,中的samplingFrequencyIndex0011即对应的采样率是48khz,channelConfiguration0010即2。

这两个字段是构成AAC的ADTS重要的信息,还有一个重要信息是length(表示adts+aac数据的长度),大部分的adts长度为7个字节(所以有些地方的时间直接就把这个length = 7 + aacData.size)