视频编解码基础--H264编码

news/2024/11/16 13:36:01/

(1)图像GOP:

GOP:GOP group of pictures,指的就是两个I帧之间的间隔,在这两个I帧之间可以存在多个P帧和B帧,一般在IPC中,主要是I帧和P帧,B帧一般不使用(B帧同时依赖前面和后面的帧解码),一般在DVD中较常见。GOP的示意图如下图所示:
在这里插入图片描述
  一般来说,为了保证视频质量,GOP不宜设置过大,这是因为P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP 开始才有可能得以恢复,所以GOP值也不宜设置过大。另外,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。

(2)IDR帧和I帧:

在I帧中,所有宏块都采用帧内预测的方式,因此解码时仅用I帧的数据就可重构完整图像,不需要参考其他画面而生成(I帧的压缩率大概为7)。
  H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即时解码刷新)。 IDR帧实质也是I帧,使用帧内预测。IDR帧的作用是立即刷新,会导致DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。所以IDR帧承担了随机访问功能,一个新的IDR帧开始,可以重新算一个新的Gop开始编码,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。如果一个视频中没有IDR帧,这个视频是不能随机访问的。所有位于IDR帧后的B帧和P帧都不能参考IDR帧以前的帧,而普通I帧后的B帧和P帧仍然可以参考I帧之前的其他帧。IDR帧阻断了误差的积累,而I帧并没有阻断误差的积累。
  一个GOP序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,但I帧不一定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。

  • I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面),它是一个帧内压缩编码帧,压缩比约为7。它将全帧图像信息进行JPEG压缩编码及传输;
  • 解码时仅用I帧的数据就可重构完整图像;
  • I帧描述了图像背景和运动主体的详情;
  • I帧不需要参考其他画面而生成;
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  • 帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  • I帧不需要考虑运动矢量;
  • I帧所占数据的信息量比较大。

(3)P帧

P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,P帧没有完整画面数据,只有与前一帧的画面差异的数据。P帧的压缩率20。

  • P帧是I帧后面相隔1~2帧的编码帧;
  • P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
  • 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
  • P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
  • P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
  • 由于P帧是参考帧,它可能造成解码错误的扩散;
  • 由于是差值传送,P帧的压缩比较高。

(4)B帧

B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,但是解码时CPU使用率会比较高。

  • B帧是由前面的I或P帧和后面的P帧来进行预测的;
  • B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
  • B帧是双向预测编码帧;
  • B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
  • B帧不是参考帧,不会造成解码错误的扩散。

(5)码率控制

  • VBR:Variable BitRate,动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
  • ABR:Average BitRate,平均比特率 是VBR的一种插值参数。ABR在指定的文件大小内,以每50帧 (30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。
  • CBR:Constant BitRate,是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。优点是压缩速度快,缺点是每秒流量都相同容易导致空间浪费。
  • CVBR:Constrained Variable it Rate,VBR的一种改进,兼顾了CBR和VBR的优点:在图像内容静止时,节省带宽,有Motion发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。

(6)H264 Annexb byte-stream格式

在这里插入图片描述

  • SODB:String of Data Bits,数据 bit 流,最原始的编码数据,就是最原始的编码/压缩得到的数据。
  • RBSP:Raw Byte Sequence Payload,原始字节序列载荷,在SODB的后面填加了结尾比特,RBSP trailing bits 一个bit“1”,若干比特“0”,以便字节对齐
  • EBSP:Encapsulated Byte Sequence Payload,扩展字节序列载荷,在RBSP基础上填加了仿校验字节(0x03)。
  • Start-code:在NALU加到Annexb即byte-stream格式时,需要在每组NALU之前添加开始码StartCode,如果该NALU对应的slice为1个GOP开始则用4位字节表示,0x00000001,否则用3位字节表示0x000001(也不一定)。

(7)NALU header

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
NALU Header常见的取值:0x67 0x68 0x65 0x61,0x47 0x48 0x45 0x41,0x27 0x28 0x25 0x21
在这里插入图片描述

(8)NALU start-code

一个NALU包中的数据并不包含它的大小(长度)信息,因此不能简单的连接NALU包来建立一个流,因为你不知道一个包从哪里结束,另一个包从哪里开始。
  Annex B格式用起始码来解决这个问题,即给每个NALU加上前缀码:2个或者3个0x00,后面再加一个0x01, 如:0x000001或者0x00000001。4字节类型的开始码通常只用于标识流中的随机访问点,如SPS PPS AUD和IDR,然后其他地方都用3字节类型的开始码以减少数据量。如果该NALU对应的slice为1个GOP开始则用4位字节表示,0x00000001,否则用3位字节表示0x000001(不一定)
  防竞争字节:为了使NALU主体中不包括与开始码相冲突的,在编码时,就插入一个字节的0x03;解码时将0x03去掉。也称为脱壳操作。
  编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个  起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:
  0x000000->0x00000300
  0x000001->0x00000301
  0x000002->0x00000302
  0x000003->0x00000303
  解码器检测到0x000003时,把03抛弃,恢复原始数据。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。
  由于目前接触的AVCC格式不多,AVCC部分后续有需要在了解。

参考资料:
https://blog.csdn.net/zhaoyun_zzz/article/details/87302600
https://zhuanlan.zhihu.com/p/71928833


http://www.ppmy.cn/news/598675.html

相关文章

视频编解码 — 带宽预测

目录 一、带宽预测作用 二、基于延时的带宽预测算法: 1、算法流程 2、计算延时 3、Trendline Filter 4、网络状态判断 5、带宽调整更新 三、基于丢包的带宽预测算法 1、带宽调整 四、最大带宽探测算法 五、最终的预测选择 一、带宽预测作用 控制音视频发…

AV1:为互联网提供开放、免费的视频编解码工具

从学术研究到进入工业界,Zoe Liu一直在算法和音视频领域,目前在谷歌编解码团队为编解码器AV1做开发支持。Zoe畅谈了评定编解码器的标准,以及AV1的最新进度。本文是『下一代编码器』系列采访之一,欢迎自荐或推荐技术人加入『下一代…

视频编解码 — H264结构

目录 帧类型 GOP Slice 宏块 码流格式 NALU 帧类型 帧类型预测方式参考帧特点I帧帧内编码帧帧内预测无能独立编解码,压缩率小P帧前向编码帧帧间/帧内预测参考前面已经编码的帧和P帧压缩率比I帧高,必要参考帧才能解码B帧双向编码帧帧间/帧内预测参考…

视频编解码流程

相关索引:https://blog.csdn.net/knowledgebao/article/details/84776869 编解码大概流程图(上边是编码,下边是解码): 1,编码过程: Motion Estimate(运动估计,运动搜索): 从前几帧中寻找匹配的宏块&#xf…

Hi35xx视频编解码器

这些都是概念性的东东,不过,能够理解,懂,肯定非常ok了。 视频编解码器是一个支持H.264、JPEG/MJPEG协议的视频编码和视频解码的处理单元,它由运行于ARM处理器上的Video Codec Firmware 和内嵌的视频编解码硬件加速引擎…

3-视频编解码基础

视频编解码基础.md 视频编解码算法分为传统算法和基于深度学习的方法,本文主要介绍视频编解码技术的原理,部分内容和图片参考网上技术博客(链接已放在文章末尾)。 毕设项目演示地址: 链接 毕业项目设计代做项目方向涵盖&#xff…

视频监控与视频编解码技术

视频监控与视频编解码技术 参考文献链接 https://mp.weixin.qq.com/s/UW4Z0vu_Wypc0ddymrOkpg https://mp.weixin.qq.com/s/RfsTTNekpJeIX5DH4ViAqg https://mp.weixin.qq.com/s/smj5bsqXgKuz7RvoLqFKjg https://mp.weixin.qq.com/s/p5gB7q03YfhN-0N7LvQ43g 安防智能视频监控系…

视频编解码之H.264

编解码的必要性 1.为什么要压缩 节省传输带宽;编码可以将数据进行压缩,减少传输资源浪费。节省存储空间:当显示器正在播放一个1280*720视频,帧率是25,那么一秒所产生正常的数据大小为:1280*720(位像素)*25(张) / 8(1字节8位)(结果:B) / 1024(结果:KB) / 1024 (结果:MB) …