如何确定数据包是RTP/RTCP?
题
我正在使用基于WinPCAP构建的SharppCap来捕获UDP流量。我的最终目标是捕获H.323的音频数据,并将这些电话交谈保存为WAV文件。但是第一件事是第一件事 - 我需要弄清楚我的UDP数据包越过NIC。
SharppCap提供了一个UDPPACKET类,可让我访问消息的PayloadData。但是我不确定这些数据有什么关系。这是一个字节[]数组,我不知道该如何确定它是RTP或RTCP数据包。
我已经搜索了这个话题,但是那里没有太多。任何帮助都将受到赞赏。
解决方案
查看RTP和RTCP数据包的定义 RFC 3550:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
我不会为上述所有内容复制传说 - 它很长 - 但请看一下 第5.1节.
在手头上,您会发现没有很多事情可以确定是否 一种 数据包包含RTP/RTCP。最重要的是,正如其他海报所建议的那样,媒体流谈判。第二最好的是一系列数据包上的某种形式匹配:前两个位将为10,其次是恒定的两个位,其次是恒定的位,然后是9至15的位,然后是16-> 31增量,并且很快。
其他提示
我会查看Wireshark中的数据包检测器,该检测器可以解码可用的最常见协议。
我相信您需要查看RTP数据包之前的SIP数据包。
如果通过RTSP完成沟通,请查看设置时协商的UDP端口。
UDP端口将告诉您它是RTP还是RTCP(还值得注意的是,RTP通常是通过均匀端口号和奇数上的RTCP完成的)。
最后,如果您通过RTSP进行通信,则可以从描述中从SDP文件中获取有效负载号列表,然后检查RTP标头中的有效负载类型以告诉编解码器您需要解码有效负载。
不隶属于 StackOverflow