ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用golang解析rtp成H264裸码流

2021-04-25 10:29:46  阅读:321  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有