Golang开发中如何判断H265中的视频帧类型

举报
TSINGSEE青犀视频 发表于 2021/12/10 15:39:21 2021/12/10
【摘要】 每个NALU前面都有起始码0x000001,3bits。如果NALU类型为vps,sps,pps,或者解码顺序为第一个AU的第一个NALU,起始码前面再加一个0x00。视频流的首个NALU的起始码前加入0x00。

我们很多项目都是通过Golang编译的,比如EasyNVR、EasyGBS、EasyDSS等,对于Golang的使用,我们一直都会不断研究。在Golang中,需求中提供了相对应的解析包,例如h265parser。

可以通过对应的解析函数ParseSliceHeaderFromNALU返回对应的帧类型:

    payloads, _ := h265parser.SplitNALUs(payload)
    payloadsLen := len(payloads)
    if payloadsLen == 0 {
        return
    }
    sliceType, e := h265parser.ParseSliceHeaderFromNALU(payloads[5])
    if e == nil {
        if sliceType == h265parser.SLICE_I {
        } else if sliceType == h265parser.SLICE_P {
        } else {
            log.Printf("Not support %s", sliceType.String())
        }

        log.Printf(sliceType.String())
    }

分析下h265码流(字节流模式),nal单元如何分割类型。

这里我们上一段h265的码流片段:

分析一下nal单元分割。

寻找0x000001或者0x00000001, 规则如下:

每个NALU前面都有起始码0x000001,3bits。如果NALU类型为vps,sps,pps,或者解码顺序为第一个AU的第一个NALU,起始码前面再加一个0x00。视频流的首个NALU的起始码前加入0x00。

实际分析中,不必要整得这么复杂,只要找到0x000001或者0x00000001即可。

我们还拿上图中的内容进行分析,上图码流nal拆分为:

第一帧:

0000 0001 4001 0c01 ffff 0160 0000 0300 0003 0000 0300 0003 00ba 9702 40

第二帧:

00 0000 0142 0101 0160 0000 0300 0003 0000 0300 0003 00ba a00f 0804 47f9 65e4 91b6 1c5e 4924 fe79 fcf2 ffff ffcf e7f3 f3f9 d9

第三帧:

00 0000 0144 01c1 9095 8112

第四帧::

0000 0126 01af 1380 790b dc5c 557c 74…

以下是NAL类型分析:

类型判断方式为分隔符之后的第一个字节右移一位的值

第一帧:0x40 >> 1,得到0x20,十进制32,为NAL_VPS
第二帧:0x42 >> 1,得到0x21,十进制33,为NAL_SPS
第三帧:0x44 >> 1,得到0x22,十进制34,为NAL_PPS
第四帧:0x26 >> 1,得到0x13,十进制19,为NAL_IDR_W_RADL
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。