Golang开发中如何判断H265中的视频帧类型
我们很多项目都是通过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
相关文章
- 网卡限速工具之WonderShaper
- 如何在云计算中实现多租户
- 谈AT&T关于数据科学与自动化的集体探索
- SDN具备的三个好处如何为小型企业提供帮助
- “一箭易断,十箭难折”——从单链路到MC-LAG
- 边缘计算部署成功的四个因素
- Wi-Fi 7已在路上,它究竟有多强?
- 云路由如何构建家庭内网控制系统?
- 基于预训练语言模型的行业搜索的应用和研究
- 面试官竟然把TCP三次握手、四次挥手问的这么详细?
- 2023年有哪些人工智能发展趋势
- 瑞康医药与亚马逊云科技签署战略合作协议,打造医药流通行业数字化转型标杆
- SD-WAN 已死?答案当然是没有
- ChatGPT 就像互联网时代的 HTML
- 多云联网软件如何解决云平台连接网络和应用程序的挑战
- 阿里一面:HTTP 1.0 和 HTTP 1.1 有什么区别?
- 为什么需要NQA?NQA到底为何物?一文告诉你!
- 「ChatGPT克星」升级:老师可以把全班作业丢进去检测了!华人作者:免费用
- 酒店Wi-Fi支持远程工作的三种方式
- 为了提升网络可靠性,你知道OTN光层保护有多努力吗?