CS-FreeStyle / 10000-How-To-Do-in-CS

1 stars 0 forks source link

h264 vs h265 #163

Open liuty10 opened 3 years ago

liuty10 commented 3 years ago

H.264视频编码的基本原理和过程 https://zhuanlan.zhihu.com/p/257179183 每组的第一帧图像通过帧内编码,我们称之为 IDR 帧,其它图像参考其它图像的信息进行编码,我们称之为 P 帧 / B 帧。如果一个 GOP 的第一帧图像 IDR 帧丢失或者损坏,那么这个 GOP 后面的所有视频数据将会解码错误。只有等到下一个 GOP,当解码器遇到 IDR 帧会即时刷新图像,清空参考图像列表。

帧内编码就是当前帧不参考其它帧,可以独立解码的一种编码方式;可以简单的想象为,一副 BMP 图像压缩为一副 JPEG 图像; 需要注意的是:IDR 帧是 I 帧,但是 I 帧不是 IDR 帧。IDR 帧是一个 GOP 的第一帧,GOP 中间有可能出现 I 帧,后面的帧有可能参考 I 帧之前的视频帧,但是不可能越过 IDR帧。一般 IDR 帧 前面还有 SPS 和 PPS 信息。

在帧内编码中,宏块最多可以有九种预测模式,我们可以找到与原图最相近的预测图像;帧间预测技术分为 B 帧预测和 P 帧预测。B 帧不会作为参考帧,所以,丢弃 B 帧也不会引起花屏;

运动估计:“图1”的小球位置坐标假设为(x0,y0), “图2”的小球位置坐标假设为(x1,y1),那么小球的运动矢量就是(x1 – x0,y1 – y0);得到运动矢量的过程就是运动估计;将预测数据和实际数据相减,去掉时域上的数据冗余,就得到了预测的“残差”数据,也就是补偿数据;解码视频数据,可以根据补偿数据,运动矢量和参考图像恢复出当前图像。 DCT – 离散余弦变化: 去除像素间的相关性,使其产生更多的0,节省码率。 量化过程:在不降低视觉效果的前提下减少图像的编码长度,减少图像信息中视觉恢复中不必要的信息。量化结果,实际上是由量化步长决定的 (QStep),量化步长越小,图像的细节信息保留的越多,码率越高,图像质量越高。反之,量化步长值越大,图像质量越差。 zig-zag 扫描 ,也有人称之为”锯齿扫描” ; 游程编码 (Run Length Coding)是一种统计编码,一种无损压缩的编码方式;进一步压缩保存了有效的保存扫描数据。 熵编码:利用信源的统计特性进行码率压缩的编码称之为“熵编码”,也叫统计编码。还是要压缩数据;这一步是无损压缩。基本原理就是给高频率数据短码,低频率数据长码。

H.264 概念解析 - 运动估计 https://zhuanlan.zhihu.com/p/100311043

  1. 显然搜索区域越大计算的成本就越高,所以实际产品中需要一些技巧来加快搜索速度,减少计算量. 显然搜索的成本与引用参考帧的数量是成正比的,比如在2个参考帧中搜素匹配块需要花费的时间(芯片面积)和功耗基本上就是单参考帧情况的2倍。一个自然的问题是,如果没有找到合适的匹配块怎么办?答案其实很简单,这个宏块采用帧内预测即可。因此,在H.264以及H.265技术中,P帧和B帧都是可以有Intra-coded 宏块的。
  2. 匹配准则 为了寻找与当前块最相似的匹配块,需要一个标准来衡量什么是“相似”。可用的指标主要包括MAD,MSE,NCCF等。x264中所采用的匹配准则是SAD,SATD. SAD 即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。一般帧内要对所有的模式进行检测,帧内预测选用SATD.在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后 SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用 SATD选择码流较少的匹配位置。H.264支持亚像素精度,即搜索步长为1/2像素和1/4像素,可以得到更精确的匹配结果,代价是亚像素精度涉及到大量的插值计算。由于亚像素的计算成本非常高,难以做到实时高清,我司的编码器设计并未支持亚像素精度,所以输出的MV 全都是整像素的。

早期算法:假设匹配误差随着离全局误差最小点的距离增加而单调增加。一般从原点开始,采用固定的搜索模板和搜索策略得到最佳匹配块。常见的有:三步法(TSS)、四步法(FSS)、菱形法(DS)、六边形法(HEXBS)等。缺陷: 没有利用图像本身的相关信息,不能根据物体运动的剧烈程度自适应的改变搜索起点和搜索半径。以菱形法为例,对背景图像,也要经历从大模板到小模板的转换过程,至少需要13个搜索点,搜索速度还有待改进;对于运动剧烈的图像,从原点开始搜索时,要经过多次搜索才能找到匹配点,搜索点过多,且容易陷入局部最优点。 近年来的新算法:(预测搜索起点)利用相邻块之间的运动相关性选择一个反映当前块运动趋势的预测点作为初始搜索点,这个预测点一般比原点更靠近全局最小点。从预测点开始搜索可以在一定程度上提高搜索速度和搜索精度。(中止判别条件)利用相邻块的相关性自适应地调整终止阀值,当搜索值小于该值时,则认为满足条件,跳出后面的搜索过程。(搜索模板选择)在序列图像中,大多数的运动矢量都位于水平或垂直方向,因此可以设计相应的搜索模板(非对称搜索模板)来加快搜索速度。

x264所采用的运动搜索策略:

define X264_ME_DIA 0 //钻石搜索

define X264_ME_HEX 1 //六边形所搜

define X264_ME_UMH 2 //非对称十字六边形网络搜索

define X264_ME_ESA 3 //全搜索

define X264_ME_TESA 4 //hadamard 全搜索法,这个算法和ESA相比主要是在搜索范围上的变化

ffmpeg和H264视频的编解码 https://zhuanlan.zhihu.com/p/36109778 H.265与H.264的差异详解 https://blog.csdn.net/fireroll/article/details/77827156 H.265视频编码与技术全析(上) https://zhuanlan.zhihu.com/p/137619592 4K超高清技术大行其道,传统的H.264已面临瓶颈限制。以编码单位来说,H.264中每个宏块(marcoblock,MB)大小都是固定的16x16像素。然而,在更高分辨率下,单个宏块所表示的图像内容信息大大减少,H.264所采用的宏块经过整数变换后,低频系数相似程度也大大提高,出现大量冗余,导致H.264编码对高清视频的压缩效率明显降低;其次,H.264算法宏块个数的爆发式增长,会导致每个编码宏块的预测模式、运动矢量、参考帧索引和量化级等宏块级参数信息占用更多码流资源,也降低了编码压缩率。 H.265的编码单位可以选择从最小的8x8到最大的64x64。信息量不多的区域划分的宏块较大,编码后的码字较少,而细节多的地方划分的宏块就相应的小和多一些,编码后的码字较多,这样就相当于对图像进行了有重点的编码,针对重要的更多关键细节的部分进行增强划块,从而降低了整体的码率,编码效率就相应得到了提高。这个过程在H.265上,可以通过系统自行适应识别实现。对于蓝光来说,H.265的HEVC编码技术足以将巨大的4K电影压缩进一张蓝光光盘,节省更大的内存空间。

这里需要指出的是,虽然H.265带来了远高于H.264的压缩效率,但同时也带来了高于H.264数倍的解码难度,运算量飙升到400~500GOPS,目前还没有广泛的H.265硬解支持。而且,在面对硬件支持度欠缺、标准确立太晚等问题的同时,谷歌VP9也是H.265摆在面前的挑战,毕竟和需要缴纳授权费的H.265相比,VP9使用自由的BSD版权协议对业界的吸引力无疑是巨大的。

CTU: 编码树单元 CU: 编码单元 PU: 以CU为根,对CU进行划分,一个预测单元PU包含一个亮度预测块PB和两个色度预测块PB. TU: 以CU为根,变换单元TU是在CU的基础上划分的,跟PU没有关系,采用四叉树划分方式,具体划分有率失真代价决定,下图给出了某个CU划分成TU的结构。

  1. H265-NALU-Type介绍 NAL_TRAIL_N = 0, NAL_TRAIL_R = 1, NAL_TSA_N = 2, NAL_TSA_R = 3, NAL_STSA_N = 4, NAL_STSA_R = 5, NAL_RADL_N = 6, NAL_RADL_R = 7, NAL_RASL_N = 8, NAL_RASL_R = 9, NAL_BLA_W_LP = 16, NAL_BLA_W_RADL = 17, NAL_BLA_N_LP = 18, NAL_IDR_W_RADL = 19, NAL_IDR_N_LP = 20, NAL_CRA_NUT = 21, NAL_VPS = 32, NAL_SPS = 33, NAL_PPS = 34, NAL_AUD = 35, NAL_EOS_NUT = 36, NAL_EOB_NUT = 37, NAL_FD_NUT = 38, NAL_SEI_PREFIX = 39, NAL_SEI_SUFFIX = 40,

  2. H264和H265获取帧类型/NALU类型的区别 H264获取方式为 code&0x1f 取低5位,如00 00 00 01 65 则65&0x1f=5表示IDR帧 H265获取方式为 (code & 0x7E)>>1 , 如00 00 00 01 40 则(40&0x7e)>>1 = 32--vps

GOP的长度不是定死不变的,在H.264的编码器中,如果判定场景发生变化,那么及时不到原定GOP的末尾,也会在这个位置加入一个IDR,作为新一个GOP的开始。此时这个GOP的长度就被缩小了。 闭合GOP是H.264中GOP的格式。在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“封闭”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。这时,一个GOP的起始帧命名为CRA, clean random access,同样采用帧内编码,但是这个GOP内的帧间编码帧可以越过CRA参考前一个GOP的数据,这便是GOP的open。

BLA只是CRA在视频流切换情况下的一种特例。视频流在某个RAP上要求切换到另一个视频流继续解码,则直接将该CRA同另一个视频流中的接入CRA连接,后者便是BLA。由于BLA之前解码到缓存的视频流与当前视频流无关,因此其特性类似于直接从该点进行随机存取后的CRA。

RASL和RADL: 这是两种GOP间的图像类型。如果解码器从某个CRA随机接入,则按照显示顺序的后面几帧数据由于缺少参考帧而不能解码,这些图像将被解码器抛弃,即skip leading。而对于没有从当前CRA接入的数据,这些图像可以被正常解码显示,因此称为decodable leading。由于这些数据是有可能舍弃的,因此其他图像(trailing pictures)不能参考这些数据,否则万一这些图像被舍弃,将会有更多的图像受其影响而不能正常解码。

H.265视频编码与技术全析(下) https://zhuanlan.zhihu.com/p/137621599 帧内预测模式共35个(h264有9个),包括Planar,DC,33个方向模式。 目前HEVC规定只使用CABAC算术编码。 自适应样点补偿:通过对重建图像进行分类,对每类图像像素值进行加减1,从而达到减少失真,提高压缩率,减少码流的作用。 H.265运动估计要比H.264更加复杂。它使用列表索引,有两个主要的预测模式:合并和高级运动向量(Merge and Advanced MV.)Merge可以看成一种编码模式,在该模式下,当前PU的MV直接由空域或时域上临近的PU预测得到,不存在MVD;而AMVP可以看成一种MV预测技术,编码器只需要对实际MV与预测MV的差值进行编码,因此是存在MVD的。

一时半会儿还没看明白,随后再看下。

H.265/HEVC在Web视频播放的实践 https://zhuanlan.zhihu.com/p/50655841 FFMPEG命令入门到提高,一篇文章就够了 https://zhuanlan.zhihu.com/p/117523405 视频编码与解码 https://zhuanlan.zhihu.com/p/273689484 视频的编码与封装 https://zhuanlan.zhihu.com/p/108544172

视频的编解码格式: 发展历史总结的还可以。 https://zhuanlan.zhihu.com/p/143720720 一个视频文件通常由包含视频编码格式(如VP9)的视频数据和音频编码格式(如Opus)的音频数据的容器(例如Matroska格式)组成。容器还可以包含同步信息、字幕和元数据(如标题)等。除了视频数据以外,还包括音频、字幕等数据,为了将这些信息有机地组合在一起,就需要一个容器进行封装,这个容器就是封装格式。严格意义上说,我们通常所说的是视频格式,指的就是视频封装格式. import ffmpeg

视频编解码的过去、现在和未来 https://zhuanlan.zhihu.com/p/28969271 RTC的一个具体应用是直播场景中的直播连麦,也就是低延时直播。普通直播,一般采用TCP协议,使用CDN进行内容分发,会有几秒甚至十几秒的延时。而直播连麦,使用UDP协议,内容实时传输,主播和观众可以进行音视频连麦互动,实时沟通,延时一般低至几百毫秒。 编解码器的优劣基本在于:压缩效率的高低,速度和功耗。 目前,主流的视频编码器分为3个系列:VPx(VP8,VP9),H.26x(H.264,H.265),AVS(AVS1.0,AVS2.0) H.265是国际标准,VP9是Google目前主推的标准。H.265在硬件支持上比较广泛,Apple、高通、intel等的芯片都支持H.265的硬件编解码器。VP9的硬件支持依然十分有限。总体来说,新一代编码器,编码效率能比上一代提高了30-50%,但是复杂度和功耗会比上一代大很多,所以纯软件编码实现的话有一定瓶颈,现有的技术下,还是需要依靠硬件编解码为主。 AVS是我国具备自主知识产权的第二代信源编码标准。目前,AVS1.0在第三世界国家中已有广泛应用。AVS2.0,属于与H.265和VP9同级的新一代标准。 编码器只是标准和语法,并没有限定应用场景。因此,在实际应用中,还要结合场景特点,来进行改进和深度优化。

VR视频标准是当前不论是学术界,还是商业应用的热门探索方向之一。在2016年的RTC大会上,我们曾邀请到王荣刚教授分享过《VR视频内容生成技术与编码标准》,王荣刚教授目前担任国际MPEG互联网视频压缩标准专题组联合组长和IEEE虚拟现实视频内容编码标准专题组组长。据王荣刚教授分享,VR视频的编码目前继续解决的技术问题有:图像的显示质量、合成质量和传输带宽。VR视频编码先前的做法是,将已有的视频压缩标准,应用到VR场景中。但是,由于VR视频内容的特殊性和网络带宽的限制,目前的标准无法满足VR视频的压缩需求。业界对VR视频压缩标准呼声极高。

在H.264时代,编码器主要应用于低于HD的中小分辨率,稍微兼顾1080P高分辨率。但H.265时代,随着硬件设备更好、带宽更高,用户开始对视频分辨率的要求更高,人们开始发现,用户对视频质量要求是没有止境。因此,新一代编码器,更倾向于支持高分辨率,比如4K高清分辨率。新一代编码器对高分辨率的压缩效率可提高50%以上。

视频压缩与编解码的基本原理 https://zhuanlan.zhihu.com/p/67305755

音视频编解码学习之编解码框架 https://zhuanlan.zhihu.com/p/144724816

liuty10 commented 3 years ago

运动估计与运动补偿: https://www.cnblogs.com/AndyJee/p/3724917.html https://blog.csdn.net/xiaohaijiejie/article/details/41149717 http://www.cppblog.com/tx7do/archive/2013/01/15/197277.html

  1. 运动估计:得到运动矢量的过程。运动估计是在encoder中完成的,包括了相关块匹配(当前帧和参考帧,被划分成宏块或者块之后,对当前帧中的宏块在参考帧中的一定宏块范围内进行匹配。)、运动矢量计算(根据匹配的每个宏块,计算当前中的每个宏块该如何由参考帧中的对应宏块,变换后得到)、残差计算(将参考帧中的宏块,按照各个运动矢量进行变换后,得到一个估计图像。此时,用真实的图像减去估计的图像,得到的就是残差图像)。
  2. 传输时:参考帧在上一次已经传输过去,当前帧的话,就只需要传递运动矢量和残差(进行transform, quantization, entropy coding)。
  3. 运动补偿:是得到当前帧的过程。运动补偿是在decoder中完成。根据参考帧和收到的运动矢量和残差,将参考帧中的各个宏块或块,按照运动矢量进行移动后,再加上残差,即可得到当前帧的图像。 块匹配准则:就是为了找到前后两帧中相同的那个宏块,这里选取一个匹配准则来判定它们俩之间是否匹配。
  4. 常用的匹配函数有哪些?      答 :(1)最小均方差函数(MSE)(2)最小平均绝对值误差(MAD)等效于常用的绝对差值和(SAD)准则,性能              很好,而且相对简单的硬件需求,因而得到了最广泛的应用。(3)阈值差别计数(NTD) 5.匹配的时候,如何搜索,什么是运动搜索算法? 答:就是找到使得匹配误差函数最小的那个块的计算方法,然后我们就可以得到运动矢量了。主要几种算法可以归纳如下:(1)全局搜索算法 (2)分数精度搜索算法 (3)快速搜索算法 (4)分级搜索范围(DSR)算法 (5)混合搜索算法

在细节比较多的帧中如果选择较大的块尺寸,意味着用于表明运动矢量和分割区域类型的比特数会少些,但是运动压缩的冗余度要多一些;如果选择小一点的块尺寸,那么运动压缩后冗余度要少一些,但是所需比特数要比较多。因此必须要权衡块尺寸选择上对压缩效果的影响,一般对于细节比较少、比较平坦的区域选择块尺寸大一些,对于图像中细节比较多的区域选择块尺寸小一些。宏块中的每个色度块(Cb 和 Cr) 尺寸宽高都是亮度块的一半,色度块的分割方法和亮度块同样,只是尺寸上宽高都是亮度块一半(如亮度块是 8×16 块尺寸大小,那么色度块就是 4×8,如果亮度块尺寸为 8×4,那么色度块便是 4×2 等等)。每个色度块的运动矢量的水平和垂直坐标都是亮度块的一半。 运动估计算法是视频压缩编码的核心算法之一。高质量的运动估计算法是高效视频编码的前提和基础。其中块匹配法(BMA, Block Match Algorithm)由于算法简单和易于硬件实现,被广泛应用于各视频编码标准中。块匹配法的基本思想是先将图像划分为许多子块,然后对当前帧中的每一块根据一定的匹配准则在相邻帧中找出当前块的匹配块,由此得到两者的相对位移,即当前块的运动矢量。在H.264标准的搜索算法中,图像序列的当前帧被划分成互不重叠16×16大小的子块,而每个子块又可划分成更小的子块,当前子块按一定的块匹配准则在参考帧中对应位置的一定搜索范围内寻找最佳匹配块,由此得到运动矢量和匹配误差。运动估计的估计精度和运算复杂度取决于搜索策略和块匹配准则。这里使用H.264推荐算法UMHexagonS(Unsymmetrical-cross Multi-Hexagon-grid Search)作为DSP实现的算法参考,与FS算法比较,它在保证可靠搜索精度的前提下大幅降低搜索复杂度。同时使用绝对差和(SAD, the Sum of Absolute Difference)标准作为匹配准则,它具有便于硬件实现的优点。

liuty10 commented 3 years ago

视频编解码简介 https://zhuanlan.zhihu.com/p/104834990 转换编码模块的产出是一组系数,每个系数是标准基础图案的权重。 通过量化器之后,可获得降低精度但节省位的量化系数。 反过来标准基础图案使用这些量化系数可以得到量化前的图案。 例如,1974年开发的离散余弦变换(DCT)是一种广泛使用的变换编码技术。 H.264编码就是将残差通过转换编码转换为DCT系数。 基本原理利用了傅里叶变换思想(使用一些正余弦公式表示图像) 下面的公式中y为编码前的图案,x为标准基础图案数据,f(x)是一个公式,里面会涉及一组系数k,这一组k就是转换编码的输出。