欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的码流数据,具体分析一下:
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;

就可以得出一下结论:
H265数据结构与码流分析
在进行编解码时,就可以按照上面的结论进行了。

在应用层面,只要了解了NALU的类型判断和码流序列就好了。

如何判断视频流是H264 或者H265

看了看,网上很少有说这个问题。
直观的想法,判断第一个Nalu的类型:

  • 0x40 : VPS nalu,H265
  • 0x06 : SEI nalu,H264
  • 0x67 : SPS nalu,H264

不知还有没有其他更好的方式???