GB28181教程——点播回放

把 INVITE + SDP + SSRC + 倍速 + TCP/UDP 一次讲透

读完这篇,你立刻就能:

  • 手写一个能点播、能 16 倍速、能切 TCP/UDP 的完美 INVITE
  • 看懂海康、大华、宇视任意厂家的 SDP
  • 解决 95% 的“点播黑屏”“只有声音没图像”“卡顿”问题

流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
客户端/平台                                 设备/下级平台
│ │
│ 1. INVITE(带 SDP Offer) │
│──────────────────────────────────────────►│
│ │
│ 2. 100 Trying │
│◄──────────────────────────────────────────│
│ │
│ 3. 200 OK(带 SDP Answer) │
│◄──────────────────────────────────────────│
│ │
│ 4. ACK │
│──────────────────────────────────────────►│
│ │
│◄◄◄◄◄◄◄ RTP/PS 流开始推送 ◄◄◄◄◄◄◄◄◄◄◄◄◄◄◄◄◄◄◄│

1. 实时点播(直播)完整 INVITE 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
INVITE sip:34020000001310000001@3402000000 SIP/2.0
Via: SIP/2.0/TCP 192.168.1.200:5060;branch=z9hG4bK7744143
From: <sip:34020000002000000001@3402000000>;tag=123456
To: <sip:34020000001310000001@3402000000>
Call-ID: 987654321@192.168.1.200
CSeq: 1 INVITE
Contact: <sip:34020000002000000001@192.168.1.200:5060>
Max-Forwards: 70
Subject: 34020000001310000001:0100,34020000001100000001:00001234
Content-Type: application/sdp
Content-Length: 312

v=0
o=34020000001310000001 0 0 IN IP4 192.168.1.100
s=Play
u=34020000001310000001:0100
c=IN IP4 192.168.1.100
t=0 0
m=video 10000 TCP/RTP/AVP 96
a=recvonly
a=rtpmap:96 PS/90000
y=0100001234 ← SSRC(10位十进制)
f=v/2/25/a/1/0/0 ← 视频参数(后面详细拆)

2. SDP 字段逐行拆解

含义 国标常见值 / 必填说明
o= 会话拥有者 o=通道ID 0 0 IN IP4 设备IP
s= 会话名称 s=Play 或 s=Playback
c= 媒体IP c=IN IP4 设备IP(发流IP)
m= 媒体描述 m=video 端口 TCP/RTP/AVP 96(端口写实际或0,TCP时可忽略)
a=recvonly 只收不发 必须有
a=rtpmap:96 PS/90000 负载类型96代表 PS 流,时钟90000 固定写法
y= SSRC(10位十进制) y=0100001234(和 Subject 里后半段一致!)
f= 视频参数(国标最恶心的一行) f=v/2/25/a/1/0/0 (后面单独拆)

3. Subject 行

格式:通道ID:SSRC,设备ID:SSRC

1
Subject: 34020000001310000001:0100,34020000001100000001:00001234
  • 前半段:通道ID:0100 → 0100 是流标识(0100=主码流,0200=子码流)
  • 后半段:设备ID:00001234 → 00001234 就是 y= 字段的 10 位 SSRC

4. y=字段(SSRC,10 位十进制)

  • 实时点播:y=0100001234(随便填,但全局唯一,建议设备ID后8位+2位序号)
  • 历史回放:y=0500001234(必须以 05 开头!公安检测会校验)

5. f=字段(视频参数)完整拆解

格式:f=v/编码方式/帧率/a/音频编码/采样率/通道数/…

位置 含义 常见值
v/ 视频编码 1=H.264, 2=H.265, 3=SVAC, 4=AVS
/25 帧率(fps) 25、30、15 等
/a/ 音频编码 1=G.711μ, 2=G.711A, 3=G.722.1, 4=MPEG2, 5=G.726
/1 音频采样率(kHz) 8、16、32、48
/0 是否有音频 0=无 1=有
/0 其他扩展 一般填0

常见组合:

  • 纯视频:f=v/2/25/a/1/0/0 → H.265 25 帧 无音频
  • 带音频:f=v/1/25/a/1/8/1 → H.264 25 帧 + G.711μ 8kHz

6. TCP vs UDP 模式切换

模式 m= 行写法 实际收流方式
TCP 主动模式 m=video 0 TCP/RTP/AVP 96 平台主动从 TCP 流里解析 RTP
TCP 被动模式 m=video 58216 TCP/RTP/AVP 96 平台连设备端口收流
UDP 模式 m=video 58216 RTP/AVP 96 传统 UDP RTP(不推荐,穿透差)

2025 年 99.9% 项目强制 TCP 主动模式,直接写 m=video 0 TCP/RTP/AVP 96

6. 历史回放 vs 实时点播区别(只差两点)

项目 实时点播 历史回放(回放/下载)
SIP URI sip:通道ID@域 sip:通道ID@域
Subject 通道ID:0100,… 通道ID:0500,…(SSRC 必须05开头)
t= 时间段 t=0 0(直播) t=1735689600 1735693200(Unix时间戳)
y= SSRC 01 开头 05 开头
PlaySpeed 不填或 1.0 2.0=2倍速, 0.5=半速, -2=倒放2倍速

历史回放 INVITE 示例(关键部分):

1
2
3
Subject: 34020000001310000001:0500,34020000001100000001:00005678
t=1735689600 1735693200
y=0500005678

7. 倍速控制(PlaySpeed 参数,在 INVITE 里加一行)

1
2
3
a=streamprofile: PlaySpeed=2.00   ← 2 倍速
a=streamprofile: PlaySpeed=0.50 ← 半速
a=streamprofile: PlaySpeed=-4.00 ← 倒放 4 倍速(2022版支持)