1. 项目概述从协议栈到数据包解码GB28181的PS流在安防监控、视频会议这些音视频实时传输的场景里我们经常听到GB28181这个协议。它就像一套行业内的“普通话”规定了摄像头、录像机、平台之间该如何“说话”才能互相听懂。但协议规范是纸面上的真正要理解数据是如何流动的尤其是承载音视频内容的MPEG2-PS流是如何被打包、传输的就必须深入到网络数据包层面。这就是为什么我们需要Wireshark它就像一个网络世界的“显微镜”和“翻译器”能把网络上流动的二进制比特流还原成我们能看懂的结构化信息。今天要聊的就是如何用Wireshark这把“手术刀”精准地解剖一个遵循GB28181协议传输的MPEG2-PS流。这不仅仅是抓个包那么简单而是要从纷繁复杂的网络报文中识别出SIP信令、RTP流最终定位并分析承载着H.264视频和G.711音频的PS包。对于刚接触音视频开发或安防协议的朋友来说这个过程能帮你建立起从协议栈到实际字节流的完整认知无论是排查流媒体无法播放、音画不同步还是深入理解封装格式都至关重要。我会结合一次实际的抓包分析过程带你走一遍完整的流程分享其中容易踩坑的细节和判断技巧。2. 核心原理与工具准备理解PS流在GB28181中的位置在动手抓包之前我们必须先理清几个关键概念和它们之间的关系否则面对Wireshark里成千上万个包很容易迷失方向。2.1 GB28181协议栈与传输层分工GB28181全称是《公共安全视频监控联网系统信息传输、交换、控制技术要求》它是一个庞大的体系。我们可以将其核心简化为两大块控制信令和媒体流。控制信令基于SIP会话初始协议和SDP会话描述协议。设备通过SIP进行注册、心跳、邀请Invite等操作。SDP则在Invite消息的正文中描述即将发送的媒体流信息比如使用什么编码H.264、什么封装PS、发送的IP和端口是多少。这部分协议运行在TCP或UDP之上确保信令的可靠或高效传输。媒体流即实际的音视频数据。GB28181规定媒体流通常采用RTP实时传输协议 overUDP的方式进行传输。RTP报文里携带了时间戳、序列号等对同步至关重要的信息而其负载Payload部分存放的就是经过封装的音视频数据。在国标中最常见的封装格式就是MPEG2-PS。所以数据流的方向是这样的设备A通过SIP信令携带SDP告诉设备B“我将用RTP在UDP端口1234上发送H.264视频和G.711音频它们被打包在MPEG2-PS格式里”。然后设备A就开始在指定的端口发送一串串的RTP包每个RTP包里装着一小段PS流数据。2.2 MPEG2-PS封装格式浅析MPEG2-PSProgram Stream节目流是一种容器格式你可以把它想象成一个“运输箱”。这个箱子的设计初衷是为了在相对可靠的介质如文件、DVD上存储多媒体节目但它也被广泛应用于广电和安防领域的流传输。结构单元PS流由一系列PES包组成。PESPacketized Elementary Stream包是对原始音视频基本流ES进行的一次封装加上了流ID、时间戳等信息。一个视频PES包包含若干帧如一个GOP一个音频PES包包含若干音频帧。PS头在PS流的开头和关键位置会有PS头里面包含了系统时钟参考SCR、复用速率等信息用于整个节目的同步。在RTP中的承载一个完整的PS流通常会被切割成多个片段分别装入多个RTP包中发送。因此在Wireshark中看到一个RTP包它的负载可能只是一个PS流的中间片段我们需要根据RTP的序列号、时间戳以及PS流本身的起始码来重组和理解它。2.3 Wireshark与关键插件准备Wireshark是分析这一切的基石。除了基本安装针对GB28181和PS流分析有几点特别准备安装完整确保从官网下载安装最新稳定版安装时勾选所有组件特别是NpcapWindows平台推荐或libpcap这是抓包的核心驱动。解码能力Wireshark默认支持RTP、H.264等常见协议的解码。但对于MPEG2-PS的深度解析可能需要验证。你可以通过抓取一个已知的PS流文件如.ts或.mpg文件的网络回放查看Wireshark是否能正确解析出MP2TMPEG-2 Transport Stream或相关协议。PS流解析有时内置于对RTP负载的分析中。过滤是关键面对海量数据过滤表达式是你的“指挥棒”。最常用的包括sip只看SIP信令包。rtp只看RTP流。udp.port 5060SIP默认端口。ip.addr x.x.x.x针对特定设备IP。组合过滤sip ip.addr192.168.1.100或rtp udp.port30000媒体流端口通常较高。注意在安防生产环境抓包务必提前获得授权并选择正确的网络接口通常是连接摄像头或视频平台服务器的网卡。如果设备间有交换机可能需要配置端口镜像SPAN才能抓到目标流量。3. 实操演练一步步解剖GB28181 PS流下面我们模拟一次从设备发起Invite到接收媒体流的完整抓包分析过程。假设设备IP是192.168.1.100平台IP是192.168.1.1。3.1 阶段一捕获并筛选会话建立信令首先在Wireshark开始抓包然后触发设备向平台发起视频点播Invite。抓包一段时间后停止。定位SIP Invite请求在过滤栏输入sip and ip.addr192.168.1.100。你应该能看到INVITE、100 Trying、200 OK、ACK等SIP消息。双击打开一条INVITE请求。解析SDP媒体描述在Wireshark下方面板层层展开SIP协议详情找到Message Body其类型通常是application/sdp。展开SDP部分这是黄金信息区m行mvideo 6000 RTP/AVP 96这行表示视频流使用RTP/AVP框架端口是6000负载类型Payload Type是96。a行关键信息所在。artpmap:96 PS/90000这明确指出了负载类型96对应的是MPEG2-PS封装时钟频率为90000 Hz。这是识别PS流的最直接证据。afmtp:96 profile-level-id...; packetization-mode...; sprop-parameter-sets...如果编码是H.264这里会有具体的编码参数集SPS, PPS它们对于后续解码至关重要有时也会被封装在PS流的开头。对于音频可能会有类似artpmap:8 PCMA/8000表示G.711 A律音频。记下视频流的目标IP、端口6000和负载类型96。平台在200 OK响应中也会携带SDP其m行中的端口是平台接收媒体流的端口但媒体流发送方向以Invite请求中的SDP描述为准即设备发往平台的端口。3.2 阶段二定位并跟踪RTP媒体流拿到媒体流端口后我们就可以聚焦分析真正的音视频数据了。应用RTP流过滤在过滤栏输入rtp udp.port6000。此时列表应该主要显示一系列UDP包协议显示为RTP。如果显示为UDP可能需要右键包 -Decode As...- 在Current列选择RTP强制Wireshark将其解码为RTP。验证RTP流信息选中一个RTP包查看详情面板。你应该能看到RTP协议头包含SSRC同步源标识标识流、Sequence number序列号应连续递增、Timestamp时间戳基于时钟频率递增视频通常是90000 Hz。Payload负载类型Payload type应为96与我们SDP中定义的一致。负载部分在Wireshark中可能显示为一串十六进制代码这就是PS流数据片段。同步与流重组可选但重要Wireshark提供了强大的RTP流分析功能。点击Telephony-RTP-RTP Streams。在弹出的窗口中你会看到所有识别出的RTP流列表检查SSRC、端口、Payload类型是否匹配。选中我们的流点击Analyze。这个分析窗口非常有用序列号图可以直观看到是否有丢包序列号出现跳跃。时间戳图检查时间戳增长是否平稳判断发送是否均匀。播放流你可以点击Play Streams或Save Payload将RTP负载保存为.ps或.264等格式文件然后用VLC等播放器尝试播放这是验证流是否正确的终极手段。3.3 阶段三深度解析PS流负载内容现在我们深入到单个RTP包内部看PS流数据。查看负载十六进制在RTP包详情面板展开Payload通常以十六进制形式显示。MPEG2-PS流有固定的起始码Start Code。常见的起始码是0x000001BAPS包头和0x000001E0视频PES包。你在负载的开头或附近寻找这些特征字节。尝试PS解析Wireshark对PS的解析可能不是默认开启的。如果负载直接显示为MPEG2-PS或PES那最好。如果只显示为Data我们可以尝试手动分析。一个典型的PS包片段在RTP中的结构可能是[RTP头] [PS包片段数据]。由于RTP的MTU限制通常约1500字节一个大的PS包或PES包会被分片到多个RTP中发送。识别关键起始码0x000001BA标志一个PS包PS pack的开始后面跟着SCR系统时钟参考和复用速率。在流开始时非常重要。0x000001E0通常指示一个视频PES包Stream ID 0xE0。0x000001C0通常指示一个音频PES包Stream ID 0xC0。0x000001B3MPEG视频序列头。0x00000100到0x0000011FH.264的NAL单元如果视频是H.264。注意H.264 NAL单元在PS封装中是作为PES包的负载存在的。所以你可能先看到0x000001E0视频PES头然后在其负载里找到0x000001或0x000001作为NAL单元起始。实操心得在实际抓包中你很少能在单个RTP负载的开头就看到完美的0x000001BA因为分片的原因。更常见的是看到0x000001E0或0x000001。这时你需要结合**RTP的标记位Marker Bit**来判断。在RTP头中Marker位M如果被设为1通常表示这个RTP包承载的是当前负载类型如图像帧的最后一个包。对于分片的PS/PES包最后一个分片的Marker位可能为1。但这不是绝对标准GB28181的实现可能有差异需要结合具体数据判断。4. 常见问题排查与实战技巧理论结合实践下面是一些在分析过程中必然会遇到或需要关注的问题点。4.1 问题一Wireshark无法识别RTP协议只显示UDP这是最常见的问题。原因是Wireshark根据端口和负载内容进行启发式判断有时会失败。解决方案确认SDP中的artpmap属性是否正确指定了PS。在包列表栏右键任意一个目标UDP包 -Decode As...。在弹出的窗口中在Current列找到对应的UDP端口行点击右侧的下拉箭头选择RTP。点击OK。此时该端口的所有UDP流量都会被尝试解码为RTP。如果负载确实是RTP格式协议列就会变为RTP。4.2 问题二抓到的RTP流播放异常花屏、卡顿、无声音这通常指向媒体流本身或网络传输的问题。排查步骤检查RTP序列号在RTP Streams分析窗口中查看序列号图。如果出现大面积空白或跳跃说明存在严重丢包。丢包是花屏、卡顿的首要元凶。需要检查网络状况。检查RTP时间戳时间戳增长应相对均匀。如果时间戳长时间不变或跳跃异常可能发送端有问题。检查负载类型确认所有RTP包的Payload Type是否一致都是96。如果不一致说明流标识混乱。保存负载分析在RTP Streams窗口选中流点击Save Payload保存为.ps文件。尝试用VLC播放。如果VLC也无法播放基本确定是发送端生成的PS流有问题或者关键帧SPS/PPS信息缺失。GB28181要求SPS/PPS应在流开始或关键帧之前发送有时这些信息通过SDP的fmtp属性传递有时则封装在PS流的第一个视频PES包中。你需要检查SDP和最初的几个RTP包确认H.264的参数集是否存在且正确。4.3 问题三如何判断PS流中包含了音频和视频在单个RTP包负载的十六进制数据里你需要寻找不同的PES包起始码。方法在过滤出的RTP流中随机多打开几个包的负载详情搜索十六进制值000001C0音频和000001E0视频。如果都能找到说明是音视频复用的PS流。你也可以通过Telephony-RTP-RTP Streams查看如果同一个目的IP和端口出现了两个不同的SSRC且Payload类型不同例如96和8那很可能就是独立的音频流和视频流这不符合典型的PS复用方式需要检查设备配置。4.4 问题四网络流量太大如何精准抓取目标流在生产环境背景流量可能干扰分析。高级过滤技巧抓包时过滤在Wireshark开始抓包前在捕获过滤器中输入host 192.168.1.100 and host 192.168.1.1只抓取这两个IP之间的所有流量。显示时过滤结合SIP信息。先找到Invite包的帧编号比如是帧#100。该Invite的SIP消息头中会有一个唯一的Call-ID字段例如Call-ID: 123456192.168.1.100。然后你可以用显示过滤器sip.Call-ID 123456192.168.1.100来过滤出与此会话相关的所有SIP信令。对于媒体流则需要结合之前找到的端口号过滤。4.5 实战技巧使用跟踪流功能还原会话Wireshark的“跟踪流”功能能帮你把一次会话的TCP/UDP报文重组便于阅读。在SIPINVITE请求包上右键 -Follow-TCP Stream或UDP Stream取决于SIP用的传输层。弹出的窗口会以文本形式显示这次TCP/UDP连接中的所有数据你可以清晰地看到SIP信令的来回交互INVITE、200 OK、ACK以及其中包含的SDP正文。这对于理解整个会话建立过程非常直观。同样你可以在一个RTP包上右键 -Follow-UDP Stream但这通常显示的是二进制数据不如RTP Streams分析窗口直观。5. 进阶分析从PS流中提取H.264裸流对于开发或深度调试有时我们需要将网络中的PS流还原成H.264基本流ES文件。保存RTP负载如前所述在RTP Streams分析窗口选中目标视频流点击Save Payload格式选择“Raw”。保存为video.ps。使用FFmpeg解封装FFmpeg是处理音视频的瑞士军刀。打开命令行执行ffmpeg -i video.ps -vcodec copy -an output.h264-i video.ps: 指定输入文件。-vcodec copy: 视频流直接复制不重新编码。-an: 丢弃音频流因为我们只提取视频。output.h264: 输出H.264裸流文件。验证与播放得到的output.h264文件可以使用专门的分析工具如Elecard StreamEye、CodecVisa查看其结构SPS, PPS, I/P/B帧也可以用FFplay播放ffplay output.h264。如果播放正常证明从网络抓取到PS流提取的过程是完全正确的。注意事项这种方法成功的前提是抓取的RTP负载是完整的、可正确重组的PS流片段。如果网络丢包严重保存的.ps文件本身可能已损坏FFmpeg会报错。此时需要先解决网络丢包问题或者尝试只保存丢包较少的一段流进行分析。整个分析过程从信令握手到媒体流解析就像完成一次完整的侦探工作。Wireshark提供了所有线索数据包而你对GB28181和MPEG2-PS协议的理解则是拼出完整真相的地图。刚开始可能会觉得复杂但按照这个流程多操作几次尤其是结合具体的排错需求你会越来越熟练最终能够快速定位是信令问题、网络问题还是设备生成的码流问题。