
目标理解 AAC 在 RTMP 中的封装方式搞懂 ADTS 与 Raw AAC 的区别避免常见的音频播放问题故事开场视频正常但音频只有杂音。你检查了采样率、声道数都没问题。最后发现AAC 数据前面多了一个 ADTS 头。核心知识AAC 的两种形态ADTS带头可独立播放Raw AAC需要序列头RTMP 中的 AAC使用 Raw AAC序列头包含 AudioSpecificConfig常见陷阱忘记去掉 ADTS 头采样率索引错误源码精读const ADTS_HEADER_SIZE 7 type AACCtx struct { *codec.AACCtx SequenceFrame AudioFrame }建议推流前确认音频格式检查序列头是否正确发送用工具验证 AAC 数据格式代码示例判断是否需要去掉 ADTSpackage main import ( fmt m7s.live/v5/pkg/codec/rtmp ) func isADTS(data []byte) bool { return len(data) 2 data[0] 0xFF (data[1]0xF0) 0xF0 } func main() { aacRaw : []byte{0x10, 0x00, 0x01, 0x02} aacADTS : []byte{0xFF, 0xF1, 0x4C, 0x80} fmt.Println(Raw AAC is ADTS:, isADTS(aacRaw)) fmt.Println(ADTS AAC is ADTS:, isADTS(aacADTS)) fmt.Println(ADTS Header Size:, rtmp.ADTS_HEADER_SIZE) }运行结果Raw AAC is ADTS: false ADTS AAC is ADTS: true ADTS Header Size: 7总结AAC 在 RTMP 中容易踩坑ADTS 头是常见陷阱序列头是音频解码的关键