RTSP¶
使用rtsp拉流时,需要进行协议交互,流程如下(以tcp为例)
- 客户端向服务端发送OPTIONS报文,带上rtsp的地址和版本信息,以及user-agent信息
- 服务端回复 200 OK,以及公开的方法
- 客户端发送DESCRIBE报文,请求接收sdp报文(Accept: application/sdp)
- 服务端回复 200 OK,以及Session Description Protocol信息(h264的话里面payload type一般为96,且含有被base64编码过的sps和pps信息)
- 客户端发送SETUP请求建立连接,附带上提供的客户端的rtp/rtcp的端口,并在rtsp地址上写明是那个track。(音视频的话是音频和视频两个track,一般视频是track1, 音频是track2,要发送两次SETUP请求
- 服务端回复 200 OK,返回session id信息,超时时间,服务端对应的端口信息以及ssrc
- 客户端发送PLAY请求,带上上一步返回的session信息,请求开始播放
- 服务端回复 200 OK,播放成功
H264¶
其中h264的sdp中含有的sps、pps信息是经过base64
编码的
即sprop-parameter-sets=
后面的可打印字符串,通过将nal unit 1 string
经过base64
解码后,再以16进制显示(hexdump -C
)就可以得到67开头的数据了
AAC¶
其中aac也有信息会在sdp中发送过去里面含有一个config
字段
图中在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
,中的samplingFrequencyIndex
为0011
即对应的采样率是48khz,channelConfiguration
为0010
即2。
这两个字段是构成AAC的ADTS重要的信息,还有一个重要信息是length(表示adts+aac数据的长度),大部分的adts长度为7个字节(所以有些地方的时间直接就把这个length = 7 + aacData.size)