GB28181 也好,RTSP 也好,做企业级 AI 视频中台的人几乎每天都在和它们打交道。上半年我接手了一个园区 AI 分析平台,原本以为最大工作量会花在模型调优上,结果真正让人头疼的是把一批海康、宇视摄像头和第三方国标平台稳定接入。摸爬滚打几个月后,我最大的感受是:算法只解决“看见了什么”,接入层决定“能不能看见”。今天这篇文章就从 GB28181 与 RTSP 这两类协议出发,把企业级 AI 视频中台的全协议接入架构梳理清楚,主要面向正在做视频汇聚、AI 巡检或安防平台对接的研发同学。内容会比较偏实战,我会把我在中台项目中踩过的请求超时、语音对讲、H5 播放等问题一起复盘。
1. GB28181 和 RTSP 到底是什么关系:视频接入层的两种思维方式
1.1 从接入视角看 GB28181:设备是被平台管理的终端
做过安防对接的人都清楚,GB28181 设计的核心思路是“平台管理设备”。设备不是简单暴露一个地址等人来连接,而是主动向 SIP 服务器注册,然后接受平台的指令。平台想知道摄像头有几个通道、通道叫什么名字、当前是否在线,全部通过国标信令去问,设备再以固定格式报文返回。
这个思路对企业级 AI 视频中台非常重要。因为中台不只负责取流,还要管理设备生命周期。某台摄像头上线了,中台要能感知;某个通道状态变化了,中台要能更新;算法需要对某个通道发起实时分析,中台需要有能力告诉设备“现在开始往某个地址传视频”。这些能力都建立在信令控制之上,而不是简单拿一个 RTSP 串流就能搞定。
我看过不少 AI 项目把 GB28181 当“又一个取流工具”去对接,这是很大的误区。GB28181 是一套完整的会话控制流程,设备目录、通道状态、云台控制、报警上报、语音对讲都走信令。如果只实现到“能拉到视频”,后面接语音对讲或设备状态同步时,往往要从头改架构。
1.2 从接入视角看 RTSP:一条按需拉取的点对点通道
RTSP 的定位和 GB28181 完全不同。它更像“你给我一个地址,我去拉流”。网络上只要 IP 可达、端口可通、账号密码正确,拉流端就可以用 DESCRIBE、SETUP、PLAY 这套流程去建立媒体会话。它的优势是简单直接,调试成本低;劣势是协议设计上没有一个“设备注册中心”,拉流端必须事先知道每个摄像头的地址和凭证。
中台里大量摄像头来自海康、大华等厂商,它们的固件普遍支持 RTSP。很多项目在起步阶段都会直接用 RTSP 把摄像头的码流拉进分析服务,因为这对算法团队最友好:RTSP 拉流后经常能得到标准的 H.264/H.265 裸流,解码和推理链路很短。
但 RTSP 的简单也藏着一个隐患。设备被拉流时处于被动提供方角色,一旦拉流端进程重启或网络中断,设备不会主动告诉你“我已经断开了”。中台侧需要额外设计心跳检测、断线重连和会话回收策略。所谓全协议接入,不只是“会拉流”,而是要把 RTSP 连接当成有状态的长连接来管理。
1.3 用一张表看清两类协议在中台里的角色
做了几年视频中台后,我习惯把协议分成“信令控制面”和“媒体传输面”两个维度去比较。GB28181 和 RTSP 在这些维度上的区别非常明显。
| 对比项 | GB28181 | RTSP |
|---|---|---|
| 信令基础 | SIP 信令,报文格式固定 | RTSP 命令,文本协议 |
| 设备接入方式 | 设备主动注册到平台 | 平台主动连接设备地址 |
| 通道发现 | 通过目录查询拿到通道列表 | 依靠人工配置 URL |
| 媒体协商 | SDP 协商后设备向平台推流 | 拉流端发起协商后从设备拉流 |
| 会话状态 | 注册、心跳、资源目录可管理 | 只有会话建立/播放/断开 |
| 语音对讲 | 原生支持双向音频流程 | 规范未统一,依赖厂商私有行为 |
| 部署难度 | 中台需要构建 SIP 服务端 | 只要端口通就能拉流 |
| 适合场景 | 视频汇聚、跨域联网、政企项目 | 单点接入、快速验证、私有化场景 |
在企业级 AI 视频中台里,很少只选一种。我遇到的真实项目往往是:新园区摄像头走 RTSP 快速接入,存量或外网设备走 GB28181 国标平台接入,然后在中台内部统一成一个模型,最终给算法层提供同一份“视频帧”接口。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GB28181 接入拆解:中台侧要跑通注册、目录与 INVITE 点播
2.1 SIP 注册与心跳维护:在线状态不是一个布尔值
GB28181 的中台侧通常要扮演 SIP 服务端。摄像头或下级平台启动后会向设备编号配置的 SIP 服务器发送 REGISTER 报文,消息里带设备 ID、IP、端口、有效期等信息。服务端校验通过后返回 200 OK。很多刚接触国标的人看到中间出现 401 就以为失败,其实 401 是正常的挑战鉴权流程,客户端收到后要重新带摘要认证信息再发一次 REGISTER,得到 200 OK 才算真正在线。
注册之后不能认为万事大吉。国标设备还有一个 Keepalive 机制,设备会周期性发送心跳报文给 SIP 服务器,告诉平台“我还活着”。心跳间隔在设备侧配置,中台侧维护一个定时器,超过一定时间没收到心跳,就不能再把这个设备标记为在线。我建议不要把在线状态的判断只依赖心跳,可以同时叠加目录查询和按需点播的成功率来综合判断,避免设备处于“假在线”状态。
作为接入层架构,SIP 服务端最好维护一张设备状态表,里面至少包含几个字段:
- 设备国标编号;
- 注册地址与注册端口;
- 最后心跳时间;
- 点播会话编号与媒体收流地址;
- 通道列表快照;
- 认证状态与协议版本。
这张表是整个 GB28181 接入层的中枢。算法层不会去关心 SIP 报文,只通过这张表决定“哪些通道可以调度”。
2.2 目录查询的本质:拿到的是设备资源清单,不是视频地址
摄像头在 GB28181 里注册成功后,平台并不知道它有哪几个通道。中台要通过 MESSAGE 消息发送目录查询请求(CmdType 为 Catalog),设备或下层平台会返回 DeviceList,里面是所有通道的国标编码、名称、状态、经纬度等信息。
这里有两点容易踩坑。
第一,目录查询的响应可能不是同步的。平台发一条查询消息过去,有些设备要隔几百毫秒甚至更久才回消息。接入层必须有处理和匹配超时重传的机制,不能发一条消息就阻塞等结果。
第二,通道编码常常带行政区域信息,像 34020000001320000001 这种一长串数字,不能简单当成一个随机字符串。在部分项目中,通道编码被业务方直接当成摄像头主键使用,如果设备更换后编码不一致,历史数据关联就会乱。建议中台内部用一个自增 ID 或 UUID 作为主键,国标编码作为协议层标识,二者分离。
拿到通道列表之后,中台可以把通道信息同步到统一的设备资源池。后续算法任务或查看实时画面的请求,都通过这个资源池去找到对应的通道,再触发视频点播。
2.3 INVITE 点播与 SDP 协商:最容易翻车的一段
GB28181 真正点播时,平台会向设备发送 SIP INVITE 请求,消息体里携带 SDP,描述中台希望接收的媒体信息。设备收到 INVITE 后,如果同意,会回 200 OK,其 SDP 中也会带设备侧的媒体参数。平台再发送 ACK,设备开始向平台指定的媒体端口推 RTP 流。
看起来流程不复杂,但对接过的朋友应该都体会过这里面有多少细节。
SDP 里的 IP 地址不能填错。中台如果部署在 NAT 后面,给设备下发的媒体接收地址必须是设备真正能访问到的地址,否则 INVITE 流程已经成功,设备也回了 200 OK,但 RTP 包根本到不了中台。这类问题的典型表现就是信令正常、点播超时、抓包看不到媒体流。我在一个项目里排查了很久,最后发现 SDP 里填了内网服务器地址,而设备在下级平台局域网里根本访问不到。
常见媒体的封装也容易出问题。GB28181 的实时视频通常不是直接传裸编码流,而是走 PS 封装,RTP payload type 常见为 96。所以中台在接收媒体后,需要先做 PS 解封装,再去提取 H.264/H.265 或音频数据。如果直接把收到的 RTP 当裸 H.264 去解码,大概率只有花屏。
点播会话结束后,平台要主动发送 BYE 消息并等待 200 OK,否则设备的资源可能长时间被占用。高并发场景下,这种资源泄漏最终会导致可点播的通道数越来越少。
2.4 语音对讲为什么是对接中的另一个麻烦
现在很多企业在做视频中台时,都会把语音对讲当成一个标配需求,比如门卫看到陌生人在门口逗留,要喊话让对方离开。GB28181 本身支持这类型流程,平台侧向设备发起一个与视频方向相关的音频会话请求,然后双方交换 RTP 音频流。但实际落地时,它比单向取流麻烦很多。
首先是 SDP 方向问题。视频点播通常是平台侧只接收,SDP 里是 recvonly;而语音对讲要求平台同时发送和接收音频,SDP 方向要协商成 sendrecv。设备侧的音频编码一般是 G.711A/U 或 G.722,平台需要支持对应的音频编解码,否则传过去的语音对端根本解不出来。
其次是应答时序。对讲往往是在实时视频已经建立的基础上发起的,中台需要协调已有的视频会话和新建立的音频会话,不能把两套收流端口混在一起。我建议把语音对讲单独建模为一个独立会话对象,包含音频收流地址、音频发送地址、编码格式、对讲状态机,不要和视频点播共用一套状态字段,否则代码维护起来很崩溃。
GB28181 接入在架构上的核心工作量,不在于读懂一条 INVITE,而在于把所有信令交互做成一个可靠的、有状态的抽象层。这样当设备从几百台扩容到几千台时,接入层才不会成为瓶颈。
3. RTSP 接入拆解:URL 只是入口,会话状态机才是核心
3.1 从两种常见取流 URL 看设备兼容差异
RTSP 接入的第一步往往是拼 URL。海康和大华占据了相当大的摄像头市场份额,它们的取流地址格式几乎成了事实标准。
海康常用格式类似:
text复制rtsp://用户名:密码@设备IP:554/Streaming/Channels/101
其中 101 表示第一通道主码流。如果需要子码流,可能对应 102 或其他编号。很多摄像头同时支持多路码流,主码流清晰度高但码率大,适合 AI 分析;子码流适合预览或宽带宽受限场景。
大华常用格式类似:
text复制rtsp://用户名:密码@设备IP:554/cam/realmonitor?channel=1&subtype=0
后面参数中 channel 表示通道号,subtype 表示主码流或子码流,0 通常是主码流,1 是子码流。
除这两家外,还有很多设备走 ONVIF 标准,地址可能是 /onvif1 或 /media/video1,具体还是要从设备的能力描述文件里拿。真正做中台时,建议把 URL 的拼接规则做成一张驱动表,厂商、型号、URL 模板单独维护。这样即使以后新增一个品牌,也只是加一行驱动配置,不用改代码逻辑。
3.2 OPTIONS、DESCRIBE、SETUP、PLAY:每一步代表什么
RTSP 会话看起来就几个命令,但每个命令都有明确含义。
拉流端一般先发 OPTIONS,探测服务器支持哪些方法;然后发 DESCRIBE,请求得到 SDP 描述;接着按 SDP 里的媒体段发 SETUP,协商传输端口和传输方式;最后发 PLAY,告诉服务器开始推流。
实际项目中,很多设备不严格按标准回包。比如有些设备的 DESCRIBE 响应没有 Content-Base,或者 SETUP 返回的 Session 字段的大小写和预期不一致。如果拉流组件对协议细节要求太严,就会出现“用 VLC 能播、用自己代码拉不到流”的怪现象。
我的建议是接入层不要把 RTSP 客户端实现得过于理想化。要对几个版本差异做兼容:
- 支持 Basic 和 Digest 两种鉴权方式;
- 单个会话 URL 里可能带大写路径,应原样保存;
- SETUP 若响应中无端口号,则使用默认端口;
- PLAY 响应报文的 Session ID 必须与 SETUP 阶段一致;
- 支持 respond to 服务器主动发送的 RTP-Info 字段。
这些看起来都是边角料,但当你的中台每天要维持数百路 RTSP 连接时,任何一个兼容性小问题都会被放大。
3.3 传输模式选 TCP 还是 UDP:并发场景下的取舍
拉流时,RTSP 客户端在 SETUP 请求里要选择传输模式。常见的有 UDP 单播和 TCP。很多摄像头默认允许 UDP,但企业级中台建议优先使用 TCP,或至少提供 TCP 模式开关。
原因并不复杂。UDP 传输实时性高,但在跨三层网络、Wi-Fi 链路或高峰拥塞时丢包率会明显上升,容易产生花屏或卡顿。TCP 允许 RTP over RTSP,传输层重传能降低画面劣化概率。对 AI 分析来说,稳定帧比低延迟重要得多。
在大型接入架构中,还有一种隐藏风险:UDP 拉流会占用大量随机媒体端口,中间防火墙和安全设备很难提前放通。改为 TCP 后,所有媒体都复用已经建立的 RTSP 连接,端口管控要简单得多。
很多视频中台对实时性要求很高,比如车辆检测要求在几百毫秒内完成告警,这时 TCP 带来的延迟通常可接受,H.264 帧率在 25fps 时,TCP 引入的额外延迟往往在几十毫秒量级,不会对算法结果产生决定性影响。但如果项目要求极低延迟,又必须保证稳定,有一种方案是让摄像头通过 GB28181 主动推流到中台,这样网络路径更可控。
3.4 断流检测和任务调度:拉流不能只靠“祈祷网络良好”
RTSP 没有像国标那样标准的心跳机制。连接建立后如果设备端异常重启或网络断开,拉流端可能要等到下次读取数据时才感知到,甚至可能一直卡在读数据阻塞里。
接入层设计时,需要为每一路 RTSP 设置超时控制。常见做法是设置读超时时间,比如 10 到 30 秒内收不到任何 RTP 包就判定断流;网络断开后主动关闭连接,进入退避重连流程。重连时要注意退避策略,不能以毫秒级频率反复打设备,否则可能触发摄像头连接数限制,导致设备拒绝服务。
我还习惯把 RTSP 连接状态和视频分析任务状态对应起来。某一路流如果正在被 AI 算法分析,断流后不仅要重连,还要能保留分析任务的上下文。重连成功后,AI 引擎可以基于关键帧或重新拉取的画面继续分析,避免任务完全重启造成的业务真空。
4. 全协议接入架构的关键:设备抽象、信令控制与媒体通道解耦
4.1 先定义统一通道模型,再谈协议适配
做企业级 AI 视频中台,最忌讳的是把业务代码直接绑死在某一种协议上。今天你为 GB28181 写了一大堆处理逻辑,明天接 RTSP 又要复制一套,后天可能还要接 ONVIF,代码会越来越难以维护。
我建议整个接入层向上层只暴露一个“视频通道”抽象。通道的字段不必太复杂,核心是能表达来源协议、设备标识、通道标识、协议专用配置、当前在线状态、最近帧时间。
一个参考的通道配置结构长这样:
json复制{
"channelId": "channel_0001",
"deviceId": "device_0001",
"protocol": "gb28181",
"protocolConfig": {
"deviceGbId": "34020000001320000001",
"sipServerIp": "10.20.1.10",
"sipServerPort": 5060,
"streamMode": "udp"
},
"aiEnabled": true,
"status": "online",
"lastFrameAt": 1690000000000
}
如果接入的是 RTSP 设备,protocol 就改成 rtsp,protocolConfig 里放取流 URL、账号密码、传输模式。对上层算法服务来说,它只认 channelId,不需要知道底层到底是什么协议。
定义了统一模型之后,接入层还要提供统一的操作原语。无论 GB28181 还是 RTSP,最终都可以收敛为几个动作:
- 打开实时流;
- 关闭实时流;
- 查询通道状态;
- 发送控制指令(云台、对讲等)。
GB28181 的语音对讲和 RTSP 的私有音频实现在这层被抽象成同一个接口,上层再也不用关心是国标设备还是私有协议设备。
4.2 信令接完不代表能分析,媒体通道要单独设计
很多团队在做协议接入时,容易把信令和媒体混在一起看待。GB28181 的 SIP 信令接收、媒体收流、RTSP 拉流和解封装,全部塞到一个服务里。前期设备少时还能跑,设备规模上来后,HTTP 请求、媒体转发、AI 任务调度互相抢资源,故障定位也很麻烦。
稳妥的架构是信令控制与媒体处理独立部署。GB28181 的 SIP 服务可以单独起一个进程,负责注册、目录、点播信令;媒体服务器单独负责收 RTP、PS 解封装、转封装。RTSP 拉流也可以独立拆成拉流服务,把收到的流推到内部媒体总线上。
AI 分析模块不直接去和摄像头通信,而是从统一媒体队列里消费帧数据。这样一旦并发过高,只需要对媒体服务扩容,而不影响信令层的设备管理。
媒体处理链条在企业级中台里大致是这样的:摄像头或平台推流进入接入层,接入层进行协议解析和必要转封装,生成统一帧或统一码流,然后复制出多路分支,一路给实时预览,一路给 AI 分析,一路送到录制模块。每一路之间的流量和延迟可以通过内部组件隔离,避免一路录制卡顿拖垮实时分析。
4.3 从拉流到推流优先:中台规模增长的拐点
设备数量少时,“平台去拉流”这种模式完全够用。但设备规模增长到几千路、上万路时,让每路摄像头都被动等待平台拉取,会带来几个问题。
摄像头能承受的连接数是有限的。有些摄像头固件虽然标称支持多路并发,但每增加一路 RTSP,都会消耗设备端的编码和 IO 资源。中台算法要同时对一路摄像头跑几个不同类型的分析,比如人脸、安全帽、越界一起上,往往需要向摄像头建立多路取流,设备压力剧增。
这时就要考虑推流优先的设计。GB28181 天生就是推流模式,平台通过 INVITE 让设备把流转发给媒体服务器,媒体服务器可以做分发,一路流被复制给多个算法任务。RTSP 生态里也有类似做法,要么让设备主动通过 RTSP 推流到媒体服务器,要么在接入层做一个拉流网关,只从摄像头拉一路,再由网关内部向各业务分发。
拐点的出现时间没有固定标准。我自己的经验是,单一路数超过两百路,就需要认真规划网关分发能力;超过五百路,建议把信令服务、媒体服务、AI 分析服务拆到独立资源池,同时考虑 7×24 小时的可观测性监控。
5. 建立可复现的接入验证环境:抓包、模拟设备与流网关配置
5.1 GB28181 服务端环境怎么搭:WVP 与 ZLMediaKit 的组合
在项目正式开始对接真实摄像头之前,最好先搭一套本地可复现的 GB28181 信令和媒体环境。通信目标没法完全用软件模拟,但 WVP 加 ZLMediaKit 这套开源组合能帮你把平台侧的信令流程跑得很清楚。
WVP 负责 SIP 注册、目录管理、点播信令等业务逻辑,ZLMediaKit 负责 RTP 收流和转流。两者配合后,可以提供一个 Web 界面看到设备是否注册成功、通道是否在线、点播时是否成功生成 RTP 流。调试流程时,我通常先不接真实摄像头,而是用一个模拟 GB28181 设备的客户端去触发注册和点播流程,把信令报文完整打印出来。
模拟过程中重点看几个节点:
- SIP 设备是否回复 200 OK;
- Catalog 查询是否返回设备列表;
- INVITE 请求的 SDP 是否正确;
- 媒体是否开始在约定端口接收 RTP 包。
通过这种方式,可以把 GB28181 接入层的问题和真实网络环境中的问题分离开。如果模拟设备一切正常,但摄像头注册不上,问题基本就在设备配置或网络策略上。
5.2 用 mediamtx 把 RTSP 转成浏览器能播的协议
RTSP 本身无法被浏览器直接播放,这几乎是每个视频中台都要处理的问题。H5 页面不能原生解码 RTSP,常见方案是让 RTSP 流入媒体网关,转换为 HLS、WebRTC 或 HTTP-FLV,再由浏览器播放。
mediamtx 是一个很轻量的流媒体网关,配置也比较直观。它可以从某个 RTSP 地址拉流,然后在内部重新暴露为一个新的播放地址,并自动提供多种输出协议。一个简化的配置类似:
yaml复制paths:
camera1:
source: rtsp://用户:密码@192.168.1.64:554/Streaming/Channels/101
sourceProtocol: tcp
配置完成后,浏览器端可以通过 HLS 地址去播放 camera1 这个流。这种方式对 AI 中台的实时预览非常有用,因为算法框架可以自己以原始 RTSP 协议取流,前端预览走 HLS 或 WebRTC,两者互不干扰。
有一点要提醒,媒体网关转协议会引入一定延迟,HLS 的切片延迟通常在几秒。如果你的项目要求画面延迟低于 1 秒,WebRTC 会更好,但它涉及信令协商和端口规划,架构会更复杂。建议在项目早期就明确延迟指标,再决定采用什么协议。
5.3 请求超时问题的排查链路:一个真实复盘
GB28181 对接时最常见的异常就是“点播请求超时”。有一次项目方反馈,某几家摄像头 INVITE 之后迟迟看不到画面,我用抓包工具完整复盘了一遍,定位过程值得分享。
先看 SIP 信令路径。INVITE 发出后,设备很快就回复了 200 OK,说明信令层面没问题。但信令后面的媒体流完全没有出现。我在流媒体服务器上抓 RTP 包,发现设备主动向一个 192.168.1.x 的地址发包,而流媒体服务器实际部署在 10.1.2.x 网段。原因是 INVITE 请求里携带了 SDP,SDP 中的媒体接收地址是我在服务器配置里的默认网卡地址,设备侧无法访问这个内网地址,于是 RTP 包发去了一个黑洞。
这种问题排查起来并不难,但架构上必须提前避免。信令服务可能监听多个网卡,SDP 生成前要根据设备所在网络选择正确地址。如果中台部署在不同 VLAN,设备访问不到服务器时,需要做端口映射或源地址转换,确保设备能够把 RTP 报文发到接入网关可达的地址。
6. 我踩过几次坑后留下的七条接入经验
第一条,不要只按协议标准实现。无论是 GB28181 还是 RTSP,不同厂商对规范的理解不同。文档说“标准支持”,实际联调时总会出现细微字段差异。接入层所有协议字段尽量做成可配置,避免因为一个 header 大小写问题改动全局代码。
第二条,先做可观测性再做功能。视频接入层必须把每条信令报文、每个点播会话、每路流的启停时间记录下来。问题发生时没有日志,等于盲人摸象。我在 GB28181 服务端里专门加了信令详情日志,每次异常都能直接从日志里看到是哪一步失败。
第三条,设备连接数一定要有配额管理。中台同时拉取的路数要有上限,超过上限的连接请求要排队或拒绝。尤其是 RTSP,摄像头被过多连接后会变得极不稳定,反而影响所有分析任务。
第四条,语音对讲和视频点播的鉴权方式可能完全不同。很多设备在视频取流时只需要 RTSP 账号密码,但国标对讲要求走完整 SIP 信令通道且认证不能复用。如果一开始没有设计独立的对讲会话,后期补功能会非常痛苦。
第五条,时间同步是视频中台很容易忽视的功课。NTP 时间不同步会导致事件时间戳错乱,也会影响 GB28181 的信令会话超时判断、录像回放定位。中台侧所有节点必须统一时间源,摄像头也尽量配置为同一个 NTP 服务器。
第六条,流媒体缓冲区最好按业务分开。预览、录像、AI 分析三者的缓冲策略差异很大。AI 分析要尽量拿接近实时的帧,预览可以接受几百毫秒缓冲,而录像则更看重完整性和连续性。不要在接入层强行统一,不同的下游可以订阅不同的流属性。
第七条,不要追求多协议在一台设备上同时完美兼容。全协议接入指的是架构上的完备,不一定是每一路设备都用同一种方式。老旧的摄像头走 GB28181 效果不稳定时,只要能拿到 RTSP 地址,直接拉 RTSP 反而更省事。接入架构要做好随时混跑的准备,而不是和某一种协议死磕到底。
这些经验是从项目一个一个坑里攒出来的,也不一定适用于所有场景。但有一点我很确定:AI 视频中台的算法迭代很快,接入层反而需要更长时间来打磨。把 GB28181 和 RTSP 这两类协议的接入细节吃透,后续新增设备和扩展功能都会顺手很多。
