x264源代码解析Word文档下载推荐.docx
- 文档编号:22768886
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:60
- 大小:52.31KB
x264源代码解析Word文档下载推荐.docx
《x264源代码解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《x264源代码解析Word文档下载推荐.docx(60页珍藏版)》请在冰豆网上搜索。
pic,opt->
hin,i_frame+opt->
i_seek,param->
i_width,param->
i_height)
读取一帧,并把这帧设为prev
3.i_file+=Encode_frame(h,opt->
hout,&
pic);
进入核心码层
核心编码层的总流程图:
(x264.c)
1.x264_encoder_encode(h,&
nal,&
i_nal,pic,&
pic_out)对帧进行编码
2.i_size=x264_nal_encode(data,&
i_data,1,&
nal[i])网络打包编码
3.i_file+=p_write_nalu(hout,data,i_size)把网络包写入到输出文件中去
4.返回,对下一帧进行编码
下面一页是详细的流程图:
一.帧内详细流程图:
(1).x264_encoder_encode(h,&
1./*1:
Copythepicturetoaframeandmoveittoabuffer*/
x264_frame_t*fenc=x264_frame_get(h->
frames.unused);
x264_frame_copy_picture(h,fenc,pic_in);
fenc->
i_frame=h->
frames.i_input++;
x264_frame_put(h->
frames.next,fenc);
x264_frame_init_lowres(h->
param.cpu,fenc);
//里面包含低象素的扩展,很多for循环,应该是抽头计算和半精度象素的扩展,要认真看
(2).264_slicetype_decide(h);
对slice类型的判定,里面也要看一下
(3).while(IS_X264_TYPE_B(h->
frames.next[bframes]->
i_type))
bframes++;
x264_frame_put(h->
frames.current,x264_frame_get(&
frames.next[bframes]));
这主要是因为B帧必须等后面的非B帧编码结束后才能编码,所以把暂时不编的一系列B帧存入队列中,一直到非B帧才取出进行编码,之后再进行前面的B帧编码
do_encode:
(4).建立list0&
list1.我感觉
x264_reference_build_list(h,h->
fdec->
i_poc,i_slice_type);
比特率控制初始化
x264_ratecontrol_start(h,i_slice_type,h->
i_qpplus1);
(5).创建slice的头部数据
x264_slice_init(h,i_nal_type,i_slice_type,i_global_qp);
(6)i_frame_size=x264_slices_write(h);
这是编码的关键了
1.x264_slice_header_write(&
out.bs,&
sh,h->
i_nal_ref_idc);
/*Sliceheader*/
2.一些初始化工作
3.for(mb_xy=h->
sh.i_first_mb,i_skip=0;
mb_xy<
h->
sh.i_last_mb;
mb_xy++)对一个slice中每个宏块进行循环遍历编码,其中constinti_mb_y=mb_xy/h->
sps->
i_mb_width;
和constinti_mb_x=mb_xy%h->
是对宏块位置在slice中的x,y坐标的定位,这个for语句几乎覆盖了整个x264_slices_write()函数
4.x264_macroblock_cache_load(h,i_mb_x,i_mb_y);
它是将要编码的宏块的周围的宏块的值读进来,要想得到当前块的预测值,要先知道上面,左面的预测值!
5.*****x264_macroblock_analyse(h);
重点。
通过一系列的SAD算出最优化方案,例如把I帧16×
16的宏块分成16个4×
4分别计算SAD和与原16×
16SAD比较我感觉,在下面一层再详细分析。
a.x264_mb_analyse_intra(h,&
analysis,COST_MAX);
我感觉是在一个16×
16的SAD,4个8×
8的SAD和,16个4×
4SAD和中选出最优方式进行,可能我的理解不对,里面的x264_mb_encode_i4x4(h,idx,a->
i_qp);
i8×
8几个函数的跟踪有问题,跟得我都找不到,要仔细看(现在又能跟到了)
这边好像如果是直流分量在这里就进行量化ZIGZAG扫描了,不用等到x264_macroblock_encode(h)再完成了
b.x264_analyse_update_cache(h,&
analysis);
有对色度块的模式选择的计算,好像也有更新信息以为下次的预测作为参考
6.x264_macroblock_encode(h);
a.判断宏块的类型
b.根据判断的类型进行DCT,量化,ZIGZAG,并记录当前的模式为下次编码宏块(亚宏块)做参考
ZIGZAG的实现不明白(原来ZIGZAG有宏定义,在上面,现在明白了),反量化和IDCT的过程跟不进去,应该是汇编了!
函数如下:
(I4×
4中x264_mb_encode_i4x4(h,i,i_qp);
)
x264_mb_dequant_4x4(dct4x4,h->
dequant4_mf[CQM_4IY],i_qscale);
dctf.add4x4_idct(p_dst,i_stride,dct4x4);
还有,这个函数跟踪不进去,应该是重构图像的反变换吧
mb.cache.intra4x4_pred_mode[x264_scan8[i]]=x264_mb_pred_mode4x4_fix(i_mode);
这个值到底是怎么根据前面的模式改变的,可能是上面两个函数没能更进去所以模糊
c.对色度块进行编码,QP限制在0-51之间,选定预测模式(DC的话值全为128)
x264_mb_encode_8x8_chroma(h,!
IS_INTRA(h->
mb.i_type),i_qp);
里面对两个色度信号分别编码,与亮度信号类似
d.求亮度和色度的cbp,完全不明白是怎么求的,需要解决!
现在有点明白,每个比特代表子块是不是全为0,但还没有全部明白,色度块cbp中0x02表示有AC,DC0x01表示只有DC,
e.利用CBP判断要不要SKIP.,里面还关系到向量预测,明天好好看一下。
其中
mb.qp[h->
mb.i_mb_xy]=h->
mb.i_last_qp;
这个为读下一个qp的保存,不然解码端是读不出下一个qp的,
关于CBP的理解还存在问题,他的8位比特各个代表的意思还不是十分明确,反正是对DC,AC的编码的选择。
185页有介绍(新一代视频压缩标准毕厚杰)
7.选用CABAC还是CAVLC
CABAC的原理实现没仔细看
8.x264_macroblock_cache_save(h);
保存以为下次的预测作为参考
9.一些收尾工作,为下次宏块作准备(看的比较粗)
x264基于经验和感觉的码率控制策略收藏
前提:
1high-complexityorhigh-motionscenes,细节将不会很明显,此时高qp也是浪费
2wheremotioncompensationworkswell,在景物边沿的失真,只需在一帧中去掉,以后就都不会有.在这里投入有限的bits可以获得最好的图像质量性价比
3已经编码一frame,可以预测其他qp下所需bit数.预测距离越远越不精确
4随着frame重要性降低,他们只配用更大的qp,i,p,参考b,disposableb.依次降低
5H.264支持1frame内不同mb使用不同qp,x264不支持,而由rc返回统一qp。
但有那个功能函数存在那个函数仅精确到每一行mb变一次qp
所以rc策略如下:
2pass:
step11pass编码,由qp推断某qp下framesize*0.6符合目标framesize的限制,得到这个qp
step2修改qp以满足requestedtotalsize(total是指整个Gop的大小,分段先编一边再一边)
step3encode根据实际大小值修正预测的qp,并额外增加short-termcompensation,针对开始和结束部分没有很多bits余地的位置.
1pass:
abr(averagebitrate)
step1用半尺寸快速运动估计和SATDresiduals替换1stpass中相关部分,获得预测
step2用之前的样本估计scale
step3Overflowcompensation和2pass相似限制filesize牺牲图像质量
1pass,:
constantbitrate(VBVcompliant)!
!
VBV是指:
VideoBufferVerifier
TheVideoBufferVerifier(VBV)isamodelhypotheticaldecoderbufferthatwillnotoverfloworunderflowwhenfedaconformingMPEGbitstream.包含2个因素.size和造成的delay
step1sameasabr
step2Scalingfactorisbasedonalocalaverage(dependentonVBVbuffersize)insteadofallpastframes
step3stricterOverflowcompensation,additionaltermtohardlimittheQPsiftheVBVisnearempty.nohardlimitisdoneforafullVBV这里更加严格的空限制,防止没有bits可以送出,破坏了cbr的传输
1pass,constantratefactor:
ConstantRateFactor(orConstantQuality)
(1)SameasABR.
(2)Thescalingfactorisaconstantbasedonthe--crfargument.
(3)Nooverflowcompensationisdone.
ratefactor是指:
constantquantizer:
QPsaresimplybasedonframetype.
RC中的蛋鸡悖论:
为了计算当前帧中宏块的
RDO,需利用已定qp确定当前帧或宏块的cost预测每个宏块的modemvref等.
ratecontrol是在确定modemvref后决定qp,在此之前qp不能获得。
于是rdo与rc不知道先做哪个了.
x264命令行参数解释收藏
本文对应的是x264命令行模式,VFW方式也用相同的参数,不过是图形界面,可以自己找对应的英文。
使用格式:
x264默认选项-o输出文件输入文件[长x宽]
输入支持格式:
RAW/y4m/avi/avs(编译时可选)
输出支持格式:
264/mkv/mp4(编译时可选)
x264的许多参数可以有-/--两种输入法,笔者也不知道为什么。
以下等价参数用“参
数1/参数2<
必需数值格式>
”表示,参数尾部()内为个人推荐。
-h/--help帮助
帧类型选项:
-I/--keyint<
整数>
最大IDR帧间距,默认250
-i/--min-keyint<
最小IDR帧间距,默认25
--scenecut<
画面动态变化限,当超出此值时插入I帧,默认40
-b/--bframes<
在IP帧之间可插入的B帧数量最大值,范围0~16,默认0
--no-b-adapt关闭自适应B帧判定(-b设为1时可用,其他不推荐)
--b-bias<
控制插入B帧判定,范围-100~+100,越高越容易插入B帧,默认0
--b-pyramid允许B帧做参考帧
--no-cabac关闭内容自适应二进制算术编码(CABAC,高效率的熵编码)(会
提高速度,但严重影响质量)
-r/--ref<
最大参考帧数,范围0~16,默认1
--nf关闭环路滤波(一种除马赛克算法)
-f/--filter<
alpha:
beta>
设置环路滤波的AlphaC和Beta的参数,范围-6-6,默认都为0
码率控制选项:
-q/--qp<
固定量化模式并设置使用的量化值,范围0~51,0为无损压缩,默认26
-B/--bitrate<
设置平均码率
--crf<
质量模式,量化值动态可变(目前不太成熟,质量不如设置固定量化值)
--qpmin<
设置最小量化值,范围0~51,默认10
--qpmax<
设置最大量化值,范围0~51,默认51
--qpstep<
设置相邻帧之间的量化值差,范围0~50,默认4
--ratetol<
小数>
平均码率模式下,瞬时码率可以偏离的倍数,范围0.1~100.0,默认1.
--vbv-maxrate<
平均码率模式下,最大瞬时码率,默认0(与-B设置相同)
--vbv-bufsize<
码率控制缓冲区的大小,单位kbit,默认0
--vbv-init<
码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.
0,默认0.9
--ipratio<
I帧和P帧之间的量化系数,默认1.40
--pbratio<
P帧和B帧之间的量化系数,默认1.30
--色度-qp-offset<
色度和亮度之间的量化差,范围-12~+12,默认0
-p/--pass<
1|2|3>
多次压缩码率控制
1:
第一次压缩,创建统计文件
2:
按建立的统计文件压缩并输出,不覆盖统计文件,
3:
按建立的统计文件压缩,优化统计文件
--stats<
字符串>
统计文件的名称,默认"
x264_2pass.log"
--rceq<
速率控制公式,默认"
blurCplx^(1-qComp)"
--qcomp<
线性量化控制,0.0为固定码率,1.0为固定量化值,默认0.6,只用于2-
pass和质量模式
--cplxblur<
根据相邻帧平滑量化值比例的最大值,范围0~99.9,默认20.0,只用
于2-pass和质量模式
--qblur<
对统计文件结果平滑量化值比例的最大值,范围0~99.9,默认0.5,只用于
2-pass
--zones<
z0>
/<
z1>
/…分段量化,格式为:
<
开始帧>
<
结束帧>
选项>
,可选项为:
q=<
(量化值)或b=<
(码率倍数)
分析选项:
-A/--analyse<
动态块划分方法,默认"
p8x8,b8x8,i8x8,i4x4"
。
可选项:
p8x8/
p4x4/b8x8/i8x8/i4x4;
none/all(p4x4需要p8x8.i8x8需要--8x8dct)
--direct<
动态预测方式,默认"
spatial"
none/spatial/temp
oral/auto
-w/--weightb允许B帧加权预测(可以减少相邻B帧质量低的影响)
--me<
对全像素块动态预测搜索的方式,默认"
hex"
,可选项:
dia:
菱形搜索,半径1(快)
hex:
正六边形搜索,半径2
umh:
可变半径六边形搜索
esa:
全面搜索(很慢,而且效果与umh几乎相同)
--merange<
--me为umh/esa时的搜索半径,最大64,默认16
-m/--subme<
动态预测和分区方式,可选项1~7,默认5(与压缩质量和时间关系密切
,1是7速度的四倍以上)
用全像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
用半像素块进行动态搜索,对每个块再用快速模式进行四分之一像素块精确搜索
用半像素块进行动态搜索,对每个块再用质量模式进行四分之一像素块精确搜索
4:
用快速模式进行四分之一像素块精确搜索
5:
用质量模式进行四分之一像素块精确搜索
6:
进行I、P帧像素块的速率失真最优化(rdo)
7:
进行I、P帧运动矢量及块内部的速率失真最优化(质量最好)
--b-rdoB帧也进行rdo,需要--subme在6以上
--mixed-refs可以在一帧内使用不同参考帧
--no-chroma-me不进行色度的动态预测
--bime可以平均B帧参考块的运动矢量
-8/--8x8dct可以使用8x8的离散余弦变换(DCT)
-t/--trellis<
Trellis量化,对每个8x8的块寻找合适的量化值,需要CABAC,
默认0
0:
关闭
只在最后编码时使用
一直使用
--no-fast-pskip关闭快速P帧跳过检测
--no-dct-decimate关闭P帧联合编码(可以增加细节,但也会增大体积)
--nr<
噪声去除,范围0~100000,默认0
--cqm<
设置外部量化矩阵格式,默认"
flat"
jvt/flat
--cqmfile<
读取JM格式的外部量化矩阵文件,自动忽略其他--cqm*选项
--cqm4<
list>
设置4x4的量化矩阵,用逗号分开,范围1~255的16个整数
--cqm8<
设置8x8的量化矩阵,用逗号分开,范围1~255的64个整数
--cqm4i/--cqm4p/--cqm8i/--cqm8p设置I、P帧不同的量化矩阵
--cqm4iy/--cqm4ic/--cqm4py/--cqm4pc设置亮度、色度不同的量化矩阵
视频标准化选项:
这些选项与编码无关,不过如果要用mp4之类的播放器,可以设置,风险自担
--sarwidth:
height设置长宽比
--overscan<
过扫描线,默认"
undef"
(不设置),可选项:
show(观看)/crop(去除
--videoformat<
视频格式,默认"
component/pal/ntsc/secam
/mac/undef
--fullrange<
Specifyfullrangesamplessetting,默认"
off"
off/on(我也不明白这是干什么的,请高手指点)
--colorprim<
原始色度格式,默认"
undef/bt709/bt470m/
bt470bg,smpte170m/smpte240m/film
--transfer<
转换方式,默认"
undef/bt709/bt470m/bt47
0bg/linear,log100/log316/smpte170m/smpte240m
--colormatrix<
色度矩阵设置,默认"
undef/bt709/fcc/bt470bg,smpt
e170m/smpte240m/GBR/YCgCo
--chromaloc<
色度样本指定,范围0~5,默认0
输入、输出选项:
--level<
设定等级(asdefinedbyAnnexA)(不明白,请高手指点)
--fps<
设定帧率
--seek<
设定起始帧
--frames<
整
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- x264 源代码 解析