视频编码格式-扫盲

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_typeNAL类型
0未使用
1非IDR的帧
2片数据A分区
3片数据B分区
4片数据C分区
5IDR帧
6SEI补充增强信息单元
7SPS序列参数集
8PPS图像参数集
9分解符
10序列结束
11码流结束
12填充
13-23保留
24-31未使用

常见NALU头:

NALU头描述
0x67,0x47,0x27SPS序列参数集,重要级别是11,10,01
0x68,0x48,0x28PPS图像参数集,重要级别是11,10,01
0x65,0x45,0x25IDR帧,重要级别是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_typeNAL类型
32VPS视频参数集
33SPS序列参数集
34PPS图像参数集
39SEI补充增强信息
19I帧
1P帧

详细可参考下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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的负载信息,才可以进程磁盘保存和网络传输。

H264

H265

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值