h264编码原理

在介绍编码器原理之前首先了解三个制定编码标准的组织:
1.国际电信联盟(ITU-T),这是一个音视频领域非常强的组织,规定了很多标准如h261,h262,h263,h263++。h263++也就是h264的前身。
2.国际标准化组织(ISO),这是一个庞大的官方组织,他们规定了很多标准,如分米,温度等,在ITU-T之后,他们也开始规定编码标准。如MPEG1,MPEG2,MPEG4。
3.GOOGLE,规定了vp8,vp9等。
ITU-T和ISO竞争了多年后,两个机构开始合作,h264/(MPEG4-part10 AVC)就是他们合作的产物。

h264是一系列编码工具的组合,主要包括:
1.帧内压缩
2.帧间压缩
3.环路滤波器,实际上是一个数字低通滤波器,滤除不必要的高频信息。

帧内压缩的过程如下:
数据源–》信源编码器–》视频复合编码器–》传输缓冲编码器–》传输编码器–》h264码流

在这里插入图片描述

什么是信源编码器:
它把一张图片分割成4x4,8x8,16x16等一个个宏块,其中h264最大的宏块是16x16,至于该分割成多大的宏块,是由具体算法决定的。

什么是视频复合编码器:
把一个个宏块,进行记录,分为三部分,第一首先记录宏块的顶层一行,然后记录最左边的一行,最后记录预测。预测有9种方向,如下图。因此可以知道宏块越大,压缩比也就越高。
h265之所比h264压缩比高就是它的预测方向比较多。
在这里插入图片描述
什么是传输缓冲编码器:
信源编码器编码数据放在这里,i和p帧编码后直接出码流,不会缓存,b帧会缓存等待P帧,一个p帧进去,编码里之前缓存的b帧一定都会被刷新出来。
帧内压缩就是对宏块的压缩。丢包为什么会花屏,其实是丢了宏块,解码器解析不到就变成花屏了。

帧间压缩:
帧内压缩就是对宏块的压缩。帧间压缩分为两种,一种是没有运动的宏块,一种是运动的宏块,帧间压缩就是对运动宏块坐标的记录,称为对运动适量的记录。因此I帧是记录宏块左边和上边+预测方向的信息,P帧是记录运动矢量+差异数据,B帧只包含运动矢量。其中差异数据就是左边和上边+预测方向。

h264只是规定的码流的结构,码流结构确定了,那么解码器的结构也就确定了,但是编码器的实现可以不同,只要最终编码出的码流结构符合h264就可以了。
在264中,与I帧相似度95%以上编译成B帧,与I帧相似度70%以上编译成P帧。
264 I P B帧的大小比值约为8:1:0.4

请添加图片描述

在上图中5b参考4p和7p不参考I帧。

之所以引进265是因为,264很难对1080p以上的视频编码,编码出来的视频太大。264编码算法成熟时,人们对视频清晰度还没有那么高的要求,显示器的分辨率普遍还很低。
h265之所以能提升压缩率,根本原因有是因为宏块的大小变大了,最大128x128,而264最大16x16。那么是否宏块的左边和上边加上预测方向就会忽略掉很多细节,编码就会编码的不清晰了呢。需要注意的是h265是聪明的压缩算法,比如它先划分一个64x64的宏块,划分好后发现这个宏块里的像素细节比较多,颜色变化大,那么它就会再划分四个等大小的宏块,也就是32x32,然后再对每个宏块考虑是否还需要再次细分,如果需要每个宏块再划分为4个等大的宏块,这样树形递归下去,直到划分到最小的4x4大小的宏块。这就是h265能有效压缩视频的秘密。如下图:
在这里插入图片描述
但是如果只比较I帧的话,还是265稍微大一点点些,因为265采用的树形递归编码方式需要记录额外的信息。因此在I帧265并没有优势,但是它的P帧和B帧会比264的小非常多,比如P帧可能会是264P帧的1/10。
查看264视频宏块的划分可以用雷神的eyeView。
查看264视频宏块的划分可以用Elecard HEVCAnalyzer。
同时265和264还有一个更大的差别,那就是它在264的基础上增加了预测方向,使得对像素的预测更加精准。
H.265:所有尺寸的CU块,亮度有35种预测方向,色度有5种预测方向
H.264:亮度 4x4块9个方向,8x8块9个方向,16x16块4种方向,色度4种方向
在这里插入图片描述
在这里插入图片描述
rgb码流有255x255x255种,yuv能表达的颜色大概只有rgb的1/4。

264码流结构:
265和264在码流结构也有不同,264第一帧里有两个分隔符(00 00 00 01),一个是sps,一个是pps,265则有三个分隔符,在最前面加了一个vps。vps是用来保存3D信息的,比如左眼偏光度,右眼偏光度。因此一个裸眼3D视频一定是265编码。
阻止h265大规模普及的是专利问题,超过百万台设备收费18万。
数据中有和分隔符一样的数据需要转义成00 00 00 03。
在265中宏块换了一种叫法,叫编码树单元CTU,其递归的每个小宏块叫编码单元CU。CTU又叫LCU。
264码流,sps含有宽高,编码等级,码率,帧率等配置信息。pps只有宽高信息。为什么有了sps还要pps呢,因为pps一定有,但sps某些情况下不含有。sps和pps前面也分别都有启动码。I,P,B帧前面也分别都有启动码。
分隔符有四个字节和三个字节两种,00 00 00 01和00 00 01。分隔符后面紧跟着的一个字节的后5个比特位是帧类型。264帧类型有0–31种。帧类型只区分I帧和非I帧,再往后面还有字节可以区分具体是I,B,P帧。如下:
7是sps,8是pps,5是I帧。
sps和pps在每个IDR帧前面,告诉解码器如何解析这个I帧。
264码流中一个宏块可以包含编码数据(上+左),预测数据,运动矢量三种,而在265中,以上数据类型是分开存储的,一个宏块不会存储多种,只会存储其中一种。
编码好的裸264数据码流分为NAL层(网络抽象层)和VCL(视频编码层),NAL层包括启动码+宏快类型+结束码,结束码是00 00 00 00。VCL层是视频编码层,视频压缩后的264码流就在这里。
所以一帧I/P/B码流是这样的:
启动码+宏快类型+VCL+结束码
网络层不仅是用来网络传输的,磁盘,usb传输也用得到。
sps和pps没有结束符,I/P/B有。
当渲染出来数据出现绿条是大概率是编码器对视频进行了字节补齐,而不是采集或渲染时产生的。

请添加图片描述

Interested in ffmpeg, add author WeChat, join WeChat group for discussion VX:YQW1163720468,备注:ffmpeg爱好者

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、、、、燕庆伟、、、、

分享对你有帮助,打赏一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值