跳过导航,直接进入主要内容跳过导航,直接进入主要内容跳过导航,直接进入主要内容

PS 封装与 RTP 打包

psmux 包把 H.264/H.265(+ G.711 音频)封进 MPEG-2 节目流并打包 上 RTP——设备推流路径与平台/级联转发共用。

安装

go get github.com/mickeyzzc/gb28181-go@v0.11.0

封装器

import "github.com/mickeyzzc/gb28181-go/psmux"

m := psmux.New()
m.SetVideoCodec("h264") // 或 "h265"
m.SetAudioCodec("pcma") // 可选 G.711

// WriteAU 吃完整 Annex-B 访问单元(带起始码)。
ps := m.WriteAU(annexBAU, pts, isIDR)
audioPS := m.WriteAudio(g711Frame, pts)
  • IDR 访问单元在 PES 前发 pack header + system header + PSM; P 帧只发 pack header + PES。
  • 超出 PES 长度上限的访问单元自动切成多个有界 PES 包。

RTP 打包

// UDP 推流:
p := psmux.NewRTPPacketizer(conn, udpAddr, ssrc, initialSeq)
err := p.Send(ps, tsTicks)

// TCP 被动媒体(国标 TCP 模式):
p := psmux.NewRTPPacketizerTCP(conn, ssrc, initialSeq)

Send 把超长 PS 自动分片为多个标记位正确的 RTP 包;Sent() 报 已发包数。

该用哪个封装器?

两个封装器有意共存:

  • device.MuxH264ToPS——仅 H.264,真机平台实战检验过,与 Rust 孪生库逐字节金串对齐。需要孪生一致字节时用它。
  • psmux.New()——支持 H.265 + G.711 音频,平台转发与级联在用。 新集成需要 H.265/音频时用它。

合并推迟的原因见 README 的"API 面说明"。

nalutil

nalutil 回答两个角色都要问 NAL 流的问题:这个访问单元是不是 IDR、 提取 SPS/PPS(/VPS)、比较跨重启的参数集(编码器重启检测)。

可访问性增强功能已加载,支持焦点管理、键盘导航和屏幕阅读器