SDP 详解:国标(GB/T 28181)字段、收发差异与代码对照
本文详细说明 SDP(Session Description Protocol) 在 SIP 信令 + 国标监控里怎么用:
捋清楚谁发、谁收;字段值在发送方 SDP 与对端 SDP 中的分工是理解 recvonly / sendonly、TCP setup、y=(SSRC) 的关键。
结合项目代码实现(core/pkg/sdp、GBSSender.VideoLiveInvite、makeInviteSDPResp、gbs_proc/send_sip_proc.go 中 VideoLiveInvite / talkInvite 对 200 OK 的 ParseString)。
文档参考: GBT+28181-2016(扫描版-带目录).pdf
一、SDP 放在哪?谁是「发送方 SDP」?
在 SIP + 国标 场景里,媒体能力主要通过 Content-Type: application/sdp 的消息体携带。
| 消息 | 典型谁发 | SDP 语义 |
|---|---|---|
| INVITE 请求体 | 平台(信令服务器) | 「我希望建立的媒体会话长什么样」:往哪连、要不要 RTP、.payload 用啥、SSRC 规则等。对视频点播,平台往往写 自己侧的连接信息(常为 MS 地址) 和 a=recvonly(表示「我这端接收媒体」→ 设备负责发)。 |
| 200 OK 应答体 | 设备(或下级平台) | 「我同意并按以下方式发媒体」:真正用于 RTP 的 IP/端口、最终 payload、a=sendonly(我发)、TCP 时 setup:active 等。 |
| ACK | 一般不再携带 SDP | 确认会话,媒体按 200 OK 里约定建立。 |
因此:同一字段名(如 o=、c=、a=)在 INVITE 与 200 OK 里都出现,但描述的是「各自这一侧的会话描述」,数值不必相同——对端会选一套可协商结果(尤其是 m= 端口、编码、TCP 主动/被动)。
注意:
Subject、Contact、Via等是 SIP 头,不是 SDP 行;它们和 SDP 一起描述一次呼叫,但别混到v=/o=里。
Subject 非常重要,放在 第二节 专门写。
二、SIP 头 Subject
国标里常见:
Subject: <发送端媒体标识>:<流序号等>,<接收端设备编码>:<ssrc>
- 前半段通常对应 被点播的通道/媒体源 及 平台侧约定的流序号相关字段。
- 后半段是 平台(信令服务器)编码 与 SSRC 占位(实时点播常见
:0,回放/下载可能带具体 ssrc 串)。
Subject: 34020000001320000105:0200000105,31010000042220000002:0
- 通道 34020000001320000105,中间 0200000105 与 SDP 里
y=常对应同一套 SSRC 规划。 - 31010000042220000002 为平台 ID,
:0表示实时流时平台侧占位。
仓库代码(core/app/sev/vss/internal/pkg/sip/gbs_send.go VideoLiveInvite):
- 实时流:
fmt.Sprintf("%s:%d%s,%s:0", ChannelUniqueId, playFlag, ssrc, Sip.ID) - 回放且带下载等场景:后半段也会带上 ssrc 串,与国标「接收端 ssrc」一致。
三、国标要求的 SDP 行总览(RFC 2327/4566 + 国标附录)
下面按 行类型 说明。平台 INVITE 与 设备 200 OK各写一栏,便于对比 字段值的收发差异。
v=(协议版本)
| 说明 | |
|---|---|
v=0 | SDP 版本,固定为 0。 |
发送方 / 接收方:双方都是 0,无方向差异。
o=(Origin:会话所有者标识)
格式:o=<用户名> <会话ID> <版本> <网络类型> <地址类型> <地址>
例:o=34020000001320000105 0 0 IN IP4 192.168.50.87
| 字段 | 说明 |
|---|---|
| 用户名 | 常填 20 位 ID:平台侧 INVITE 里常见填 通道 ID;设备 200 OK 里常见填 设备 ID(通道 34020000001320000105、设备 34020000001320000104)。 |
| 会话 ID / 版本 | 国标示例里常见 0 0 或设备侧 非 0 成对数字(如 1578 1578),用于会话一致性。 |
| IN IP4 + 地址 | 本条 SDP 所描述端的「控制面/会话所属」地址:平台 INVITE 常为 信令服务器或 MS 的 IP;设备 200 OK 为 设备 IP。 |
收发差异:
- INVITE 的
o=:「这次会话(信令服务器)用哪个 ID、挂哪个 IP 做会话原点」。 - 200 OK 的
o=:「设备用哪个 ID、挂哪个 IP 做会话原点」。
两者各自标识自己。
代码:VideoLiveInvite 里 Origin.Username = data.ChannelUniqueId,Address = data.MediaServerIP(平台侧作为会话连接描述的中心IP)。
s=(业务类型)
国标:Play / Playback / Download / Talk 等,表示 请求媒体类型。
| 取值 | 说明 |
|---|---|
Play | 实时流 |
Playback | 回放 |
Download | 文件下载(配合 a=downloadspeed、a=filesize) |
Talk | 实时语音对讲 |
收发差异:
- INVITE 由平台写「需要什么业务」;200 OK 里设备常 沿用相同 s=,表示接受同类会话。
代码:直播/预览时 Name 来自 Capitalize(PlayType)(如 Play);回放时强制 sdpInfo.Name = "Playback";下载再改为 "Download"。
u=(URI)
国标:媒体文件定位:简写 设备ID:参数... 或 HTTP URL。
收发差异:多在 平台 INVITE 中带;设备端可省略或回显。告诉对端「若与文件/通道强绑定,资源键是啥」。
代码:URI: fmt.Sprintf("%s:0", data.ChannelUniqueId)。
i=(会话信息)
Information 会话详细信息。
c=(连接信息)
格式:c=<网络类型> <地址类型> <地址>,例:c=IN IP4 192.168.50.87
RTP(或 TCP 承载 RTP)应发往/来自的网络地址。
收发差异:
- 平台 INVITE:常为 公网/内网 IP(媒体在 MS 与设备之间落地,平台 SDP 描述的是 MS 这一侧的监听/连接点 与后续 INVITE 里 m= 端口 一致)。
- 设备 200 OK:为 设备侧 IP,
m=端口 为设备 实际发流或监听 的端口。
平台 c= 与 o= 同为 192.168.50.87;设备 c= 为 192.168.50.104,与 m=video 15060 一致。
会话级 Connection.Address = data.MediaServerIP。
t=(时间)
| 取值 | 说明 |
|---|---|
t=0 0 | 实时流:不限制起止(RFC)。 |
t=<start> <stop> | 回放/下载:UNIX 秒级时间戳(国标),录像片段的区间。 |
收发差异:INVITE 由平台写区间;200 OK 常 0 0 或简写,取决于实现;真正回放区间以平台 INVITE 为准。
代码:encoder.timing 对零值输出 0 0;回放时 Timing.Start/Stop 用本地解析后的 time.Time,编码为 Unix 秒(见 core/pkg/sdp/encoder.go time.Unix())。
m=(媒体描述)
格式:m=<媒体类型> <端口>[/<端口数>] <协议> <payload列表>
| 子项 | 说明 |
|---|---|
| 媒体类型 | video / audio |
| 端口 | 本 SDP 描述端的 RTP(或 RTCP)端口;TCP 模式下也常表示 本端在该端口上监听或期望连接(具体结合 setup) |
| 协议 | RTP/AVP = RTP over UDP;TCP/RTP/AVP = RTP over TCP(GB28181 常见) |
| payload | 列举支持的 PT,如 96 97 98 99 |
收发差异:
- 平台 INVITE:列出 MS 侧 为接流准备的 端口(
30515)和 本端编码列表。 - 设备 200 OK:给出 设备侧 最终端口(
15060)和 设备选中的 payload(96 PS)。
「发送方 / 接收方」:不是「谁发 SIP 谁就是媒体发送方」;要看 a=sendonly/recvonly 描述的是「谁发 RTP 媒体」。平台 INVITE 用 recvonly = 平台(MS)收,设备发。
代码(平台 INVITE):Port: data.StreamPort,Proto 在 MediaProtocolMode==1 时为 TCP/RTP/AVP,否则 RTP/AVP;Formats 含 PS/MPEG4/H264/H265。
a=(属性)
- 通用 RTP:
a=rtpmap:<pt> <编码名>/<时钟> - 方向:
a=recvonly|sendonly|sendrecv|inactive - 国标 TCP:
a=setup:active|passive、a=connection:new - 国标扩展:
a=downloadspeed:、a=filesize:、a=svcspace:等。
a=recvonly / a=sendonly ❗
| 出现在哪一方的 SDP | 说明 |
|---|---|
平台 INVITE:recvonly | 「当前这一路只接收 RTP」→ 对端(设备)应发送 媒体到我们给出的 IP/端口(MS)。 |
设备 200 OK:sendonly | 「当前这一路只发送 RTP」→ 设备出站 到协商好的对端。 |
常见组合:平台 recvonly + 设备 sendonly = 单工单向下行视频(预览/回放设备→平台)。
平台 recvonly,设备 sendonly。
代码(平台侧 INVITE):Mode: sdp.ModeRecvOnly → 编码为 a=recvonly。
a=rtpmap:96 PS/90000
| 说明 | |
|---|---|
| 96 | payload type(动态 PT,需在 m= 列出) |
| PS | MPEG-PS 封装(国标常见) |
| 90000 | RTP 时钟频率(视频常用 90000) |
收发差异:INVITE 可列 多个 rtpmap;200 OK 常 收敛到实际选用的一种。
a=setup: / a=connection:(TCP RTP)
| 值 | 说明 |
|---|---|
| passive | 「当前方被动监听,请接收方 主动连 当前方」(类似 TCP server)。 |
| active | 「当前方主动去连 接收方的被动端口」(类似 TCP client)。 |
| connection:new | 使用 新 TCP 连接 传 RTP(国标建议可固定 new)。 |
- 平台 INVITE:
setup:passive→ MS(或平台侧媒体点)建好监听,等设备来连。 - 设备 200 OK:
setup:active→ 设备 主动发起 TCP 连接对端。
二者 配对:一边 passive、一边 active,TCP 才能建起来。
代码:平台在 TCP 模式下 setup 取自 data.TransportProtocol.MediaTransMode(与配置一致),connection:new 固定。
a=downloadspeed / a=filesize
- downloadspeed:下载倍速(整型)。
- filesize:下载文件大小(Byte),设备可在 200 OK 带回
a=filesize:0表示未知或占位。
代码:下载场景 Name=Download 且可追加 downloadspeed(data.Speed)。
厂商扩展 rtpmap
如 a=rtpmap:96 DAHUA/90000:表示非标准厂商流;标准 PS/H264 一般不需要。
y=(SSRC,国标扩展行,非 RFC 必选项)
格式:十进制字符串,国标对各位段位有定义(首位 0 实时 / 1 历史,后段与 域编号、域内序号 相关)。
域内典型流程:
- 平台在 INVITE SDP 里带
y=(与Subject、流序号一致规划)。 - 设备在 200 OK 里回显同一
y=(与 INVITE 一致)。 - 设备发出的 RTP 包头 SSRC 使用该值(或约定映射),便于 MS/平台 区分流。
发送方 / 接收方:名字都叫 y=,但 INVITE 由平台「提议」;200 OK 由设备「确认」 y=0200000105 两边一致,即 协商一致。
代码(平台 INVITE):SSRC: fmt.Sprintf("%d%s", playFlag, ssrc)
- 实时
playFlag=0,ssrc由 通道 ID 截取拼接。 - 回放
playFlag=1,ssrc用 自增计数器(避免冲突)。
f=(媒体描述扩展,国标)
固定结构:f=v/编码/分辨率/帧率/码率类型/码率 a/音频编码/码率/采样率(「v/////」「a///」)。
把 视频档次、音频参数 压缩进一行,设备可按 f= 选码流。
代码:对讲应答 makeInviteSDPResp 使用常量 SDPMediaDescription_1(types.go:v/////a/1/8/1)作为 Media.Description,编码器输出 f= 行。
视频/音频各分项的国标取值码表 见文末 附录 A。
四、信令逐行对照
信令服务器发送至设备
[GBS] 2026-03-17 00:01:26 [UDP][192.168.50.87:11008]>>>>>>[192.168.50.104:5060]>>>>>>
INVITE sip:34020000001320000105@192.168.50.104:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.50.87:11008;rport=11008;branch=z9hG4bK4376380519
From: <sip:31010000042220000002@192.168.50.87:11008>;tag=351414583
To: <sip:34020000001320000105@192.168.50.104:5060>
Call-ID: 3903197993
User-Agent: SkeyevssSevVss 192.168.50.87
CSeq: 3607 INVITE
Max-Forwards: 70
Content-Type: APPLICATION/SDP
Contact: <sip:31010000042220000002@192.168.50.87:11008>
Subject: 34020000001320000105:0200000105,31010000042220000002:0
Content-Length: 314
v=0
o=34020000001320000105 0 0 IN IP4 192.168.50.87
s=Play
u=34020000001320000105:0
c=IN IP4 192.168.50.87
t=0 0
m=video 30515 TCP/RTP/AVP 96 97 98 99
a=recvonly
a=rtpmap:96 PS/90000
a=rtpmap:97 MPEG4/90000
a=rtpmap:98 H264/90000
a=rtpmap:99 H265/90000
a=setup:passive
a=connection:new
y=0200000105
设备响应信令服务器
[GBS] 2026-03-17 00:01:26 [UDP][192.168.50.87:11008]<<<<<<[192.168.50.104:5060]<<<<<<
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.50.87:11008;rport=11008;branch=z9hG4bK4376380519
From: <sip:31010000042220000002@192.168.50.87:11008>;tag=351414583
To: <sip:34020000001320000105@192.168.50.104:5060>;tag=2046511126
Call-ID: 3903197993
CSeq: 3607 INVITE
Contact: <sip:34020000001320000104@192.168.50.104:5060>
Content-Type: application/sdp
User-Agent: IP Camera
Content-Length: 209
v=0
o=34020000001320000104 1578 1578 IN IP4 192.168.50.104
s=Play
c=IN IP4 192.168.50.104
t=0 0
m=video 15060 TCP/RTP/AVP 96
a=setup:active
a=sendonly
a=rtpmap:96 PS/90000
a=filesize:0
y=0200000105
平台 INVITE
| 说明 | |
|---|---|
o=34020000001320000105 ... 192.168.50.87 | 会话用户名用 通道 ID,地址用 平台/MS 侧 IP。 |
s=Play | 实时预览。 |
u=34020000001320000105:0 | 简写 URI:通道 + 参数。 |
c=IN IP4 192.168.50.87 | 会话级连接:与 MS/信令同网段示例。 |
t=0 0 | 不限时实时。 |
m=video 30515 TCP/RTP/AVP 96–99 | MS 在 30515 以 TCP 收 RTP,列出多种 PT。 |
a=recvonly | 平台/MS 只收,设备发。 |
a=rtpmap:96 PS/90000 等 | 声明各 PT 说明。 |
a=setup:passive | 等待设备连进来。 |
a=connection:new | 新 TCP 连接。 |
y=0200000105 | 约定 SSRC。 |
设备 200 OK
| 与 INVITE 的差异 | |
|---|---|
o=34020000001320000104 ... 192.168.50.104 | 设备自己的 ID/IP与平台 o= 不同。 |
m=video 15060 TCP/RTP/AVP 96 | 端口变为 15060;只保留 PS/96。 |
a=setup:active | 设备主动连 到平台 passive 侧。 |
a=sendonly | 设备只发 RTP。 |
a=filesize:0 | 下载/文件场景下大小占位;实时也可能带。 |
y=0200000105 | 与邀请一致,确认 SSRC。 |
五、本仓库中的实际使用(对照代码)
5.1 SDP 模型与编码:core/pkg/sdp
Session聚合Origin、Name、URI、Connection、Timing、Media。Media含Mode(方向)、Formats(输出a=rtpmap)、Attributes(setup、connection、downloadspeed)、SSRC→y=、Description→f=。Encoder(encoder.go)按行输出 GB 常用的y=、f=。
5.2 平台发起视频 Invite:GBSSender.VideoLiveInvite
文件:core/app/sev/vss/internal/pkg/sip/gbs_send.go
- 组装 SIP 头(
Via/From/To/...)与Subject(上一节)。 - 按
TransportProtocol.MediaProtocolMode选 UDPRTP/AVP或 TCPTCP/RTP/AVP。 - 构造
sdp.Session:Origin:通道 ID + MS IPName:Play/Playback/DownloadURI:通道:0Connection:MS IPMedia:recvonly,多 rtpmap,y=由 playFlag+ssrc- TCP:
setup+connection:new
- 回放:写
Timing(起止时间);下载:downloadspeed。 sdpInfo.String()作为 INVITE body 发出。
5.3 平台对设备 SDP 做 200 OK 应答(对讲等):makeInviteSDPResp
同一文件:从设备 INVITE 解析出的 sdp.Session 中提取 音频/视频、payload、SSRC,生成 平台侧应答 SDP(示例分支里 sendonly 音频、Port: usablePort、Description 来自常量),用于 InviteSDPResponse。
5.4 SendLogic.VideoLiveInvite:先发 INVITE,再解析 设备 200 OK 里的 SDP
文件:core/app/sev/vss/internal/logic/gbs_proc/send_sip_proc.go,VideoLiveInvite方法。
这里体现的是 「SDP 在代码里第二次起作用」:第一次是 GBSSender.VideoLiveInvite 组 平台侧 INVITE body;第二次是 拿到设备 200 OK 后,对 inviteRes.Body() 做 sdp.ParseString,用 对端 SDP 驱动 ACK 与 MS 收流。
建议按源码顺序理解(与 SDP 相关的步骤):
| 代码/调用 | 与 SDP 的关系 | |
|---|---|---|
| 1 | ms.RTPPub(req) | 在 MS 侧先占位/建收流资源,与后续设备实际推流配合;失败则不进入 Invite。 |
| 2 | VideoLiveInvite(req) | 发出 带平台 SDP 的 INVITE;inviteStep 里把 整包 inviteData.String() 记下来(含 SDP,便于排障)。 |
| 3 | 检查 inviteRes.StatusCode() | 非成功则丢弃,不会解析 SDP。 |
| 4 | AckReq(inviteRes) | 用 200 OK 里的 To-tag 等 生成 ACK;并缓存到 AckRequestMap(Req.ID / StreamName),保证后续 BYE 等与 同一 dialog 一致(注释写明 从 ack 开始 from/to/tag/call-id 需一致)。 |
| 5 | sdp.ParseString(inviteRes.Body()) | 解析的是设备响应体中的 SDP(不是平台自己发的 INVITE body)。 |
| 6 | 校验 sdpInfo.Media、sdpInfo.Connection | m= 列表不能为空;会话级 c= 不能为空,否则认为 SDP 不可用,stop() 调 StopStream 清场。 |
| 7 | 扫描 Media[].Attributes 中 filesize | 国标 a=filesize:<字节>,解析为 filesize uint64;用于 ACKRtpPub(下载/回放进度、长度协商);0 与抓包里 a=filesize:0 一致,表示未知或占位。 |
| 8 | SendDirect(ackData) | 把 ACK 发到设备,完成 SIP 侧确认。 |
| 9 | ms.ACKRtpPub(req, sdpInfo.Media[0].Port, sdpInfo.Connection.Address, filesize) | 把 200 OK SDP 里的 m= 端口(取 Media[0].Port)、c= 地址(Connection.Address)以及 filesize 交给 MS,让媒体面 按设备声明的 IP:端口 完成 RTP(或 TCP RTP)收流 的最终参数对齐。 |
| 10 | PubStreamExistsState.Add | 标记该 StreamName 已有发布会话,与停流、重复 Invite 等逻辑配合。 |
小结:平台 INVITE 里的 SDP 描述 「希望怎么建会话」;真正决定「设备往哪发、发哪一路端口」的是 200 OK 里的 SDP;send_sip_proc 这一段就是在消费这份 SDP,并把它组装成 MS 的 ACKRtpPub。
5.5 SendLogic.talkInvite:对讲场景下的 SDP 解析
| 步骤 | 作用 |
|---|---|
UsablePort | 为本端对讲 RTP 取可用端口;失败则 WS 通知并停止。 |
TalkInvite | 发 对讲 INVITE(具体 SDP 由 gbs_send 对讲链路构)。 |
sdp.ParseString(inviteRes.Body()) | 同样解析 设备 200 OK 的 SDP。 |
AckReq + SendDirect | 发 ACK。 |
SetTalkRtpConnInfo / SetTalkRtpConn | 把 SDP 中的 媒体与连接信息 落到 TalkSipData,建立 RTP 会话,与 WebSocket 上行音频、SipSendTalk 串联。 |
与 5.4 的共同点:ParseString 的对象始终是「对端 inviteRes.Body()」,即 设备侧 SDP;平台侧 INVITE 的 SDP 不在这里解析。
六、小结
| 概念 | 平台 INVITE | 设备 200 OK |
|---|---|---|
o= | 我这次用通道/平台身份 + MS 侧会话地址 | 我用 设备身份 + 设备 IP |
c= / m= | 来 MS 这个 IP:端口(TCP/UDP 见 m=) | 从我设备这个 IP:端口 发出去 |
recvonly / sendonly | 我 收 → 请你 发 | 我 发 → 配合你收 |
setup | 我 被动 等你连 / 或配置为 active | 我 主动 连你 / 与你配对 |
y= | 我建议 SSRC | 我 确认 SSRC(常与 INVITE 一致) |
t= | 回放 区间 | 常 0 0 或简化 |
以信令服务器发送至设备为例
34020000001320000105 视频通道id
192.168.50.104:5060 设备地址
Via: sip协议交互通信方式 sip服务器地址;rport=接受信令端口(公网路由穿透);branch=随机标识
From: <sip:sip信令服务器id@信令服务器域(信令服务器ip:端口)>;tag=发送端唯一标识(Invite ack bye需要统一)
To: <sip:视频通道id@设备端(设备域)>
Call-ID:当前链路唯一呼号(Invite ack bye需要统一)
Content-Type: 当前信令交互内容类型 (sdp),不同类型注意区分
如果处于跨域情况下,可以通过contact找到信令服务器源
Contact: <sip:sip信令服务器id@信令服务器域(信令服务器ip:端口)>
Subject: 视频通道id:设备通道序列号,sip信令服务器id:0 文档说明: 媒体流发送者设备编码:发送端媒体流序列号,媒体流接收者设备编码:ssrc(流序号)
附录摘抄自GBT+28181-2016(扫描版-带目录).pdf
附录 A:f= 媒体描述国标结构与参数取值表
国标规定 f= 为单行字符串,视频段与 音频段用固定顺序拼接;视、音频两段之间不留空格。整体模板为:
f=v/<编码格式>/<分辨率>/<帧率>/<码率类型>/<码率大小>a/<音频编码>/<码率大小>/<采样率>
参数约定(国标文本摘编,与工程对接设备时作字典用)
- 「十进制整数字符串」:取值范围描述为 0~4294967296 间的十进制数字字符串(以标准正文为准)。
- 分隔符:各参数以
/分隔;不可省略分隔符;若两/之间无内容,表示 该位无取值(空参数)。 - 结构完整性:任意时刻
f=的整体结构应完整。- 仅视频:音频段各分项可不填,但须保留
a///占位:
f=v/<编码>/<分辨率>/<帧率>/<码率类型>/<码率大小>a/// - 仅音频:视频段各分项可不填,但须保留
v/////占位:
f=v/////a/<编码>/<码率>/<采样率>
- 仅视频:音频段各分项可不填,但须保留
- 分辨率:可用其区分 同一设备多码流。
A.1 视频子段 v/...(v 表示后续为视频参数)
顺序:v/<编码格式>/<分辨率>/<帧率>/<码率类型>/<码率大小>
| 位置 | 说明 | 取值(十进制整数字符串) |
|---|---|---|
| 编码格式 | 视频编码 | 1 — MPEG-4;2 — H.264;3 — SVAC;4 — 3GP |
| 分辨率 | 图像大小 | 1 — QCIF;2 — CIF;3 — 4CIF;4 — D1;5 — 720P;6 — 1080P/I |
| 帧率 | fps | 0~99 |
| 码率类型 | CBR/VBR | 1 — 固定码率(CBR);2 — 可变码率(VBR) |
| 码率大小 | 数值 | 0~100000,示例 1 表示 1 kbps(以国标条文为准) |
A.2 音频子段 a/...(第二个 a 表示音频参数段,勿与 SDP 的 a= 属性行混淆)
顺序:a/<编码格式>/<码率大小>/<采样率>
| 位置 | 说明 | 取值(十进制整数字符串) |
|---|---|---|
| 音频编码 | 编码类型 | 1 — G.711;2 — G.723.1;3 — G.729;4 — G.722.1 |
| 码率大小 | 音频码率档次 | 1 — 5.3 kbps(G.723.1);2 — 6.3 kbps(G.723.1);3 — 8 kbps(G.729);4 — 16 kbps(G.722.1);5 — 24 kbps;6 — 32 kbps;7 — 48 kbps;8 — 64 kbps(G.711) |
| 采样率 | 采样频率 | 1 — 8 kHz(G.711 / G.723.1 / G.729);2 — 14 kHz;3 — 16 kHz;4 — 32 kHz(多档针对 G.722.1 等,见国标表) |
工程中的占位示例:internal/pkg/sip/types.go 中 SDPMediaDescription_1 = "v/////a/1/8/1" 表示在 f= 里保留 完整结构,视频段留空、音频段填 G.711 / 64kbps / 8kHz 等(与对讲 makeInviteSDPResp 里 Media.Description 一致)。
附录 B:国标 a= 扩展与 SSRC(y=)规则摘录
B.1 厂商编码名(RFC4566 rtpmap 扩展)
国标允许在 a=rtpmap: 的 encoding name 位置写厂商标识,表示 非本标准规定码流;符合标准的媒体流不需要该写法。
例:a=rtpmap:96 DAHUA/90000、a=rtpmap:96 HIKVISION/90000。
B.2 下载相关 a= 行
| 行例 | 说明 |
|---|---|
a=downloadspeed:<整数> | 文件下载 倍速(整型) |
a=filesize:<Byte> | 文件 大小,用于进度计算;0 常见于「未知」(与 send_sip_proc 解析 filesize 一致) |
B.3 TCP 媒体 a=setup / a=connection
| 行例 | 说明 |
|---|---|
a=setup:active|passive | TCP 建连角色:主动向对方连 / 被动监听 |
a=connection:new | RTP over TCP 时 新建 TCP 连接(可固定采用 new,见国标) |
B.4 SVC
| 行例 | 说明 |
|---|---|
a=svcspace:<整型> | 空域 SVC:0 不用;1~3 分别为 1~3 级增强层 |
a=svctime:<整型> | 时域 SVC:0 不用;1~3 分别为 1~3 级增强层 |
B.5 y=(SSRC)域内处理方式(概念)
- SSRC 由 媒体流发送设备所在 SIP 监控域 产生,作为 媒体流标识。
- 点播域内设备 时:监控系统生成 SSRC → 经 Invite(SDP 中带
y=) 发给设备 → 200 OK 携带相同y=→ RTP 使用同一 SSRC(与正文第三节y=、Subject一致)。
附录 C:SIP 与 SDP 头字段对照
以下 非 SDP 行,常与 SDP 同包出现:
| 头 / 行 | 发送方(平台→设备) | 接收方理解 |
|---|---|---|
| Via | SIP/UDP、本机地址、rport、branch | 回应路由与事务匹配 |
| From | <sip:平台ID@域>;tag=... | tag 在 ACK/BYE 等需一致 |
| To | <sip:通道ID@设备>;初始可无 tag | 200 OK 补 To-tag |
| Call-ID | 呼叫唯一 | 全流程一致 |
| Contact | 平台可达地址 | 设备知道 后续请求发到哪 |
| Content-Type | APPLICATION/SDP | 正文为 SDP |