引用 H264中一些很有用的解释x264.docx

上传人:b****8 文档编号:10993747 上传时间:2023-02-24 格式:DOCX 页数:20 大小:29.88KB
下载 相关 举报
引用 H264中一些很有用的解释x264.docx_第1页
第1页 / 共20页
引用 H264中一些很有用的解释x264.docx_第2页
第2页 / 共20页
引用 H264中一些很有用的解释x264.docx_第3页
第3页 / 共20页
引用 H264中一些很有用的解释x264.docx_第4页
第4页 / 共20页
引用 H264中一些很有用的解释x264.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

引用 H264中一些很有用的解释x264.docx

《引用 H264中一些很有用的解释x264.docx》由会员分享,可在线阅读,更多相关《引用 H264中一些很有用的解释x264.docx(20页珍藏版)》请在冰豆网上搜索。

引用 H264中一些很有用的解释x264.docx

引用H264中一些很有用的解释x264

引用H.264中一些很有用的解释【x264】

x264学习笔记 2010-01-0815:

57:

39 阅读39 评论0  字号:

大中小 订阅

 

引用

fellowher 的 H.264中一些很有用的解释

Q:

PSNR

峰值信噪比

Q:

是根据它来取qp是不是?

A:

不是,和QP没有直接关系,但是QP的选择会影响到PSNR

Q:

如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式选择的依据?

为什么运动估计中,整象素搜索用SAD,而亚象素用SATD?

为什么帧内模式选择要用SATD?

A:

SAD即绝对误差和,仅反映残差时域差异,影响PSNR值,不能有效反映码流的大小。

SATD即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。

因此,不用率失真最优化时,可将其作为模式选择的依据。

一般帧内要对所有的模式进行检测,帧内预测选用SATD的原因同上。

在做运动估计时,一般而言,离最优匹配点越远,匹配误差值SAD越大,这就是有名的单一平面假设,现有的运动估计快速算法大都利用该特性。

但是,转换后SATD值并不满足该条件,如果在整象素中运用SATD搜索,容易陷入局部最优点。

而在亚象素中,待搜索点不多,各点处的SAD差异相对不大,可以用SATD选择码流较少的匹配位置。

//-----------------------------------------------------------------------------------------

Q:

什么是SAD,SAE,SATD,SSD,SSE,MAD,MAE,MSD,MSE?

A:

SAD(SumofAbsoluteDifference)=SAE(SumofAbsoluteError)即绝对误差和

SATD(SumofAbsoluteTransformedDifference)即hadamard变换后再绝对值求和

SSD(SumofSquaredDifference)=SSE(SumofSquaredError)即差值的平方和

MAD(MeanAbsoluteDifference)=MAE(MeanAbsoluteError)即平均绝对差值

MSD(MeanSquaredDifference)=MSE(MeanSquaredError)即平均平方误差

 

--------------------------------------------------------------------------------

Q:

下面代码的功能是什么?

if(pix&(~255))

{

pix1[x]=(-pix)>>31;

}

else

{

pix1[x]=(unsignedchar)pix;

}

A:

pix的定义是short型,pix1定义的是unsignedchar型

这段代码可以这么理解(这段代码的功能):

如果pix<0,那么pix1[x]=0,如果pix>255,那么pix1[x]=255,否则pix1[x]=pix;

Q:

编解码是以什么为单位进行的?

A:

在看编码解码的框图的时候,如果你以帧为输入单位来看,可能你会看不懂,所以应该以宏块为输入单位来看,因为编码解码都是以宏块为单位,逐个宏块编解码,然后组合为一帧图像的。

这样你就能看明白了。

所以个人认为编解码应该是以宏块为单位进行的。

Q:

为何在cavlc编码的时候,第一个负数要加1?

A:

如果拖尾小于3,说明第一个level的绝对值值肯定大于1。

因此,level为正时,减1;为负时加1。

可降低码流

Q:

YCrCb4:

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的说明的烂图的话,可能看半天也不明白,建议看里面相应的图。

里面的说明也很详细:

4:

2:

0meansthatCrandCbeachhavehalfthehorizontalandverticalresolutionofY,as

shown.Theterm‘4:

2:

0’isratherconfusing:

thenumbersdonotactuallyhaveasensible

interpretationandappeartohavebeenchosenhistoricallyasa‘code’toidentifythisparticularsamplingpattern.

Q:

H.264中,术语IDR的意思是什么,有什么用?

A:

IDR-instantaneousdecodingrefresh(IDR)picture;

AcodedpictureinwhichallslicesareIorSIslicesthatcausesthedecodingprocesstomarkallreferencepicturesas"unusedforreference"immediatelyafterdecodingtheIDRpicture.AfterthedecodingofanIDRpictureallfollowingcodedpicturesindecodingordercanbedecodedwithoutinterpredictionfromanypicturedecodedpriortotheIDRpicture.ThefirstpictureofeachcodedvideosequenceisanIDRpicture.

也就是说,IDR的出现其实是相当于向解码器发出了一个清理referencebuffer的信号吧,上面说前于这一帧的所有已编码帧不能为inter做参考帧了。

Q:

CABAC中开始时各字符出现的概率是怎么得到的?

A:

基于查表实现的

Q:

我们可以从一幅图像的自相关函数图中得到不同图像之间的相似程度.在中点处的最顶点表示图像未经移动时的图像.当空域移动拷贝被从原始图像的任一个方向移除的时候,这个函数值就会急骤下降,就这说明了一个图像采样值的邻域内是高度相关的.

我想问一下,空域移动拷贝被从原始图像的任一个方向移除的时候,这是一个什么过程

A:

空域移动就表示平移,求自相关函数就包含平移这个过程.你看一维的R(t,delta)=E[X(t)*X(t+delta)],二维不过平移多个方向而已

Q:

onlythe central decoder is standardized什么意思

A:

意思是说264标准只定义了码流的格式编码器实现是各公司自己的事,只要形成的码流符合标准就行解码器必须按照这个格式来,这样任何符合标准的码流都可以解出来

Q:

WhatisRVLC?

A:

ItisaVLCmethodwhichcanbedecodedfromlefttorightandfromrighttoleftexclusively.

Q:

RDO模型用来干什么?

RQ模型又用来干什么?

A:

RDO用来确定编码模式的,保证码率比特数和图像失真的最佳权衡点,而RQ是在上一层码率数一定的情况下用来确定下一层分配的比特数。

RQ先于RDO进行。

Q:

帧,场,图像的联系与区别是什么?

A:

在分析标准时要分清帧(frame)、场(field)、图像(picture)很关键。

frame;逐行扫描图像

field:

隔行扫描图像,偶数行成为顶场行,奇数行称为为底场行,所有顶场行称为顶场,同样所有底场行称为底场。

pictue:

场和帧都可认为是图像

[注:

SUPERPUMA语]

顶底场分别编码,对应位置的宏块叫做宏块对。

顶场对已编码的顶/底场预测编码。

底场一般对顶场预测编码

Q:

如何在VC下编译JM

A:

编码步骤:

打开tml.dsw,依次选择project->settings,在settingsfor那一栏中选中lencod,在右边的debug选项卡做如下填写:

Executablefordebugsession:

和tml.dsw同一文件夹,我填的是\JM\bin\lencod.exe,具体有什么讲究我没有研究,应该没很大关系。

Workingdirectory:

./bin

Programarguments:

-fencoder.cfgdecoder.cfg

Remoteexecutablepathandfilename:

可不填

然后,在vc中选择build->setactiveconfigurations,再选择lencod-Win32debug.

下一步compile、build、execute,在这些之后,就完成了编码的工作。

解码步骤:

重复以上编码操作,不同之处是在settingsfor那一栏中选中ldecod,Executablefordebugsession填的路径和编码时应一样,Programarguments填decoder.cfg,build->setactiveconfigurations中选择ldecod-Win32debug,其他不变。

之后compile、build、execute,解码完成!

还有一点需要注意:

编码的yuv图像要放在bin文件夹中!

Q:

关于H264ASIC设计的难点。

A:

1)怎样设计一个高效的Memory(SDRAMorDDR)系统是其中最大的挑战。

MC最少的单元是4x4,因为在一行中只有4个Pixel,必然会导致memorymissrate的增加,从而降低memoryBW的利用率。

也许可以利用图像的空间相关性,设计一个类似于CACHE的结构。

但CACHE的大小是一个值得探讨的问题。

2)怎样用相同的硬件结构来实现帧内预测和帧间预测。

3)怎样用一套硬件结构来同时实现mpeg2/4,WMV.因为核心的算法,例如DCT都不一样。

4)怎样降低熵解码的复杂度。

5)可以最多允许多少个referenceFrame的问题。

这对整个硬件构架没有任何影响。

但直接影响成本,也就是片外要用多少Mmemory的问题。

A:

IDR帧与I帧的区别Q:

因为264采用了多帧预测,就有可能在displayorder下I帧后的P会参考I帧前的帧,这样在randomaccess时如果只找I帧,随后的帧的参考帧可能unavailable,IDR就是这样一种特殊的I帧,把它定义为确保后面的P一定不参考其前面的帧,可以放心地randomaccess。

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,差值是mvd

MV:

运动向量,参考帧中相对于当前帧的偏移

MVp:

参考运动向量

MVD:

两个向量间的差别

Q:

I帧和P帧的概念比较好懂,B帧的概念有些模糊,只知道加了B帧图像质量会更好,请问对B帧该怎么理解?

A:

B帧在MPEG-4中有四种参考模式,如果是同时参考前后的画面压缩,则记录的是和(前画面pixel值+后画面pixel值)/2的差值,也就是和「前后画面的平均」的差值。

所以记录的差值个数和P帧一样,只有一个,没有增加。

而因为B帧位于前后画面的中间,以「前后画面的平均」,也就是「前后画面的中间值」来作为预测数值(预测B帧的pixel数值为多少?

如果有误差,再记录差值),这样这个预测数值会比单独使用前一个画面来预测,更接近目前真正的B帧的数值,可想而知,如此所需要记录的差值就会很小甚至可以根本不用记录,所以便可以省下很多的bits,提高压缩率。

除了压缩率以外,B帧对画质的影响也是有的,因为B帧这种参考前后画面的特性,等于有内插(interpolation)的效果,所以可以减少噪讯。

Golomb用于运动矢量,模式类型,头信息等编码

CAVLC用于残差编码

CABAC都可以

Q:

rdp(userdatapacketprotocol)和(rtp)real-timetransportprotocol有什么区别?

A:

RTP是为了实时传输而在源数据上加了一些时间控制信息

UDP只是为了传输数据,udp的包可以加上rtp的头,成为一个rtp的数据包

rtp3984拆分3种包:

单一NALU包

聚合包

分割包

经过测试发现,无线网络下,一包大小不能超过1400,只能传QCIF,QP35

Q:

相对PAFF,MBAFF的作用大不大?

A:

有优势,但不明显。

只有当图像运动剧烈的时候,优势才会比较明显。

Q:

变换量化公式:

|Zij|=(|Wij|.MF+f)>>qbits中的f是什么?

A:

f是一个修正参数,对于帧内编码宏块f=(2^qbits)/3,对于帧间编码宏块f=(2^qbits)/6。

Q:

整数DCT变换之后,为什么还要对直流分量进行哈达玛变换?

有什么意义?

A:

因为在帧内编码宏块中大多数的能量都集中在直流系数上,这种变换有利于进一步压缩4×4的亮度直流信号的相关性。

Q:

whitepaper中给出帧内预测9种模式,vertical和horizontal容易理解,不知其他模式是依据怎样的算法来进行预测的。

A:

标准P91-96给出了算法。

如8.3.1.2.8SpecificationofIntra_4x4_Vertical_Leftpredictionmode中指出:

ThisIntra_4x4predictionmodeshallbeusedwhenIntra4x4PredMode[luma4x4BlkIdx]isequalto7.

Thevaluesofthepredictionsamplespred4x4L(x,y),withx,y=0...3arederivedasfollows:

Fory=0ory=2,

pred4x4L(x,y)=(p(x+(y>>1),-1)+p(x+(y>>1)+1,-1)+1)>>1;

Otherwise,

pred4x4L(x,y)=(p(x+(y>>1),-1)+2*p(x+(y>>1)+1,-1)+p(x+(y>>1)+2,-1)+2)>>1;

hehe,>>为无符号数右移操作。

Q:

关于对除开拖尾系数以外的非零系数Level编码

A:

level的编码和AVS一样,查6个表,表也和AVS的一样

JM有算法,可以参看

writeSyntaxElement_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、其它类型的块(包括亮度的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)、绝对误差和(SAD)等等。

SAD最常用。

Q:

jm各个版本之间的代码做了些什么改动,有没有说明这些的文档啊?

A:

每个版本源代码的根目录下都有一个change.txt文件,里面详细记录了所有版本的更新。

补充:

为何已经有了JM10.2,大家仍偏好用8.6呢?

风轻回答:

针对对象不同,jm90以上全部是针对高保真的视频的。

86基本上可以满足一般处理的所有要求。

Q:

PicAFF和MbAFF的区别是什么?

A:

PicAFF和MBAFF是决定压缩场的两种方式,PicAff(pictureadaptivefieldframe)是在图像层来说的,此时帧被分成两个场,并且这两个场单独压缩,这两个场在分别分成16*16的宏块,然后对宏块进行编码,编码的时候对场中的宏块单独编码,在某个场编码完后,才会编另一个场的码。

而MBAFF(MicroBlockAdaptiveFiled/Frame)是在宏块层(16*32)上进行编码,它将该宏块层即可以按单独的场,也可以将两个场合并成一个进行编码,在分成两个单独的宏块(16*16)编码的时候,是先编码一个场的宏块,再编码另一个场的宏块,这和PicAFF的区别就是对于整个图像来说各个场的宏块还是交叉编码的;在合并成单独的一个宏块编码时,在一个宏块(16*16)内,即包括奇数场的元素,也包括偶数场的元素,即宏块对,同时同一幅图像值(就算是上一场)也不能做参考。

Q:

用h264设计的解码器是不是可以解任意编码器编的码?

是根据档次设计解码器吗?

A:

不可以解任意编码器编的码。

也不是根据档次来设计编解码器。

要根据具体的情况。

如果是按照H.264的标准来设计编解码器,便是通用的;若编解码器的设计有自己的特点,便不能成为通用的编解码器。

Q:

在VC环境下是如何读入*.yuv序列的?

A:

把*.yuv文件当作一般的文件读就可以了。

如下:

#include

#include

voidmain()

{

char*Y;

char*Cb;

char*Cr;

intwidth=352,height=288;

FILE*fp;

FILE*fy;

inti;

Y=(char*)malloc(width*height);

Cb=(char*)malloc(width*height/4);

Cr=(char*)malloc(width*height/4);

fp=fopen("input.yuv","rb");

if(fp==NULL)

printf("openinput.yuvfailed\n");

fy=fopen("output.yuv","ab+");

if(fy==NULL)

printf("openoutput.yuvfailed\n");

for(i=0;i<1;i++)

{

//fseek(fp,i*width*height,0);

if(0==fread(Y,width*height,1,fp))

printf("readerror\n");

if(0==fwrite(Y,width*height,1,fy))

printf("writeerror\n");

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:

SODB:

最原始的编码数据,没有任何附加数据

RBSP:

在SODB的基础上加了rbsp_stop_ont_bit(bit值为1),并用0按字节补位对齐,字节对齐后,后面还有可能存在若干组16bits的0x0000(参考标准中的Oneormorecabac_zero_word16-bitsyntaxelementsequalto0x0000maybepresentinsomeRBSPsaftertherbsp_trailing_bits()attheendoftheRBSP.)

EBSP:

在RBSP的基础上增加了防止伪起始码字节(0X03)

Q:

码流的读取位置

A:

当数据流存储在介质上时,此时读取用GetAnnexbNALU(nalu);

否则,数据流应该来自分组交换网络,此时读取用GetRTPNALU(nalu)

二者的区别:

码流格式为Bytestreamformat时,调用函数GetAnnexbNALU(nalu);此时码流中包含起始码前缀(start_code_prefix_one_3bytes),3个字节,值为0x000001。

并可能包含连续若干字节的0(leading_zero_8bit),拖尾字节0。

起始码前缀是为了表明码流的开始,与AVS相似。

因为可能存在填充bit0,所以也可能包含有leading_zero_8bit,即起始码前缀的表现形式可能是0x00000001或其他值。

但这些值必须包含0x000001。

对原始码流提取后,这些值均被丢弃。

如果码流是按RTP协议传输,则调用GetRTPNALU(nalu)。

并对RTP包进行拆封。

在H.264中,对RTP包头的各段的值进行了限制,这些被限制的值必须满足条件,否则认为出错。

A:

MBAFF的问题

Q:

帧模式下的MBAFF,每个宏块对由本帧的宏块组成。

场模式下的MBAFF,把两场组成一帧后,在按照帧的方式来组成宏块对。

实际上是每个宏块对由顶场的一个宏块和底场的一个宏块组成。

Q;CAVLC,Exp-Golomb的区别

A:

Exp-Golomb的前缀和后缀根据阶数K的不同,可能是对称,后缀比前缀的长度多1等情况。

负数的情况下,通过公式(–1)k+1Ceil(k÷2),把解析出来的哥伦布码值还原为原始的语法元素值;正数也有相应的对应方法。

CAVLC的前缀和后缀可能对称,也可能不对称,(大多数情况下都是不对称的)而且后缀还可以不存在,后缀的长度也是根据上下文环境来判断的,后缀的取值是根据编码表查询的,

对于正数,编码后的后缀部分的最后1bit一定是0(若存在后缀);对于负数,其一定是1(若存在后缀)。

CAVLC与Exp-Golomb的前缀

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1