一、引言
使用vlc等播放器可以播放海康网络摄像机的RTSP流:
网络摄像机的RTSP流中,RTSP主要用于控制媒体流的传输,如播放、暂停、停止等操作。RTSP本身并不用于转送媒体流数据,而是会通过PLAY方法使用RTP来传输实际的音视频数据。所以播放器播放RTSP流,实际播放的是里面的RTP音视频数据。
二、Wireshark抓包分析
播放器播放摄像机的rtsp流时,对摄像机的数据进行抓包。以我使用的海康摄像机为例:
(一)区分RTSP客户端和服务器
首先我们得搞清楚一个概念:播放器和摄像机哪个是客户端,哪个是服务器。
对于RTSP,其通常使用TCP进行传输,因为它需要可靠的连接来确保控制命令的可靠性:
如下图所示,172.16.25.64是摄像机的ip,172.16.25.63是播放器所在电脑的ip。大家都知道,TCP握手的第一次握手总是:客户端向服务器发送一个SYN报文段。所以从下图的TCP三次握手可以看出来,播放器是TCP(RTSP)客户端,摄像机是TCP(RTSP)服务器:
但是对于传输实际音视频数据的RTP,则是反过来的:播放器是UDP(RTP)服务器,摄像机是UDP(RTP)客户端。具体可以参考:《音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现》。
(二)SDP分析
RTSP协议中,RTSP(TCP)客户端向RTSP服务器端发送DESCRIBE方法,用于得到URI所指定的媒体描述信息,一般是SDP信息(关于SDP协议可以参考:《音视频入门基础:RTP专题(3)——SDP简介》)。选中RTSP的DESCRIBE方法,右键 -> “追踪流” -> “TCP Stream”:
从SDP信息中,可以看到,
对于视频:a=rtpmap:96 H264/90000表示映射PT值为96的负载类型到H.264编码,采样率为90000 Hz。packetization-mode=1表示采用Non-interleaved mode(非交错模式)。
对于音频:a=rtpmap:104 mpeg4-generic/16000/1表示映射PT值为104的负载类型到AAC编码,音频的采样频率为16000Hz,音频声道数为2:
根据SDP找到PT(payload type)值为96的RTP包如下,该RTP包的payload即为H.264格式:
根据SDP找到PT(payload type)值为104的RTP包如下,该RTP包的payload即为AAC格式:
(三)RTP封装H.264时,视频的有效载荷结构
由《音视频入门基础:RTP专题(13)——SDP的packetization-mode》可以知道,当packetization-mode参数的值等于1时,表示使用Non-Interleaved Mode(非交错模式)。它主要用于低延迟应用,只能使用Single NAL Unit Packet、STAP-A和FU-A,不得使用STAP-B、MTAP(MTAP16、MTAP24)和FU-B。NAL单元的传输顺序必须符合 NAL单元解码顺序。通过Wireshark进行抓包,我们可以发现确实如此:
关于Single NAL Unit Packet、STAP-A和FU-A的概念,见《音视频入门基础:RTP专题(12)——RTP封装H.264时,视频的有效载荷结构》。
(四)提取出H.264裸流
通过Wireshark可以提取出摄像机RTP流中的H.264裸流,具体可以参考:《音视频入门基础:RTP专题(8)——使用Wireshark分析RTP》。