)
目标理解为什么 RTMP 推流要先发“序列头”搞懂SequenceFrame在代码中的角色区分 H.264 / H.265 / AAC 的配置数据故事开场你拿到了一个 RTMP 视频流但播放器只有黑屏。老工程师说“你是不是忘了 Sequence Header”什么是 Sequence Header为什么它比画面还重要核心知识什么是序列头H.264SPS PPSH.265VPS SPS PPSAACAudioSpecificConfig为什么必须先发解码器需要“全局配置”才能解析后续帧代码中的设计type H264Ctx struct { *codec.H264Ctx SequenceFrame VideoFrame }源码精读func (ctx *H264Ctx) GetSequenceFrame() *VideoFrame { return ctx.SequenceFrame }这个方法让上层逻辑可以统一获取“序列头帧”而不用关心具体编码格式。类比理解序列头就像电影的“字幕说明”分辨率、帧率、编码档次没有它后面的画面全是乱码代码示例模拟 H.264 序列头package main import ( fmt m7s.live/v5/pkg/codec/rtmp ) func main() { h264 : rtmp.H264Ctx{} // 模拟 SPS/PPS 数据 h264.SequenceFrame.Payload []byte{ 0x67, 0x42, 0x00, 0x1E, 0x8B, 0x40, 0x50, 0x68, 0x03, 0x00, 0x80, 0x00, 0x00, } frame : h264.GetSequenceFrame() fmt.Println(Sequence Frame Length:, len(frame.Payload)) fmt.Printf(SPS/PPS Hex: % 02X\n, frame.Payload[:8]) }运行结果Sequence Frame Length: 13 SPS/PPS Hex: 67 42 00 1E 8B 40 50 68总结序列头是解码的“钥匙”RTMP 推流第一帧通常是序列头代码中用SequenceFrame统一管理