H265/HEVC视频分层码流分析语义元素解释
H265分层结构
H265的分层结构与H264类似,分为视频编码层(VCL:Video Code Layer)和网络抽象层(NAL:Network Abstract Layer)。
VCL层:对视频的原始数据进行压缩,包含原始的视频数据。
NAL层:将视频压缩数据根据内容不同划分成不同类型的NALU单元进行网络传输。
H265的图像帧序列:00 00 00 01 + VPS+SPS+PPS+SEI+IDR帧+P帧+B帧…+ I帧+P帧+B帧…
和H264相同,每一个VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称为一个NALU。
H265码流结构
H265原始码流(裸流)是由多个NAL单元组成的,具体如下图所示:
NALU的格式都是 : 开始码+NAL头+NALU数据(NALU Payload)。
1.Start Code开始码:00 00 00 01 表示一个NALU单元的开始
2.H265的NALU的头部由两个字节、四部分组成:
A: 禁止位,占用NALU Header的第一个字节的第一个位,值默认0,值为1时表示错误,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
Nalu Type: nal_unit_type类型,占用NALU Header的第一个字节的第二到七位,用来表示NAL单元的类型,具体取值如下图所示:(NAL单元根据是否装载视频编码数据被分为VCLU(Video Coding Layer NAL Unit)和non-VCLU。非编码数据的参数集作为non-VCLU进行传输,这为传递关键数据提供了高鲁棒机制。 )
(对图中的符号解释:TSA Temporal Sub-layer Access:时域子层接入点,比特流中可以由此开始解码更高时域层的位置。STSA Step-wise Temporal Sub-layer Access:逐步时域子层接入点。RADL Random Access Decodable Leading (Picture):可解码随机接入前置图像,在SOP(structure of picture)中,一类解码顺序在IRAP图像之后,而显示顺序在IRAP图像之前的前置(Leading)图像,这种图像的解码不需要参考任何解码顺序在IRAP之前的图像。RASL Random Access Skipped Leading (Picture):跳过随机接入前置图像,在SOP(structure of picture)中,一类解码顺序在IRAP图像之后,而显示顺序在IRAP图像之前的前置(Leading)图像有可能包含帧间预测,需要参考解码器中不存在的图像。于是解码器只能跳过这些无法解码的图像继续解码处理,称这些不可解码的图像为跳过随机计入前置(RASL)图像。CRA Clean Random Access:纯随机接入,它处于比特流GOP的第一帧,即RAP图像位置,是I帧,和IDR帧一样可被独立解码。CRA图像都是和相应前置图像有关联的图像。
更多名词解释https://blog.csdn.net/qq_27636049/article/details/81188731)
B: LayerId预留位,占用NALU Header的第一个字节的最后一位和第二个字节的前五位,默认全为0,用于未来扩展。
C: TID时域层标号,占用NALU Header的第二个字节的最后三位,一般默认值为1,其值减1为该NALU时域层标号。
3.NALU Payload(NALU 数据),即视频压缩数据RBSP,但是严格意义上来说,Payload数据应该是EBSP。
SODB(String Of Data Bits):原始数据比特流
由VCL层产生的的原始数据流,由于数据长度不一定是8的倍数,为方便计算机进行处理,就用到了RBSP。
RBSP(Raw Byte Sequence Payload):原始字节序列载荷
即在SODB的后面添加了trailing bits,即一个bit 1和若干个bit 0,以便字节对齐。
EBSP (Encapsulated Byte Sequence Payload):扩展字节序列载荷
h265码流中规定每有两个连续的“0x00 0x00”,就增加一个“0x03”,从而预防压缩后的数据与开始码产生冲突,防止竞争。
如上图所示,我们可以清晰的看到在H265码流中,是以“0x00 0x00 x00 0x01”为开始码的,找到开始码后,后面的两个字节表示NALU Header,上图所示分别标注了VPS、SPS、PPS、IDR类型。
Ffmpge 抽取H264,H265码流的命令
ffmpeg -s 3840x2160 -i SunBath_3840x2160_50fps_10bit.yuv -vcodec hevc out.h265
视频参数集VPS
视频层描述
在H.264/AVC的码流结构中,没有类似VPS这样的参数集去描述时域各层之间的依赖关系。它的扩展部分可伸缩视频编码中,SEI信息提供了相关各层信息,以用于不同业务和不同终端的访问。但在一些应用场景,例如广播和多播,由于SEI中的部分信息会重复出现在SPS中,这样造成参数重传而引起延迟等问题。因此在H.265/HEVC中引入VPS,以克服H.264/AVC中存在的不足,同时为设计简洁,可扩展多层视频编码提供方便。VPS主要用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频编码的扩展。
一个给定的视频序列,无论它每一层的SPS是否相同,都参考相同的VPS。VPS包含的信息有:
VPS包含的信息有:① 多个子层和操作点共享的语法元素;