H.264
基础知识
- GOP[两个IDR帧之间的帧为一组GOP,一组GOP可以出现非IDR的I帧]:一般设置为编码器每秒输出的帧数,一般为帧率,GOP里面有且只有一个I帧,多个P,B帧。P,B帧由I帧预测得来,如果I帧效果较差
则会影响到一个GOP中的后续所有的P,B帧。B,P帧的复杂度略高,所以P,B帧太多会影响编码效率。
数据组织形式 - IDR帧(即时解码刷新I帧)[帧内预测]:也是一个I帧,但会导致DPB(Decoded Picture Buffer 参考帧列表)清空。IDR帧承担了随机访问的功能。一个新的IDR可以重新计算新的GOP开始编码,只有GOP的第一个I帧是IDR帧,位于IDR帧后的P,B帧不能参考IDR帧以前的帧。
- I帧[帧内预测]:I帧不会导致DPB清空。I帧可简单理解为一帧画面的完整保留,压缩比约为7。I帧描述了图像背景和运动主体,不需要参考其他画面,信息量较大
- P帧[前向预测编码帧]:表示这一帧与前一I或P帧的差别,P帧只有与前一帧画面的差异数据,压缩比约为20
- B帧[双向预测编码帧]:记录了本帧与前后帧的差别,要解码B帧不仅要获取之前的缓存画面,还有解码后之后的画面。压缩比约为50。
H264 profile level
- BP-Base Profile:基本画质,支持I/P帧,只支持无交错和CAVLC
- EP-Extend Profile:扩展画质,支持I/P/B/SP/SI帧,只支持无交错和CAVLC
- MP-Main Profile:主流画质,支持I/P/B,支持无交错和交错,也支持CAVLC和CABAC
- HP-High profile:高级画质,在MP的基础上增加了8x8内部预测,自定义量化比,无损视频编码,和更多的YUV格式
H264码率控制
- VBR:动态比特率,码率随着图像复杂程度的不同而变化。因此编码效率较高。运动产生时马赛克少。
- ABR:平均码率,是VBR的一种差值参数,ABR在指定文件大小内,低频和不敏感的使用较低流量,高频和大动态使用高流量,可视为VBR和CBR的折中
- CBR:恒定码率:有运动产生时,只能增大QP来减少码子大小,会降低画质,静止画面图像质量很好,压缩快。浪费流量
- CVBR:兼顾CBR和VBR,通常让用户输入最大码率和最小码率,静止时使用者最小码率,运动时码率大于最小码率但不高于最高码率。
H264 Annexb 码流格式
- SODB:原始编码数据
- RBSP=SODB+结尾bits[一个1多个0bit]以方便字节对齐
- EBSP=RBSP+扩展字节(0x03):在RBSP的基础上添加仿教研字节0x03
- NALU=NALU头+EBSP:
- NALU起始码:在NALU太那几到bit流时,需要在每组NALU前添加起始码,起始码一般是0x00000001[用于标识流中的随机访问点,IDR,SPS等]或者0x000001
- H264帧=起始码+NALU
±--------------+
|0|1|2|3|4|5|6|7|
|F|NRI| TYPE |
±--------------+
bit位 | 描述 |
---|---|
F | 禁止位,0表示正常,1表示错误,一般都是0 |
NRI | 重要级别 11表示非常重要,一般是 11 10 01 |
TYPE:nal_unit_type | 表示NALU的类型 |
nal_unit_type | NAL类型 |
---|---|
0 | 未使用 |
1 | 非IDR的帧 |
2 | 片数据A分区 |
3 | 片数据B分区 |
4 | 片数据C分区 |
5 | IDR帧 |
6 | SEI补充增强信息单元 |
7 | SPS序列参数集 |
8 | PPS图像参数集 |
9 | 分解符 |
10 | 序列结束 |
11 | 码流结束 |
12 | 填充 |
13-23 | 保留 |
24-31 | 未使用 |
常见NALU头:
NALU头 | 描述 |
---|---|
0x67,0x47,0x27 | SPS序列参数集,重要级别是11,10,01 |
0x68,0x48,0x28 | PPS图像参数集,重要级别是11,10,01 |
0x65,0x45,0x25 | IDR帧,重要级别是11,10,01 |
0x61,0x41,0x21 | 非IDR帧,重要级别是11,10,01 |
H264 AVCC格式
- Annex-B:上面介绍的Annex-B格式没有NALU长度字节,使用起始码来分隔NALU.
- AVCC:使用NALU长度,固定4字节来分隔NALU;一般在NALU头部为4字节大端格式的长度字节。在一组GOP的头部包含extradata,用于存储sequence-header,SPS,PPS等数据
- 虽然VACC不用起始码,但是防竞争码扔存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbdqlpkc-1666541696761)(png/264extradata结构.png)]
NALULengthSizeMinusOne解释:这个变量告诉我们用几个字节来存储NALU的长度,如果NALULengthSizeMinusOne是0,那么每个NALU使用一个字节的前缀来指定长度,那么每个NALU包的最大长度是255字节,这个明显太小了,使用2个字节的前缀来指定长度,那么每个NALU包的最大长度是64K字节,也不一定够,一般分辨率达到1280*720 的图像编码出的I帧,可能大于64K;3字节是比较完美的,但是因为一些原因(例如对齐)没有被广泛支持;因此4字节长度的前缀是目前使用最多的方式,
H.265
H.265也称为HEVC[Hight Efficiency Video Coding].是面向更高清晰度,更高帧率,更高压缩率的视频协议标准。
清晰度扫盲
- 标清 480x800
- 普通高清 720x1280 720P
- 高清 1920x1080 1080P
- 2K 2048*1024
- 超高清4K 3840x2160
网络分层:
H.265采用了视频编码层(VCL-Video Code layer)和网络适配层(NAL Network abstract layer)
VCL:视频压缩数据
NAL:负责对压缩数据进行划分和封装
典型H265码流如下:
起始码+VPS+起始码+SPS+起始码+PPS+起始码+SEI+起始码+I帧+起始码+P帧…
和H.264相比,H265的码流多了VPS(视频参数集)帧,且H265码流的最开始永远是VPS+SPS+PPS,可能会有SEI,后面紧接着就是I,P帧
H265 结构
H265的NALU结构也是起始码+NALU头+NALU数据的样式。
起始码
与H264保持一致,H265的起始码也是0x000001 或者0x00000001
NALU头
与H264不同的是H265的NALU头是2字节,而H264的NALU头是1字节
±------------------------------+
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
|F| TYPE | LID | TID |
±------------------------------+
- F:forbidden_zero_bit:禁止位,一般是0,非0表示此帧错误
- TYPE:nal_unit_type:表示nalu的帧类型
常用帧类型是:
nal_unit_type | NAL类型 |
---|---|
32 | VPS视频参数集 |
33 | SPS序列参数集 |
34 | PPS图像参数集 |
39 | SEI补充增强信息 |
19 | I帧 |
1 | P帧 |
详细可参考下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRvWtAxf-1666541696762)(png/H265-NALU.jpg)]
RBSP的结构
H265的 RBSP(raw byte sequence payload)和H264的一样。 可参考H624部分
NAL根据送压缩数据的规则,可以封装为不同的NALU, NALU包含VPS,SPS,PPSl类型信息,还包含视频片(Slice)的压缩数据,包含压缩的NALU被称为VCLU(VCL NALU),包含其它信息的压缩数据的NALU,则被称为non-VCLU(non-VCL NALU)。
H265下的NALU包含两部分数据结构:NALU头(header)和负载(payload),NALU头长度为固定的2字节,反应NALU的内容特征,而NALU的负载长度为整数字节,包含视频压缩后的原始字节序列负载RBSP(raw byte sequence payload)。RBSP是对视频 编码后的原始比特流片段SODB(string of data bits)进行添加尾部(添加比特1,以凑足整字节)的包装。
同样在H265中,为了避免字节流片段和NALU的启起码及结束码发生冲突,需要对RBSP的字节流进行冲突处理0x3,经过处理后的RBSP才可以直接作为NALU的负载信息,才可以进程磁盘保存和网络传输。