![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
H264底层编码技术学习
文章平均质量分 82
H264底层编码技术学习
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
努力努力再努力~~
这个作者很懒,什么都没留下…
展开
-
二十、视频总结
学习内容未包含知识点后续计划H264视频编解码工程实践项目(x264/openH264)多媒体容器封装格式:FLV、MP4、rtmp移动端音视频开发(IOS/android)FFMPEG深入解析原创 2021-06-27 15:26:34 · 181 阅读 · 0 评论 -
十九、帧间预测编码_5、skip模式和direct模式
帧间预测的几种特殊模式:P_Skip: 即COPY模式,在该模式下无运动矢量残差,无像素预测残差。重建时以MVP作为实际运动矢量,以预测像素块作为重建;B_Skip:同P_Skip类似的是该模式下同样无运动矢量残差,无像素预测残差。重建时,以Direct模式获取双向MV,以预测像素块作为重建;B_Direct:B_Direct模式分为B_Direct_8x8和B_Direct_16x16,分别表示整个宏块和一个子块按照B_Direct模式编码。该模式下,无运动矢量残差,有像素预测残差。重建时,以D.原创 2021-06-27 15:17:26 · 1878 阅读 · 0 评论 -
十九、帧间预测编码_4、宏块的帧间预测解码
帧内预测宏块解码:通过帧内预测获取预测块,然后使用残差数据的反量化、反变换获取残差像素,通过残差像素与预测像素的求和来构成重建的像素块;帧间编码宏块:思路大体一致,只是预测方式改变了,通过参考帧和运动矢量来获取相应的像素块,然后执行反量化变换等;一、帧间预测宏块类型在讨论帧内预测的章节中我们已经讨论过部分宏块类型的分类。我们知道,对于帧间编码的宏块,其划分方式可以分为两步,其一为宏块级划分,其二为子宏块级划分。下面分别讨论这两个步骤。1.1 帧间预测宏块划分对于P宏块,其宏块级划分有4种方式:16原创 2021-06-24 23:35:57 · 600 阅读 · 1 评论 -
十九、帧间预测编码_3、参考帧列表
一、参考帧列表在上一篇博文中我们已知,对于每一个P帧和B帧的解码都需要从解码图像缓存DPB中选择某个参考帧DPB中的参考帧可分为短期参考帧和长期参考帧两种短期参考帧按照PicNum进行索引长期参考帧按照LongTermFrameIdx索引。通过这两个索引值可以在参考帧列表中获取对应的参考帧图像。解码不同的帧类型时,参考帧列表不同当解码一个P或SP帧时,使用一个参考帧列表RefPicList0;当解码一个B帧时,使用两个参考帧列表RefPicList0和RefPicList原创 2021-06-22 23:35:25 · 941 阅读 · 1 评论 -
十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理
一、基本概念1.1H.264的解码顺序和显示顺序:解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码由于B帧的存在,视频帧在输出时会进行顺序重排1.2frame_num与POCframe_num:表示解码顺序POC:表示显示顺序(picture_order_count)在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中)1.3参考帧列表某一帧图像在解原创 2021-06-16 23:29:03 · 1105 阅读 · 1 评论 -
十九、帧间预测编码_1、帧间预测编码的基本原理
一、视频的时间冗余1、帧内预测与帧间预测编码的区别帧内编码:不依赖参考图像,可以独立解码,因而可以作为一个GOP的起点和随机接入点,即IDR帧输出的码率相对较高,即压缩率较低帧内编码为了确保可独立解码这一最关键的特性,只利用了图像的空间冗余进行压缩,无法充分利用视频信息前后帧之间的关联帧间编码:帧间编码所利用的是视频的时间冗余,主要编码运动(运动矢量)和纹理(预测残差)信息压缩率较高通常在视频信息中,每一帧所包含的物体对象与其前后帧之间存在运动关系,这种物体的运动关系即构成帧与帧原创 2021-06-12 09:51:52 · 4915 阅读 · 0 评论 -
十七、熵编码_CABAC的上下文环境
一、CABAC中的概率模型1、为什么采用概率模型构建模型:对每一个符号(即经过二值化的语法元素中的每一个bit值)分配一个概率分布模型概率模型直接决定了编码截断的性能在构建概率模型时,应尽可能地使该模型可以符合符号的统计情况,并且在编码的过程中实时更新在H.264编码的实际应用中,为了尽可能降低编码的运算量,CABAC定义了基于查表的的概率模型。每当编码完一个bit值需要更新索引时,编码器不再是通过计算更新概率,而是通过查表来获取最新的上下文。2、CABAC上下文模型的定义我们已经知道,在原创 2021-06-07 23:27:24 · 842 阅读 · 0 评论 -
十八、去块滤波器
一、去块滤波器基本原理1.1去块滤波的作用去块滤波器(Deblocking Filter)是视频编解码器中的重要组成部分核心作用在于消除编码过程中产生的图像块效应提升整体视觉主观体验,否则编码再解码的数据看起来就上罩了一层铁丝网一样1.2块效应的产生图像中的块效应主要因为以宏块为基本单元的编码结构而产生。在编码中,每个宏块的子块都会按照既定分割方式进行预测、变换和量化编码,在这个过程中可能导致块效应的因素主要有以下几种:由于变换和量化编码的运算精度误差导致边界出现不连续由于码率设置较低原创 2021-05-30 10:00:22 · 1102 阅读 · 1 评论 -
十七、熵编码_CABAC语法元素的二值化
一、上下文自适应的二进制算术编码在上篇博文十六、算术编码_1、基本原理与实现,然而在实际的H.264编解码的方法中,显然是不可能采用上文中简单的算法来实现。H.264采用的算术编码方法:上下文自适应的二进制算术编码(Context-based Adaptive Binary Arithmetic Coding, CABAC)CABAC:H264中首先采用的、专用于视频压缩编码的熵编码算法在视频编码的发展中保持了强大生命力,并在H265中保留继承在CABAC中,主要步骤或算法可以分原创 2021-05-23 19:59:59 · 627 阅读 · 0 评论 -
十六、算术编码_2、算术编码举例实现
在一次算术编码的执行前,为简便起见,首先假设输入的信源为0/1的二进制信源,0和1的概率比为7:3。即二者的概率为:p(0) = 0.7;p(1) = 0.3;假设输入的待编码信息为[0, 0, 1],在编码每一个符号时,都需要对概率区间进行分割,并通过与编码区间进行比较,判断是否输出码流的bit位,以及更新编码下一个符号的上下文。在第一次进行分割之后,概率区间和编码区间的关系如下图所示:第一个字符的概率区间分割之后,不满足输出码流的条件,因此结束这个字符的编码,准备开始编码下一个字符。第二原创 2021-05-21 22:00:34 · 3410 阅读 · 0 评论 -
十六、算术编码_1、基本原理与实现
一、前言在前面的学习中我们已经了解到熵编码是利用信息的统计冗余进行数据压缩的无损编码方法,并且已经讨论过了熵编码的基本原理、H.264中使用的语法元素解析算法“指数哥伦布编码”的算法与实践,讨论了在H.264中非常重要的一种熵编码方法,即上下文自适应的变长编码(CAVLC); 以上的内容在H.264的baseline profile中具有广泛应用。然而在实际应用场景中更为流行的通常是main profile,在main profile中为了进一步提升压缩比率,采用的熵编码方法不是CAVLC,而是压缩效原创 2021-05-20 23:19:25 · 1984 阅读 · 0 评论 -
十五、帧内编码:4、生成预测像素块
在获取了13个预测像素点之后,再根据第2节计算出的预测模式,便可以获取相应的预测块数据。该部分在标准文档的8.3.1.2.1到8.3.1.2.9节定义。模式0:垂直模式当前块的帧内预测模式为0时,使用垂直模式生成预测块。该模式只有预测像素p(0,-1)~p(3,-1)有效的条件下可用。预测块的计算方法为:pred4x4L[ x, y ] = p[ x, −1 ], with x, y = 0..3//其实就是x的一整列都是同一个值模式1:水平模式当前块的帧内预测模式为1时,使用水平模式生成预测原创 2021-05-12 23:57:53 · 345 阅读 · 2 评论 -
十五、帧内编码:3、获取预测数据
1、获取预测数据该部分主要实现的功能是通过参考数据和帧内预测模式,获取当前子块的预测块。此部分定义在标准文档的8.3.1.2节。该步骤通过当前块的预测模式以及相邻块的参考像素值,输出当前块的一个预测块数据。对于某一个4×4像素块,其参考像素包括13个像素点。如果(x,y)表示参考像素点相对于像素块左上像素的相对位置,则x和y的取值分别为:x=-1, y=(-1, 3);x=(0, 7), y=-1。以图表示如下所示:(下图表示的一个一个的像素)根据当前块在图像中的位置(xO,yO)与参考像素的相对位原创 2021-05-09 18:59:56 · 204 阅读 · 0 评论 -
十五、帧内编码:2、预测当前块的预测模式
从协议文档规定中来学习如何导出某一个子块,即一个宏块内部的4 * 4像素块,他是如何计算帧内计算模式的,以及如何通过帧内预测计算出这16个像素的预测块。一、宏块预测结构在前面的博文:【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构中,我们解析了H.264码流中的宏块结构,并且分析了其中的语法元素mb_pred()。mb_pred()包含了帧内预测宏块的预测数据,其定义为:其中,表示帧内预测模式的语法元素有:prev_intra4x原创 2021-05-05 09:31:00 · 2263 阅读 · 1 评论 -
十五、帧内编码:1、帧内编码的基本原理
帧内编码相对其他模块来说相对简单一、帧内编码的重要意义帧内编码时I帧主要的压缩编码方法,帧内编码的性能对视频整体编码结果具有重要影响I帧在编码时只采用当前帧的图像内部数据,体积通常比B/P帧更大,对整体码率的影响很大I帧在帧间编码中通常作为B/P帧的参考数据,如果I帧编码出现错误,将影响B/P帧的编码结果二、早起视频压缩标准的帧内编码1、简介在早期的视频编码标准MPEG-1/MPEG-2中,帧内编码已经发挥重要作用,只不过是比H264简单的多。MPEG-1/MPEG-2中已经定义了原创 2021-05-04 09:58:33 · 4147 阅读 · 1 评论 -
十四、变换编码:2、H264的整数变换方法——整数变换与量化
一、背景为了进一步节省图像传输码率,需要对 图像信号进行压缩,通常采用变换编码及量化消除图像信号中的相关性及减少图像编码的动态范围。H264中整数变换及量化的具体过程如下图所示:二、整数变换1、实数DCT对于H264,由离散余弦公式得到,4 * 4大小的离散余弦变换矩阵为:将相同的部分用符号表示:从残差矩阵到系数矩阵的变换为:2、整数DCT由于在解码端的浮点运算精度问题,会造成解码后的数据的失配,进而引发漂移,;所以对其进行改造,采用整数DCT技术,有效地减少计算量,同时不损失原创 2021-05-03 15:01:39 · 1066 阅读 · 1 评论 -
十四、变换编码:1、矩阵运算、正交变换、离散余弦变换基本概念
一、矩阵(Matrix)矩阵的定义由m * n个数字按照m行、n列排列成的数表称为矩阵如变换系数的基本单位即为4 * 4的矩阵矩阵在多个领域中起重要作用多媒体信息处理机器学习/人工智能等二、矩阵的运算矩阵可以参加运算同型矩阵可以进行加减运算:(同型:行列相等,相同位置进行加减)矩阵可以与数相乘满足相应条件的矩阵可以进行相乘运算矩阵与向量只有一行或一列的矩阵又称向量行向量或列向量:一般我们使用的是列向量矩阵的线性乘法:矩阵与矩阵相乘会略显复杂,原创 2021-05-02 20:27:57 · 1431 阅读 · 4 评论 -
十三、熵编码CAVLC:3、色度块、intra16*16模式的解析
色度块、intra16 * 16模式块的解析思想类似4 * 4亮度块:依次解析numCoeff、trailingOnes、trailingSigns(拖尾系数符号)、levels、totalZeros、runBefore(每个非零系数前连续的0的个数)不同之处:1、每个单元内容系数数量最大值:对于4*4来说最大为16,但是对色度和16 *16来说是不同的,因为他们的AC\DC是分别解析的2、AC\DC(交流、直流)是否分别解析:直流是指最左上角的块,其余的都是交流3、nc值得计算方法:.原创 2021-05-02 18:44:01 · 354 阅读 · 0 评论 -
十三、熵编码CAVLC:2、编码上下文的确定与相邻块的有效性
1、前言在实际进行预测残差的解析之前,还需要明确几个概念。我们已经知道一个宏块从亮度角度是16 * 16,然后编码器是不可能对一个16 * 16 的宏块整体编码的,在实际的编码中一个16 * 16 = 256个像素的编码,会进行两次分级。并且在两次分级中进行一系列的控制操作。2、宏块分级首先在两次分级中:第一次采用的是cbp信息,在解析宏块结构中会得到一项非常重要的数据是coded_block_pattern,在一个宏块中,cbp会将这16 * 16的像素分为4个8 * 8的像素,并且通过CBP中原创 2021-04-17 19:34:18 · 323 阅读 · 0 评论 -
十三、熵编码CAVLC:1、编码原理
一、引言在前述的几章节的博文/视频中,我们已经了解到:编码后可无失真还原信源信息熵编码是利用信息的统计冗余进行数据压缩的无损编码方法利用信源符号的概率特性,使编码后的信息尽可能接近信源的熵H.264码流结构(如NAL Unit、Slice Header等)的解析中,大多使用定长编码或者指数哥伦布编码实现预测残差等占据码流大量体积的数据则必须使用压缩率更高的算法,如CAVLC和CABAC等变长编码:哈夫曼算法、香农-费诺编码、指数哥伦布编码算法编码二、CAVLC的基本原理CAVLC的原创 2021-03-24 22:30:16 · 919 阅读 · 0 评论 -
十二、解析H.264码流的Slice数据和宏块结构
一、slice data结构的定义1、slice data描述h.264中slice结构的主体部分slice data在slice中紧跟在slice header之后主要结构由连续和间隔的多个宏块结构组成(因为根据编码器的配置,一部分宏块可能采取跳过模式,在码流中就不存在它的信息,完全可以使用其他宏块就表示,就不在传输这个宏块,达到节省码流的目的)2、slice data在码流中的结构slice的主体实际上是slice data即slice body,slice data的主体实际上是一个个原创 2021-03-20 10:49:57 · 1486 阅读 · 0 评论 -
十一、H.264的Slice Header解析
一、slice的概念1、H.264的码流结构可以分为两层:网络抽象层NAL:在NAL层,H.264的码流表示为一系列的NAL Units,不同的NAL Units中包含不同类型的语法元素。前面两篇中所解析的序列参数集SPS和图像参数集PPS就是其中重要的两个部分,其中包含了控制解码过程的一些通用的参数。视频编码层VCL: 保存原始视频的图像数据2、H.264的条带:Slice表示视频图像数据的NAL Unit包含的语法元素IDR Slice NAL type:5none-IDR Slic转载 2021-03-15 23:36:04 · 1808 阅读 · 0 评论 -
十、图像参数集Picture Paramater Set(PPS)解析
除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS)。通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。一、图像参数集PPS的定义在H.264的协议文档中,PPS的结构定义在7.3.2.2节中,具体的结构如下表所示:二、PPS中的语法元素1、pic_paramete转载 2021-03-14 20:44:34 · 957 阅读 · 0 评论 -
九、序列参数集Sequence Paramater Set(SPS)解析
在H.264标准协议中规定了多种不同的NAL Unit类型,其中类型7表示该NAL Unit内保存的数据为Sequence Paramater Set。在H.264的各种语法元素中,SPS中的信息至关重要。如果其中的数据丢失或出现错误,那么解码过程很可能会失败。SPS及后续将要讲述的图像参数集PPS在某些平台的视频处理框架(比如iOS的VideoToolBox等)还通常作为解码器实例的初始化信息使用。一、什么是SPSSPS即Sequence Paramater Set,又称作序列参数集:SPS中转载 2021-03-14 20:41:06 · 1051 阅读 · 0 评论 -
八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码
由于种种问题,哈夫曼编码并没有作为一种实际应用的技术使用到实际编码算法中;本节看下H.264中实际使用的熵编码算法:指数哥伦布编码一、H.264中熵编码基本方法熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流之前我们成功从NAL Unit中获取到语法元素的码流之后,接下来就是对语法元素的码流进行解析。熵编码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用在H.264的标准协议中,不同的语法元素指定了不同的熵编码方法。在协议文档中共指定了10种语转载 2021-03-14 10:26:08 · 908 阅读 · 0 评论 -
七、熵编码算法(1):基础知识
一、熵编码的概念熵化学和热力学,用于度量能量退化的指标熵越高,物体或系统的做功能力越低信息学中的熵表示信源所发出信息的不确定性越是随机的、前后不相关的信息,其熵越高信源编码定理说明了香农熵与信源符号概率之间的关系信息的熵为信源无损编码后的平均码字长度的下限任何的无损编码方法都不可能使编码后的平均码长小于香农熵,只能使其尽量接近 前面的表述球之间的关系相对于后面这个是比较繁琐的,而且由于前面的排列之间没有任何的规律,进行改进和压缩的空间也就比较小了;因此:混乱程转载 2021-03-12 10:19:54 · 1797 阅读 · 0 评论 -
六、NAL Unit解析
一、NAL Unit结构NAL Unit:NAL Unit = NAL Header + NAL BodyNAL Header:一个字节,包括:forbidden_zero_bit:规定必须为0禁止位,1 bit;nal_ref_idc:第2和3位,主要表示NAL的优先级。当该值为正时,表示当前NAL Unit中包含了SPS、PPS和作为参考帧的Slice等重要数据,2bitnal_unit_type:5bit,表示NAL Unit的类型,包括VCL层和非VCL层的多种数据类型。常见的转载 2021-03-11 00:14:23 · 612 阅读 · 0 评论 -
五、H.264码流结构
NAL Unit封装格式 H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流。对于不同的应用场景,NAL规定了一种通用的格式适应不同的传输封装类型。 通常NAL Unit的传输格式分两大类:字节流格式和RTP包格式;1、Annex B字节流格式:大多数编码器实现的默认输出格式以连续的bit字节的形式传输码流,因此每个NAL Unit以规定格式的起始码分割起始码:0x00 00 00 01或0x 00 00原创 2021-03-10 00:04:27 · 392 阅读 · 0 评论 -
四. H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码
实H.264是一种视频压缩标准,其只规定了符合标准的码流的格式,以及码流中各个语法元素的解析方法。 H.264标准并未规定编码器的实现或流程,产生了一些比较著名的开源H.264编解码器工程。其中H.264编码器中最著名的两个当属JM和X264,这二者都属于H.264编码标准的一种实现形式。JMJM通常被认为是H.264标准制定团队所认可的官方参考软件;实现了H.264标准的全部特征;运算过程较为复杂,而且没有采用汇编优化等加速方法,因此运行速度较慢,很难达到实时编解码。常用于编解码技.原创 2021-03-09 01:02:02 · 3911 阅读 · 0 评论 -
三、H.264简介、整体结构、使用的技术
一、H.264背景H.264/AVC第一版于2003年发布同MPEG-4重点考虑的灵活性和交互性不同,H.264着重强调更高的编码压缩率和传输可靠性,在数字电视广播、实时视频通信、网络流媒体等领域具有广泛的应用H.264最初版本支持8bit/sample,4:2:0色度采样,主要针对大部分通用视频处理与传输场合,未对特殊应用做处理特殊应用公可能需求源视频数据精度超过8bit色度采样使用4:2:2或4:2:0超高码率或超高分辨率编码超高保真度,或部分无损编码之后为解决这些应用场景的需原创 2021-03-07 22:06:14 · 843 阅读 · 0 评论 -
二、主流视频编码标准的发展:H.261\H.263\MPEG-1\MPEG-2\MPEG-4
一、发展历程:频编码标准主要由两个国际组织负责制定:国际电信联盟ITU-T和国际标准化组织ISO除了上述两个组织之外,其他比较有影响力的标准还有:Google:VP8/VP9;Microsoft : VC-1;国产自主标准:AVS/AVS+/AVS2二、H.261标准1、简介第一种采用“块结构的混合编码”方案的编码标准目的:视频会议,可视电话等低码率视频图像传输数据格式:公共中间格式各国电视制式不统一,无法互通在使用H.261进行编码之前,首先转换为CIF格式然后再编码原创 2021-03-07 15:37:32 · 2033 阅读 · 0 评论 -
一、视频信息的表述方式与压缩编码简介
课程规1、视频压缩编码标准H.264基本概念从0开始,以一个H.264码流分析器的形式,解析H.264的压缩算法高层语言解析NAL解析各层语法元素解析由语法元素重建图像2、参考代码JM的研究:基本结构和实现方式H.264\X264\JM三者的区别: H.264是一个编码标准,x264和JM一样,都是H.264标准的实现一、视频信息与压缩编码人与世界的交互嗅觉、听觉、视觉、味觉、触觉3、...原创 2021-03-07 14:08:44 · 854 阅读 · 0 评论