H265数据结构与码流分析
程序员文章站
2022-07-14 18:46:59
...
H265应该是在H264的基础上,又做了优化改进。如果了解H264的数据结构,再去看H265的数据结构,就非常简单了。
具体的H264的数据结构,可以看我的另一篇 H264数据结构
图像帧序列
- H264的图像帧序列:00 00 00 01 + SEI + SPS + PPS + IDR帧+P帧+B帧…+ I帧+P帧+B帧…
- H265的图像帧序列:00 00 00 01 + VPS+SPS+PPS+SEI+IDR帧+P帧+B帧…+ I帧+P帧+B帧…
- 其中在有的视频文件中,SEI并不存在,是可选项。
- H265新增了VPS数据,视频参数集,主要用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频的扩展。
- 和H264相同,每一个VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称为一个NALU。
NALU 格式
来看一个真正的H265的码流数据,具体分析一下:
NALU的格式都是 : 开始码+NALU头+NALU数据。
- 开始码:00 00 00 01
- H265的NALU的头部由两个字节组成:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| A | Nalu Type | B | C |
- A:forbidden_zero_bit,1 bit, value = 0;
- Nalu Type: nal_unit_type,6 bits;
- B:nuh_layer_id,6 bits;
- c:nuh_temporal_id_plus1,3 bits;
所以判断NALU的类型方式如下:
- H264 NALU类型判断方式: int type = (code & 0x1F),这主要取决于H264的NALU的数据结构;
- H265 NALU类型判断方式:int type = (code & 0x7E)>>1;
就可以得出一下结论:
在进行编解码时,就可以按照上面的结论进行了。
在应用层面,只要了解了NALU的类型判断和码流序列就好了。
如何判断视频流是H264 或者H265
看了看,网上很少有说这个问题。
直观的想法,判断第一个Nalu的类型:
- 0x40 : VPS nalu,H265
- 0x06 : SEI nalu,H264
- 0x67 : SPS nalu,H264
不知还有没有其他更好的方式???
上一篇: 鲲鹏云实验-Python+Jupyter机器学习基础环境
下一篇: 08字符串作业