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版支持)
|