标签:00 H264 裸码 0x00 nal golang rtpPayload fua FrameType
func UnpackRTP2H264(rtpPayload []byte) []byte {
if len(rtpPayload) <= 0 {
return nil
}
var out []byte
fu_indicator := rtpPayload[0] //获取第一个字节
fu_header := rtpPayload[1] //获取第二个字节
nalu_type := fu_indicator & 0x1f //获取FU indicator的类型域
flag := fu_header & 0xe0 //获取FU header的前三位,判断当前是分包的开始、中间或结束
nal_fua := ((fu_indicator & 0xe0) | (fu_header & 0x1f)) //FU_A nal
var FrameType string
if nal_fua == 0x67 {
FrameType = "SPS"
} else if nal_fua == 0x68 {
FrameType = "PPS"
} else if nal_fua == 0x65 {
FrameType = "IDR"
} else if nal_fua == 0x61 {
FrameType = "P Frame"
} else if nal_fua == 0x41 {
FrameType = "P Frame"
}
log.Printf("nalu_type: %x flag: %x FrameType: %s", nalu_type, flag, FrameType)
if nalu_type == 0x1c { //判断NAL的类型为0x1c=28,说明是FU-A分片
if flag == 0x80 { //分片NAL单元开始位
/*
o := make([]byte, len(rtpPayload)+5-2) //I帧开头可能为00 00 00 01、00 00 01,组帧时只用00 00 01开头
o[0] = 0x00
o[1] = 0x00
o[2] = 0x00
o[3] = 0x01
o[4] = nal_fua*/
o := make([]byte, len(rtpPayload)+4-2) //I帧开头可能为00 00 00 01、00 00 01,组帧时只用00 00 01开头
o[0] = 0x00
o[1] = 0x00
o[2] = 0x01
o[3] = nal_fua
copy(o[4:], rtpPayload[2:])
out = o
} else { //中间分片包或者最后一个分片包
o := make([]byte, len(rtpPayload)-2)
copy(o[0:], rtpPayload[2:])
out = o
}
} else if nalu_type == 0x1 { //单一NAL 单元模式
o := make([]byte, len(rtpPayload)+4) //将整个rtpPayload一起放进去
o[0] = 0x00
o[1] = 0x00
o[2] = 0x00
o[3] = 0x01
copy(o[4:], rtpPayload[0:])
out = o
} else {
log.Printf("Unsport nalu type!")
}
return out
}
标签:00,H264,裸码,0x00,nal,golang,rtpPayload,fua,FrameType 来源: https://blog.csdn.net/qq_41681715/article/details/116118185
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。