
编解码
文章平均质量分 83
言午许成长
全网同名;
职场老司机,丰富的被PUA经历;
自媒体新人,日更写作200天
展开
-
H264/AVC-编码方式:帧、场以及宏块帧场自适应(MBAFF)
本文主要介绍H264编码方式:帧、场、帧场自适应原创 2021-08-05 17:59:05 · 2699 阅读 · 0 评论 -
H264编码-码率控制原理以及JM代码分析
码率控制的主要目的是控制每一帧图像编码输出的比特数,并在总比特数一定的约束条件下使图像失真最小。当然,由于视频图像质量及其编码复杂性,码率控制的目标并不是单一的。常见的控制目标包括:提高输出码率控制精度使其最大程度的接近目标码率;提高编码后输出比特流的峰值信噪比;减少码率波动;提高编码速度等。码率控制是一个多约束条件、多目标的优化问题。码率控制涉及视频质量和信道带宽的折衷。减少码率会牺牲质量,质量提高就会增加码率。常用的码率调节手段包括:调节编码帧率。当码率高于信道时,通过丢帧来降低码率;当码率低于信原创 2021-07-12 21:02:12 · 3483 阅读 · 0 评论 -
H264编码- 码率控制 RQ 模型参数推导过程以及JM代码分析
本文主要介绍H264码率控制过程中,RQ模型参数更新原理以及推导过程,并结合JM19.0代码分析其功能实现原创 2021-07-12 20:58:52 · 2094 阅读 · 0 评论 -
H264/AVC-基于上下文自适应可变长编码CAVLC原理以及代码实现
1. 基本原理CAVLC属于熵编码。熵编码是一种无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立在随机过程的统计特性基础上的,因此它主要为了降低数据的统计冗余。在 H.264 的 CAVLC(基于上下文自适应的可变长编码)相比于huffman编码,它可以通过根据已编码句法元素的情况自适应调整当前编码中使用的码表,从而取得了极高的压缩比。下面举例说明CAVLC的基于上下文特性。下图是色度分量DC系数解析要用到的码表,其中tzVlcIndex指的是非零DC系数个数(色度DC系数原创 2021-07-01 14:48:26 · 2654 阅读 · 2 评论 -
一文搞懂H264量化原理以及计算过程
1.概述量化是使数据比特率下降的有效工具。量化过程的输入值动态范围很大,需要较多的比特才能表示一个数值,量化后的输出则只需要较小比特表示。量化是不可逆过程,处理过程中有信息丢失,存在量化误差。H.264采用标量量化技术,它将每个图像样点编码映射成较小的数值。一般标量量化器的原理为:FQ=round(y/QP)FQ=round(y/QP)FQ=round(y/QP)其中,y 为输入样本点编码,QP 为量化步长,FQ 为 y 的量化值,round()为取整函数(其输出为与输入实数最近的整数)在量化和原创 2021-06-30 14:36:58 · 7020 阅读 · 2 评论 -
VVC/H266资源汇总(提案、VTM代码等)
HHI,包括VTM代码和标准文档https://jvet.hhi.fraunhofer.de/VVC JVET提案https://jvet-experts.org/VVC JVET会议记录和测试验证码流https://www.itu.int/wftp3/av-arch/jvet-site/原创 2021-06-22 13:53:44 · 1691 阅读 · 0 评论 -
AVC/H264-帧间预测
帧间预测是H264标准中的一种基于时间冗余的压缩方法。因为视频流相邻帧存在时间相关性,相邻帧的视频内容差异不大,因此可以通过前后相邻帧的数据预测当前宏块内容,从而达到压缩数据目的。帧间预测处理的基本单元是宏块内的最小子分块,比如一个宏块如果分为16个P_4x4块,则需要对每个4x4块分别做帧间预测。帧间预测的输入为:宏块分块索引mbPartIdx、子宏块分块索引subMbPartIdx,这两个变量主要用于确定当前处理分块在图像的位置;当前分块的大小,包括亮度分量和色度分量(partWidth、par原创 2021-06-04 13:53:57 · 2339 阅读 · 0 评论 -
H264/AVC-帧内预测相邻像素推导过程
帧内预测过程会以相邻块的像素值做参考,来预测当前块的像素值。以Intra_4x4为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值?本文要主要说明如何获取帧内预测所用到的相邻像素。对应参考文档6.4.5-6.4.9小节内容。获取相邻像素的流程如下:找到当前块(可以为4x4、8x8、16x16大小)的左、上、右上、左上相邻块找到左、上、右上、左上相邻块所在宏块根据当前宏块以及相邻块所在宏块确定相邻像素在此之前需要先知道宏块地址是否可用,如果宏块地址不可用,则在该宏块的相原创 2021-05-29 16:29:38 · 1583 阅读 · 1 评论 -
H264/AVC-slice data解析
slice header解析slice data主要存放了该slice所有宏块信息以及残差数据。slice data语法结构slice data解析流程如下:获取当前宏块位置CurMbAddr;如果当前slice不是I slice,则存在skip 宏块。因此需要根据熵编码类型解析skip宏块标记。1)对于cavlc,mb_skip_run表示当前宏块与上一宏块位置的差值,如果差值大于1,则梁洪快间存在skip宏块;2)对于cabac,每一个宏块都存在一个mb_skip_flag表示该宏块是原创 2021-05-28 09:39:40 · 1904 阅读 · 0 评论 -
H264/AVC-slice header解析
一个slice语法由slice header和slice data构成,slice header表示该slice的基本语法,slice data则存放了该slice中所有宏块的数据。slice header语法结构first_mb_in_slice:表示该slice的第一个宏块在图像中的位置。一个图像可能分为多个slice单独编码,因此可以通过first_mb_in_slice确定该slice是否为一个完整的图像。1)如果MbaffFrameFlag 等于 0, 也就是该slice不是mbaff,原创 2021-05-27 10:25:24 · 2539 阅读 · 0 评论 -
H264/AVC-PPS(图像参数集)解析
什么是PPSpps(picture parameter set)图像参数集,是指码流中多个图像共用的参数信息。为减少每一帧编码bit,把一定范围内连续图像的相同参数提取出来,单独编码为pps,从而避免每一个slice都重复编码这些参数。如下图所示,蓝色部分为pps数据。PPS的语法结构pic_parameter_set_id当前PPS的唯一id,取值范围为0-255,也就是说一个码流中最多存在256个PPS。slice header中有一个pps_id用于指明该slice使用哪个pps中的参原创 2021-05-26 17:00:57 · 1655 阅读 · 0 评论 -
H264/AVC-SPS(序列参数集)解析
1.什么是SPS一个H264码流序列中,每个slice都会有各自的编码参数,其中有些参数在整个码流序列中不会改变,为节省码流,把这类参数提取出来放入SPS单独编码。这些参数就是SPS。SPS是 nalu 单元的一种,它的nalu type是7。以一个h264码流为例,蓝色数据就是SPS。2.SPS的语法结构SPS语法结构如下:profile_idc/level_idc:h264通过 profile_idc 和 level_idc 来确定该码流支持哪些特性。我们的测试码流中 profile原创 2021-05-14 14:47:03 · 2317 阅读 · 0 评论 -
H264/AVC-去块滤波(loop-filter)
H264视频编码标准中,在解码器反变换量化后会出现块效应。其产生的原因有:量化过程是有损的,会引入误差。变换系数的量化过程相对粗糙,因而反量化过程恢复的变换系数带有误差,会造成图像块边界上视觉不连续;运动补偿预测。运动补偿是从不同帧的不同位置上内插采样点数据复制而来。因为运动补偿块的匹配不可能绝对准确,所以会在边界上产生数据不连续。因此,需要一个去块滤波器改善画面质量。1. 边缘滤波顺序对于整个解码图像,按照宏块地址增加的顺序为所有重建后的宏块执行滤波过程。滤波过程对宏块的亮度块和色度块分别进原创 2021-05-14 11:18:34 · 1774 阅读 · 0 评论 -
H264/AVC-帧间预测1(skip和direct预测模式的mv和ref_idx的推导)
在宏块类型里介绍了I、P、B slice中的宏块类型解析,其中P_Skip、B_Skip、B_Direct这几种宏块类型并没有在码流中编码宏块运动矢量和参考帧索引信息。本文主要介绍这几种情况下,mv和ref_idx推导过程。mv预测在帧间预测编码模式下,每个分块都有一个或两个mv需要编码。当采用小尺寸编码时,一个宏块内需要编码的mv也越多,所需比特额越多。同时,mv有两个值并且以1/4像素为单位,这也就意味着mv的数值还不小,因此有必要对mv进行压缩。H264标准利用临近块mv的相关性对当前块mv进行原创 2021-05-13 17:33:31 · 3990 阅读 · 0 评论 -
H264/AVC学习框架总结以及链接汇总
整理了这段时间学习的H264标准,标准种的知识点比较多,有些内容前段时间学习了,过段时间又忘了,还是要做好笔记。接下来的时间会逐渐完善学习总结文档。码流解析这部分主要分析H264码流结构以及语法元素码流结构宏块类型解析NALU解析解码流程这部分主要分析H264解码流程中的各个模块实现帧内预测帧间预测(未完成)整数DCT变换参考帧管理解码参考图像标记POC计算参考帧队列重排...原创 2021-05-06 15:04:45 · 849 阅读 · 3 评论 -
H264/AVC-帧内预测
I宏块使用帧内预测编码压缩数据,根据相邻宏块数据恢复当前宏块信息。值得注意的一点是,帧内预测所参考的相邻宏块数据是deblocking之前的像素值,因为上一宏块的deblocking依赖当前宏块像素值,但当前宏块数据还未重建。1.帧内预测类型帧内预测包含4种类型:亮度4x4块Intra_4x4预测方式亮度8x8块Intra_8x8预测方式亮度16x16宏块Intra_16x16预测方式色度8x8块预测方式。帧内预测的输入为预测模式和相邻块像素值,输出为当前块的预测值。2. 亮度Intr原创 2021-05-04 12:05:34 · 2849 阅读 · 0 评论 -
H264/AVC-宏块类型
基本概念H264中常见的几种宏块有I、P、B宏块,宏块类型由宏块头中的mb_type确定。其中I slice中只允许存在I宏块,P slice允许存在P宏块和I宏块,B slice允许存在I宏块和B宏块。为节省编码码流,mb_type包含了多个信息,比如该宏块的划分方式,子块预测方式,cbp等。1.1 宏块划分方式I宏块支持16x16、4个8x8块、16个4x4块划分方式;P宏块支持16x16、2个16x8块、2个8x16块、4个8x8块(8x8块还需要再次划分)B宏块支持16x16、2个1原创 2021-04-30 19:19:03 · 3441 阅读 · 2 评论 -
H264/AVC-NALU解析
简介NALU是H264码流的基本单元。它的起始码是0x000001或0x00000001,可以根据起始码查找NALU元素。如下图所示,H264中NALU由header和body两部分构成。NALU headerforbidden_zero_bit,必须为0nal_ref_idc, 如果nalu_type为slice,表示该slice是否用作参考nal_unit_type,表示nalu类型NALU类型定义如下,一般比较常见的几种类型是非IDR slice(type=1)、IDR(type=原创 2021-04-29 15:54:25 · 1236 阅读 · 0 评论 -
H264/AVC-基本概念和码流结构
1.基本概念1.1 sliceH264标准引入了slice概念,一帧图像可以分成几个slice分别进行编码。这样的好处是可以避免误差扩散。由于slice是单独编码,一幅图像前一个slice出错,不会影响到后一个slice。如下图所示,一个图像被分成两个slice。1.2 宏块H264标准规定slice需要分成16x16大小的块分别编码,这些数据块就是宏块(macroblock)。以YUV420数据为例,一个宏块包含16x16亮度数据块和2个8x8色度数据块。宏块按照数据编码方式可分为帧宏块和场原创 2021-04-29 14:30:45 · 1584 阅读 · 0 评论 -
H.264/AVC学习-解码参考图像标记
本文对应H.264标准文档8.2.5节从解码流程来看,解码完一帧图像后,需要对图像存储处理。存储参考帧的缓冲区称为解码图像缓冲区(DPB,decoded picture buffer)。如果当前图像被其他图像参考,还要对图像进行参考标记。当 nalu header中的语法元素nal_ref_idc不等于0,表示该nalu对应的图像是参考图像,此时需要对图像进行标记操作。标记过程按照slice header中dec_ref_pic_marking语法处理。参考图像标记的目的主要是,管理图像缓冲,对于不原创 2021-04-02 15:38:02 · 1340 阅读 · 0 评论 -
H.264/AVC学习-POC计算
POC(picture order counts)用来表示解码帧显示顺序,当码流中存在B帧时,解码顺序和显示顺序不一样,视频帧显示时需要根据POC重排顺序,否则会出现跳帧、画面不连贯。比如,对于IPBB这项顺序的视频序列,解码顺序为 I-P-B-B,但它的显示顺序为 I-B-B-P。1.基本概念对于H.264的码流,需要计算POC包括三种:coded frame(编码帧), coded field(编码场)和complementary field pair(互补参考场对),每种类型的POC都由 Top原创 2021-04-01 13:27:20 · 2331 阅读 · 0 评论 -
deflate算法总结
参考资料:1.gzip压缩系列2.1.deflate压缩Deflate是一种数据无损压缩算法,它广泛用于zip文件压缩以及png图片压缩。deflate结合了huffman编码和LZ77编码,流程如下:1.LZ77算法,利用相邻数据的相关性对原始数据压缩,该模块输入为原始数据,输出为literal、distance-length数据对;2.huffman编码,对LZ77的结果分别进行数据统计生成huffman表,再对数据进行huffman编码。该模块的输入为literal和distance-原创 2021-03-22 10:13:42 · 13388 阅读 · 1 评论 -
转载:【压缩原理】 deflate 算法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.youkuaiyun.com/tuwenqi2013/article/details/103758292———————————————— 目录 1 概述 2 LZ77算法原理 2.1 压缩 2.2 解压缩 3 Huffman编码 3.1 构造霍夫曼树 4转载 2021-03-09 11:45:15 · 1526 阅读 · 0 评论 -
JPEG文件格式及其解码流程
jpeg是1992年发布的图片编码标准,20多年过去了,它在如今图片压缩领域仍然占据着重要地位。本文主要针对标准ISO/IEC 10918-1 分析jpeg文件结构以及解码流程。1.文件结构1.1 基本单元Jpeg文件由一个一个段来存储。段的一般结构为:前两个字节为段标识(第一个字节为0xff,第二个字节对于不同段,这个值是不同的),后面紧跟两个字节为该段的长度,该长度不包含段标识的两个字节。名称字节数数据说明段标识10xff每个段的开始标识段类型1段类型标原创 2021-02-26 11:22:03 · 6220 阅读 · 0 评论 -
mpeg标准8x8DCT变换以及定点化实现
Mpeg1/2标准的DCT变换与H264的整数DCT不太一样,会有小数运算。硬件实现时会做定点化处理,因此也会产生误差,误差主要体现在某些数值小数部分在0.5左右。比如小数运算时数值为4.4999,四舍五入最终像素值为4;如果定点化结果为4.50001,实际上与小数运算差异不大,但最终像素值却相差1。1.DCT简介DCT和DCT反变换可用如下公式表示:其中,Xij是图像块 X 中第 i 行第 j 列图像或残差值,Ymn 是变换结果矩阵 Y 相应频率点上的 DCT 系 数。可以用矩阵表示Y=AXAT原创 2021-01-04 15:53:27 · 3072 阅读 · 5 评论 -
从零开始实现一个简单的mpeg1解码器
前面介绍了mpeg1视频标准,现在来实现一个mpeg1解码器。代码已上传github:https://github.com/xuqi62/mpeg1dec该工程是基于VS2015开发。主要完成mpeg1裸码流的解码,输出YUV数据。下面主要介绍在实现过程中一些需要注意的地方。码流解析解码一个mpeg1裸流,第一步肯定是按照官方文档从码流中解析metadata和视频压缩数据。有以下注意事项:mpeg1裸流有两种:一种是不带system start code,这种可以直接按照文档 11172-2 中原创 2020-12-30 21:02:36 · 1005 阅读 · 0 评论 -
mpeg2视频解码标准简介
mpeg2是mpeg1标准(mpeg1介绍请点这里)的扩展,主要增加以下特性:支持interlace视频支持可伸缩编码(由于该特性工作中用不到,没有深入分析)1.码流结构Mpeg2的码流语法结构大致与mpeg1一致,只增加了部分扩展元素。如果第一个sequence_header之后没有紧跟一个sequence_extension结构,则该码流遵循mpeg1标准,否则是mpeg2;如果第一个sequence_header之后紧跟一个sequence_extension结构,则后续所有sequ原创 2020-12-11 09:17:30 · 2200 阅读 · 0 评论 -
interlace和progressive
转自:http://blog.sina.com.cn/s/blog_887884050100yeun.html 更详细:http://blog.163.com/liukang_0404@126/blog/static/556825812012415115653715/ 隔行扫描(Interlaced)和逐行扫描(Progressive)都是在显示设备表示运动图像的方法,隔行扫描方式是每一帧被分割...转载 2020-12-10 11:49:25 · 2474 阅读 · 0 评论 -
mpeg1视频解码标准简介
1.概述Mpeg1是上世纪90年代提出来的视频标准,比较古老了。其特性包括:视频压缩编码,压缩后码率在 1.5Mbps,可用于视频传输和视频存储;编码前必须将视频图像转换成逐行扫描图像。录像机的正放、图像冻结快进、快退和慢放功能以及随机存储功能。2.码流结构如图所示,Mpeg1码流结构可以分为以下几层:码流由一个序列头和多个GOP组成,并以endcode结尾;GOP是一组可以单独解码的图像,是mpeg1码流实现随机播放的基本单元;GOP内第一个编码帧是I帧;Piture层:Mpeg1标原创 2020-12-09 13:36:15 · 3082 阅读 · 0 评论 -
H264-整数DCT变换和蝶形变换代码实现
背景为压缩数据,H264标准需要使用整数DCT变换把图像信号转换到频域。变换过程实际上就是矩阵乘法,使用蝶形变换可以减少运算量,提升算法性能。原理整数DCT变换公式推导过程不再赘述,可以参考《深入理解视频编解码技术 --基于H264标准及参考模型》。以4x4为例,变换公式如下: Y = Cf * X * Cf.T 其中 Cf = [1, 1, 1, 1, 2, 1, -1, -2, 1,-1, -1, 1, 1,-2, 2, -1]展开如下:原创 2020-11-30 19:56:07 · 3139 阅读 · 0 评论 -
H264-mbaff
最近遇到一个问题:一类H264码流解码出来的yuv数据出错。初步分析是带mbaff特性的P/B slice解码结果都有问题,而mbaff的I slice结果正常。因此猜测是mbaff帧间预测有问题。基于JM做中间结果比对:1.保存的残差数据与JM保存结果一致;2.保存的deblocking前数据不一致,可以判断是帧间预测出了问题;3.保存了一个B宏块的前向和后向预测结果,确认后向预测数据与JM保存结果不一致,而mv数据是一致的;可以猜测参考帧用错了;4.确定参考帧索引号确实不一样。最终发现参原创 2020-11-12 14:51:04 · 866 阅读 · 0 评论 -
H.264/AVC学习-参考帧队列重排
H264-参考帧队列重排最近在学习h264 解码流程,结合h264spec文档和JM代码,总结下参考帧队列重排这部分内容。对应spec 中的8.2.4节参考帧重排目的参考帧重排的意义:由于在解码每个(P/B)MB时,都要用到参考帧的索引ref_idx_l0或ref_idx_l1。假如有个参考帧(短期参考帧或者长期参考帧)对于解码一个图像特别有用,但是这个参考帧在缺省的队列中并不位于索引值为0的位置,所以编码大的索引值需要花费多的比特。参考帧的重排序可以使这个参考帧位于索引值比较小的位置,以节省编码比特原创 2020-11-04 16:41:23 · 2675 阅读 · 0 评论