1、引用 H264中一些很有用的解释x264引用 H.264中一些很有用的解释【x264】x264学习笔记2010-01-08 15:57:39阅读39评论0字号:大中小订阅引用fellowher的H.264中一些很有用的解释Q:PSNR峰值信噪比Q:是根据它来取qp是不是?A:不是, 和QP没有直接关系, 但是QP的选择会影响到PSNRQ: 如果不用率失真最优化, 为什么选择SATDdeltar(mv,mode)作为模式选择的依据?为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?为什么帧内模式选择要用SATD?A: SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码
2、流的大小。SATD即将残差经哈德曼变换的44块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。因此,不用率失真最优化时,可将其作为模式选择的依据。一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。/-Q:什么是SAD,SAE,SA
3、TD,SSD,SSE,MAD,MAE,MSD,MSE?A:SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和SATD(Sum of Absolute Transformed Difference)即hadamard变换后再绝对值求和SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值MSD(Mean Squared Diff
4、erence)=MSE(Mean Squared Error)即平均平方误差-Q:下面代码的功能是什么?if(pix & (255)pix1x = (-pix) 31;elsepix1x = (unsigned char)pix;A:pix的定义是short型,pix1定义的是unsigned char型这段代码可以这么理解(这段代码的功能):如果pix255,那么pix1x=255,否则pix1x=pix;Q:编解码是以什么为单位进行的?A:在看编码解码的框图的时候,如果你以帧为输入单位来看,可能你会看不懂,所以应该以宏块为输入单位来看,因为编码解码都是以宏块为单位,逐个宏块编解码,然后组合
5、为一帧图像的。这样你就能看明白了。所以个人认为编解码应该是以宏块为单位进行的。Q:为何在cavlc编码的时候,第一个负数要加1?A:如果拖尾小于3,说明第一个level的绝对值值肯定大于1。因此,level为正时,减1;为负时加1。可降低码流Q: YCrCb 4:2:0是什么?像4:4:4和4:2:2一样表示 Y:Cr:Cb是4:2:0吗?A: 不要让它骗了,我觉得它所表达意思应该是4:1:1,还有如果你看得是像http:/www.cs.sfu.ca/CC/365/li/material/notes/Chap3/Chap3.4/Chap3.4.html里面这样的对4:2:0的说明的烂图的话,可
6、能看半天也不明白,建议看 里面相应的图。里面的说明也很详细:4 : 2 :0 means that Cr and Cb each haveh alf the horizontal and vertical resolution of Y, asshown. The term 4 : 2 : 0 is rather confusing: the numbers do not actually have a sensibleinterpretation and appear to have been chosen historically as a code to identify this pa
7、rticular sampling pattern.Q:H.264中,术语IDR的意思是什么,有什么用?A:IDR-instantaneous decoding refresh (IDR)picture;A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as unused for reference immediately after decoding the IDR picture. After the d
8、ecoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture.也就是说,IDR的出现其实是相当于向解码器发出了一个清理reference buffer的信号吧,上面说前于这一帧的所有已编码帧不能为inte
9、r做参考帧了。Q:CABAC中开始时各字符出现的概率是怎么得到的?A:基于查表实现的Q:我们可以从一幅图像的自相关函数图中得到不同图像之间的相似程度.在中点处的最顶点表示图像未经移动时的图像.当空域移动拷贝被从原始图像的任一个方向移除的时候,这个函数值就会急骤下降,就这说明了一个图像采样值的邻域内是高度相关的.我想问一下,空域移动拷贝被从原始图像的任一个方向移除的时候,这是一个什么过程A:空域移动就表示平移,求自相关函数就包含平移这个过程.你看一维的 R(t,delta)=EX(t)*X(t+delta) ,二维不过平移多个方向而已Q:only thecentraldecoderisstand
10、ardized什么意思A:意思是说264标准只定义了码流的格式 编码器实现是各公司自己的事,只要形成的码流符合标准就行 解码器必须按照这个格式来,这样任何符合标准的码流都可以解出来Q:What is RVLC?A:It is a VLC method which can be decoded from left to right and from right to left exclusively.Q:RDO模型用来干什么?RQ模型又用来干什么?A:RDO用来确定编码模式的,保证码率比特数和图像失真的最佳权衡点,而RQ是在上一层码率数一定的情况下用来确定下一层分配的比特数。RQ先于RDO进行。
11、Q:帧,场,图像的联系与区别是什么?A:在分析标准时要分清帧(frame)、场(field)、图像(picture)很关键。frame;逐行扫描图像field:隔行扫描图像,偶数行成为顶场行,奇数行称为为底场行,所有顶场行称为顶场,同样所有底场行称为底场。pictue:场和帧都可认为是图像注:SUPERPUMA语顶底场分别编码,对应位置的宏块叫做宏块对。顶场对已编码的顶/底场预测编码。底场一般对顶场预测编码Q:如何在VC下编译JMA:编码步骤:打开tml.dsw,依次选择project-settings,在settings for那一栏中选中lencod,在右边的debug选项卡做如下填写:E
12、xecutable for debug session: 和tml.dsw同一文件夹,我填的是JMbinlencod.exe,具体有什么讲究我没有研究,应该没很大关系。Working directory:./binProgram arguments:-f encoder.cfg decoder.cfgRemote executable path and file name:可不填然后,在vc中选择build-set active configurations,再选择lencod-Win32 debug.下一步compile、build、execute,在这些之后,就完成了编码的工作。解码步骤:
13、重复以上编码操作,不同之处是在settings for那一栏中选中ldecod,Executable for debug session填的路径和编码时应一样,Program arguments填decoder.cfg,build-set active configurations中选择ldecod-Win32 debug,其他不变。之后compile、build、execute,解码完成!还有一点需要注意:编码的yuv图像要放在bin文件夹中!Q:关于H264 ASIC设计的难点。A:1)怎样设计一个高效的Memory(SDRAM or DDR)系统是其中最大的挑战。MC最少的单元是4x4,
14、因为在一行中只有4个Pixel,必然会导致memory miss rate的增加,从而降低memory BW的利用率。也许可以利用图像的空间相关性,设计一个类似于CACHE的结构。但CACHE的大小是一个值得探讨的问题。2)怎样用相同的硬件结构来实现帧内预测和帧间预测。3)怎样用一套硬件结构来同时实现mpeg2/4,WMV.因为核心的算法,例如DCT都不一样。4)怎样降低熵解码的复杂度。5)可以最多允许多少个reference Frame的问题。这对整个硬件构架没有任何影响。但直接影响成本,也就是片外要用多少M memory的问题。A: IDR帧与I帧的区别Q:因为264采用了多帧预测,就有可
15、能在display order下I帧后的P会参考I帧前的帧,这样在random access时如果只找I帧,随后的帧的参考帧可能unavailable,IDR就是这样一种特殊的I帧,把它定义为确保后面的P一定不参考其前面的帧,可以放心地random access。Q:对于帧间编码,在一个宏块内,可以同时存在的模式?A:在同一宏块内,如果用模式16*8,那么宏块分为两块,均为16*8;8*16类似.如果用p8*8模式,对于8*4和4*8把一个8*8块分为两个块,对于4*4则分为4个.Q:帧间预测时,MV,MVp,MVD分别是什么?A:me得到的是mv ,预测得到的是mvp ,差值是mvdMV:运
16、动向量,参考帧中相对于当前帧的偏移MVp:参考运动向量MVD:两个向量间的差别Q: I帧和P帧的概念比较好懂,B帧的概念有些模糊,只知道加了B帧图像质量会更好,请问对B帧该怎么理解?A: B 帧在 MPEG-4 中有四种参考模式,如果是同时参考前后的画面压缩,则记录的是 和 (前画面 pixel 值 + 后画面 pixel 值)/2 的差值,也就是 和 前后画面的平均的差值。所以记录的差值个数和 P 帧一样,只有一个,没有增加。而因为 B 帧位于前后画面的中间,以前后画面的平均,也就是前后画面的中间值来作为预测数值(预测 B 帧的 pixel 数值为多少?如果有误差,再记录差值),这样这个预测
17、数值会比单独使用前一个画面来预测,更接近目前真正的 B 帧的数值,可想而知,如此所需要记录的差值就会很小甚至可以根本不用记录,所以便可以省下很多的 bits,提高压缩率。除了压缩率以外,B 帧对画质的影响也是有的,因为 B 帧这种参考前后画面的特性,等于有内插(interpolation)的效果,所以可以减少噪讯。Golomb 用于运动矢量,模式类型,头信息等编码CAVLC用于残差编码CABAC都可以Q:rdp(user data packet protocol) 和 (rtp)real-time transport protocol有什么区别?A:RTP是为了实时传输而在源数据上加了一些时间
18、控制信息UDP只是为了传输数据,udp的包可以加上rtp的头,成为一个rtp的数据包rtp3984 拆分3种包:单一NALU包聚合包分割包经过测试发现,无线网络下,一包大小不能超过1400,只能传QCIF,QP35Q:相对PAFF,MBAFF的作用大不大?A:有优势,但不明显。只有当图像运动剧烈的时候,优势才会比较明显。Q:变换量化公式: |Zij|=(|Wij|.MF+f)qbits 中的f是什么?A:f是一个修正参数,对于帧内编码宏块f(2qbits)/3,对于帧间编码宏块f(2qbits)/6。Q:整数DCT变换之后,为什么还要对直流分量进行哈达玛变换?有什么意义?A:因为在帧内编码宏块
19、中大多数的能量都集中在直流系数上,这种变换有利于进一步压缩44的亮度直流信号的相关性。Q:white paper中给出帧内预测9种模式,vertical和horizontal容易理解,不知其他模式是依据怎样的算法来进行预测的。A:标准P91-96给出了算法。如8.3.1.2.8 Specification of Intra_4x4_Vertical_Left prediction mode中指出:This Intra_4x4 prediction mode shall be used when Intra4x4PredModeluma4x4BlkIdx is equal to 7.The va
20、lues of the prediction samples pred4x4L(x,y),with x,y=0.3 are derived as follows:For y=0 or y=2,pred4x4L(x,y)=(p(x+(y1),-1)+p(x+(y1)+1,-1)+1)1;Otherwise,pred4x4L(x,y)=(p(x+(y1),-1)+2*p(x+(y1)+1,-1)+p(x+(y1)+2,-1)+2)1;hehe,为无符号数右移操作。Q:关于对除开拖尾系数以外的非零系数Level编码A:level的编码和AVS一样,查6个表,表也和AVS的一样JM有算法,可以参看wr
21、iteSyntaxElement_Level_VLCN函数。.这个算法就是生成6个表的算法。Q:h264在网络上以udp方式传输问题在mpeg4标准中,都是通过rtp协议把视频帧分成一个个的包加上rtp头再发送,在h264中,是由nal直接分片成包的还是要通过rtp分呢?要不要加rtp头Q:FMO的优处和劣处?A:劣处是FMO模式打乱了原宏块顺序,降低了编码效率,增加了时延;优处是增强了抗误码性能。Q:block的类型包括几种?A:在变换编码的阶段,根据block的类型有三种变换编码,block的类型包括1、亮度的4*4直流系数组成的块;2、色度的2*2的直流系数组成的块;3、其它类型的块(包
22、括亮度的4*4交流系数组成的块(在DC系数的位置设为0);色度的4*4交流系数组成的块(在DC系数的位置设为0);采用4*4帧内编码模式的4*4块;运动补偿的4*4的帧间预测块)其中亮度4*4DC系数组成块和色度2*2的直流系数组成的块仅仅在16*16的帧内预测模式下会出现。Q:在进行运动估计和运动补偿时,所用的块匹配快速算法有哪些?匹配准则又有哪几种?A:块匹配快速算法有:正交搜索算法(OSA)、交叉搜索算法(CSA)、共轭方向搜索(CDS)、三步搜索(TSS)、二维对数(TDL)和全搜索(FS)、钻石算法等等。匹配准则一般有:归一化互相关函数(NCCF)、均方误差(MSE)、绝对误差和(S
23、AD)等等。SAD最常用。Q:jm各个版本之间的代码做了些什么改动,有没有说明这些的文档啊?A:每个版本源代码的根目录下都有一个 change.txt 文件,里面详细记录了所有版本的更新。补充:为何已经有了 JM 10.2,大家仍偏好用 8.6 呢 ?风轻回答:针对对象不同,jm90以上全部是针对高保真的视频的。86基本上可以满足一般处理的所有要求。Q: PicAFF和MbAFF的区别是什么?A: PicAFF和MBAFF是决定压缩场的两种方式,PicAff(picture adaptive field frame)是在图像层来说的,此时帧被分成两个场,并且这两个场单独压缩,这两个场在分别分成
24、16*16的宏块,然后对宏块进行编码,编码的时候对场中的宏块单独编码,在某个场编码完后,才会编另一个场的码。而MBAFF(MicroBlock Adaptive Filed/Frame)是在宏块层(16*32)上进行编码,它将该宏块层即可以按单独的场,也可以将两个场合并成一个进行编码,在分成两个单独的宏块(16*16)编码的时候,是先编码一个场的宏块,再编码另一个场的宏块,这和PicAFF的区别就是对于整个图像来说各个场的宏块还是交叉编码的;在合并成单独的一个宏块编码时,在一个宏块(16*16)内,即包括奇数场的元素,也包括偶数场的元素,即宏块对,同时同一幅图像值(就算是上一场)也不能做参考。
25、Q:用h264设计的解码器是不是可以解任意编码器编的码?是根据档次设计解码器吗?A:不可以解任意编码器编的码。也不是根据档次来设计编解码器。要根据具体的情况。如果是按照H.264的标准来设计编解码器,便是通用的;若编解码器的设计有自己的特点,便不能成为通用的编解码器。Q:在VC环境下是如何读入*.yuv序列的?A:把*.yuv文件当作一般的文件读就可以了。如下:#include #include void main()char *Y;char *Cb;char *Cr;int width = 352, height = 288;FILE *fp;FILE *fy;int i;Y = (char
26、*)malloc(width*height);Cb = (char*)malloc(width*height/4);Cr = (char*)malloc(width*height/4);fp= fopen(input.yuv,rb);if(fp = NULL)printf(open input.yuv failedn);fy = fopen(output.yuv, ab+);if(fy = NULL)printf(open output.yuv failedn);for(i = 0; i1; i+)/fseek(fp, i*width*height, 0);if(0 = fread(Y, wi
27、dth*height, 1, fp)printf(read errorn);if(0 = fwrite(Y, width*height, 1, fy)printf(write errorn);fread(Cb, width*height/4, 1, fp);fread(Cr, width*height/4, 1, fp);fwrite(Cb, width*height/4, 1, fy);fwrite(Cr, width*height/4, 1, fy);fclose(fp);fclose(fy);free(Y);free(Cb);free(Cr);Q:SODB,RBSP,EBSP的区别A:S
28、ODB:最原始的编码数据,没有任何附加数据RBSP:在SODB的基础上加了rbsp_stop_ont_bit(bit 值为1),并用0按字节补位对齐,字节对齐后,后面还有可能存在若干组16bits的0x0000(参考标准中的One or more cabac_zero_word 16-bit syntax elements equal to 0x0000 may be present in some RBSPs after the rbsp_trailing_bits( ) at the end of the RBSP.)EBSP:在RBSP的基础上增加了防止伪起始码字节(0X03)Q:码流的
29、读取位置A:当数据流存储在介质上时,此时读取用GetAnnexbNALU (nalu);否则,数据流应该来自分组交换网络,此时读取用GetRTPNALU (nalu)二者的区别:码流格式为Byte stream format时,调用函数GetAnnexbNALU(nalu);此时码流中包含起始码前缀(start_code_prefix_one_3bytes),3个字节,值为0x00 00 01。并可能包含连续若干字节的0(leading_zero_8bit),拖尾字节0。起始码前缀是为了表明码流的开始,与AVS相似。因为可能存在填充bit 0,所以也可能包含有leading_zero_8bit
30、,即起始码前缀的表现形式可能是0x00 00 00 01或其他值。但这些值必须包含0x00 00 01。对原始码流提取后,这些值均被丢弃。如果码流是按RTP协议传输,则调用GetRTPNALU(nalu)。并对RTP包进行拆封。在H.264中,对RTP包头的各段的值进行了限制,这些被限制的值必须满足条件,否则认为出错。A:MBAFF的问题Q:帧模式下的MBAFF,每个宏块对由本帧的宏块组成。场模式下的MBAFF,把两场组成一帧后,在按照帧的方式来组成宏块对。实际上是每个宏块对由顶场的一个宏块和底场的一个宏块组成。Q;CAVLC,Exp-Golomb的区别A:Exp-Golomb的前缀和后缀根据阶数K的不同,可能是对称,后缀比前缀的长度多1等情况。负数的情况下,通过公式(1)k+1 Ceil( k2 ),把解析出来的哥伦布码值还原为原始的语法元素值;正数也有相应的对应方法。CAVLC的前缀和后缀可能对称,也可能不对称,(大多数情况下都是不对称的)而且后缀还可以不存在,后缀的长度也是根据上下文环境来判断的,后缀的取值是根据编码表查询的,对于正数,编码后的后缀部分的最后1 bit一定是0(若存在后缀);对于负数,其一定是1(若存在后缀)。CAVLC与Exp-Golomb的前缀
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1