从 Wireshark 抓包文件中提取 GB28181 协议中的 RTP PS 负载,关键在于将 PS 流数据从RTP 的封装中“剥离”出来。由于 GB28181 可能使用被动模式传输媒体流,且 Wireshark 可能无法自动识别 TCP 承载的 RTP 包,需要手动引导 Wireshark 正确解析。下面的流程图梳理了核心操作路径:
下面一TCP为例(UDP也适用),介绍具体每一步的操作细节:
🔍 正确解析数据包
首先,确保 Wireshark 能够正确识别出 RTP 数据包。
- 识别流通道:在抓包文件中找到传输视频媒体的TCP 流。这通常可以通过筛选与 SIP 信令中
m=video行对应的端口号的 TCP 包来实现,例如使用过滤器tcp.port == 58026。
- 手动指定解码方式(关键步骤):如果 Wireshark 没有自动将 TCP 负载解析为 RTP 协议(例如,协议列仍显示为 TCP),你需要手动指定。
- 在 TCP 数据包上右键,选择“解码为…”(Decode As…)。
- 在弹出的对话框中,选择RTP协议。
- 点击OK。此时,该 TCP 流的数据包应被正确解析为 RTP 协议。
📂 导出 RTP 负载
当 RTP 包被正确识别后,就可以提取其负载了。
- 打开 RTP 流分析:在菜单栏依次点击电话 (Telephony)->RTP->RTP 流(RTP Streams)。这会列出所有识别出的 RTP 流。
- 选择并导出:在 RTP 流列表中选择你想要分析的视频流,然后点击右侧的“播放”(Play Streams) 按钮。在 RTP player窗口中,你会找到“Export”导出按钮。点击该按钮,将负载数据保存为一个二进制文件(例如
video.ps)。
💡 备选导出方法
这个备选方案不依赖于Wireshark能否自动识别RTP协议, 但是需要另外解析脚本以删除RTP header。目前还没有这个脚本
🔎 第一步:追踪TCP流
这个操作的目的是将你要分析的那个TCP连接的所有数据包,按照传输顺序重组为一个完整、连续的数据流。
- 定位数据包:可以通过SIP信令中协商的端口号使用显示过滤器(如
tcp.port == 6000)来缩小范围。 - 开启追踪:在该TCP数据包上右键,选择跟随→TCP 流。
- 确认流内容:此时会弹出一个新窗口,显示这个TCP连接的全部通信内容。
注意
- 右下角, 需要选择某个方向的流(192.168.1.128:29080 → 192.168.1.190:58026 (131 MB)),而不是“Entire conversation”.
- 显示格式下拉菜单。务必选择
原始数据
💾 第二步:保存为原始二进制数据
- 保存文件:点击另存为…按钮,将文件保存为一个二进制文件,例如
tcp_stream.raw。
🛠️ 第三步:从原始数据中提取RTP PS负载(核心步骤)
这是最关键的一步,因为保存下来的.raw文件是纯粹的TCP报文流,它可能包含TCP包头、以及可能发生的粘包/拆包情况。我们需要编写脚本或使用工具来解析它, 但是需要另外解析脚本以删除RTP header并分离出一个个独立的PS包,然后提取其中的PS负载。目前还没有这个脚本。