H265数据结构与码流分析

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数据结构与码流分析_第1张图片
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数据结构与码流分析_第2张图片
在进行编解码时,就可以按照上面的结论进行了。

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

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

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

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

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

你可能感兴趣的:(流媒体,H264)