图片组就是视频内一长串连续的单帧图像..一般两个 I 帧之间的部分就是一个图片组
图片组包含上述三种帧..一个图片组一定以 I 帧开始 ..以 I 帧结束..同时结束的这个 I 帧又是下一个图片组的起始 I 帧......一直这样排列直到视频结束..(固然最后视频的最后一帧99.9%的状况下都不会是 I 帧)
能够说视频就是由若干个图片组串起来构成的..只要以必定速率播放这些图片组..就能获得动态的图像..
一段视频一定以 I 帧开始..以B帧或者P帧结束(绝大多数状况下是的)
以下图所示(简单以 I P B表明一串图像序列)算法
两个 I 帧之间就是一个 GOP..而这段视频是以 I 帧开头.. 以B帧结尾~
说到 I 帧和GOP..就不得不提到另外一种特殊的 I 帧..
请观察下图..注意红色标识的 I 帧优化
其实图中只有一个GOP...那为何会出现三个 I 帧呢?
这个就得归功于x264对于GOP长度(越长的GOP其内部包含的帧数越 多)的控制了...由于平均下来一个GOP至少会包含一个 I 帧..而相对来讲 I 帧的体积又是巨大的..不利于压缩率提升..显然越长的GOP有利于压缩率提升..因此在x264里能够强制定义最短GOP长度和最大GOP长度..即 --min-keyint和--keyint参数..后面会讲到..下面讲解这种特殊的 I 帧是如何产生的以及其特性
设想下面一种状况~
视频的前一帧是mikumikumi~
下一帧变成死宅在屏幕上prprpr~
请问光从画面上这两帧有什么参考性?
显然没有...短短两帧直接跨越了次元障碍还跨越了性别与物种(雾..
这种状况下之前一帧做为参考来解码下一帧简直是费力不讨好!而且极有可能产生解码错误!
因而x264编码器有这样一个场景变动检测的设定..当检测到下一帧与前一帧差异很大超过设定阀值时..
X264会有下面两种动做..编码
1.若是此帧位置距前面最近的一个 I 帧距离大于--min-keyint的值(即最小GOP长度)..则建立一个新的 I 帧做为参考帧(即建立了一个新的GOP..上一个GOP到此结束)
2.若是此帧位置距前面最近的一个 I 帧距离小于--min-keyint的值(即最小GOP长度)..则建立一个特殊的GOP内部 I 帧 ..俗称 IDR 帧..(不结束这个GOP..此 I 帧为这个GOP的内部帧)
须要注意的是:虽然IDR帧也属于 I 帧..其也是其余帧的参考帧..但IDR帧有个极其特殊的性质!它禁止IDR帧后面的P帧B帧向它自身以前的帧参考!能够理解为它是一个GOP内的“分隔符号”..其余全部帧都没法从它以前的帧获取参考数据!
这样就避免了上述情景下可能致使的错误~spa
既然前面提到码率是清晰度的标准~
那么x264编码器能够如何作到控制码率呢?
目前x264编码器能够作到下面五种码率控制模式
ABR [ Average Bitrate ](平均目标码率模式)
CBR [ Constant Bitrate ](恒定码率模式)
2pass..3pass..npass(二次..三次..n次编码模式..严格来讲也属于平均目标码率模式.但其码率浮动较ABR高出很多.)
CRF [ Constant Ratefactor ] (固定码率系数模式)
QP [ Constant Quantizer ] (固定量化值模式)
注意了..前面说的是x264能够作到五种码率控制模式..
但实际上x264提供的码率控制方式只有 QP ...Bitrate...CRF三种~!orm
QP模式
即以固定量化值(Constant Quantizer)模式来编码视频..
须要注意的是这里的量化参值为P 帧的量化值..I 帧(包括IDR帧)和 B 帧的量化值又由ipratio和bpratio参数来肯定..不过一般这两个参数无需手动设置..
简单点说QP模式就是:相对于压缩前的原视频来讲..每个 P 帧 ..I 帧 .. B帧都会固定的损失一部分质量..损失断定是固定的.但因为I P B帧的插入是不肯定的..因此最终文件的体积是没法肯定的.
注:设置为qp0时将产生无损的画面输出(输出文件通常会比源文件大出数倍以上.)..
而且相同视觉质量时..qp模式输出的视频文件比crf模式输出的体积大..
视频
Bitrate模式
即为固定目标码率模式..(固定目标比特率/位元率模式)
x264会试图让最终文件的总体平均码率与给定的码率相等!
这会使最终输出文件的体积是肯定的..适用于精确控制体积.~
但因为此模式仅编码一次..没法对码率作到合理的分配!
因此画质上不如相同体积的CRF模式输出的视频..
通常推荐2 pass时使用.!或是在时间较紧而又对输出文件体积有精确要求的状况下使用!
不然应该使用CRF模式!
blog
CRF模式
即固定Ratefactor模式..【Constant Ratefactor】
也是X264编码器核心的码率控制模式
若是说QP是固定量化器,Bitrate是固定文件最终大小..那么CRF则是则是固定“肉眼质量”..CRF能够提供跟QP同样的视觉的质量..可是文件更小..码率分配更合理..
所以CRF以其一次编码而码率分配又最合理的优点脱颖而出!
原理即是CRF模式下经过下降那些“不那么重要”的帧的质量作到这一切的~..“不那么重要”意思是过于耗费码率又难以用肉眼察觉的帧....省下来的码率会用在其它更能有效提升“视觉质量”的帧里..
其实CRF就是一个浮动QP模式..其按照特定的标准..根据人眼的需求..给予每帧不一样的QP量化值 .但玩好CRF模式..和aq..psy..qcomp等参数都脱不开关系..后面会讲到~
但须要注意的是CRF模式也没法预测最终输出文件的体积!图片
--bframes
设置x264可以使用的B帧的最大连续数量
仔细食用 I P B 帧说明的UP仍是一看就懂~
前面说过越多的B帧能够提升压缩率.由于B帧的体积最小..
因此天然这个参数设定值越大越好~
不过仍是老话..较高的值能提升压缩率..但会下降编码速度
默认值:3ip
--b-adapt
设定弹性B帧配置决策算法。此设定控制x264如何决定要放置P帧或B帧。
另外一个图上没有的参数~不过通常设置下总没错的
可选项:
0:停用,老是挑选B帧。就是所有是B帧…(好暴力..)
1:“快速”算法,较快,越大的--bframes值会稍微提升速度。当使用此模式时,基本上建议搭配--bframes 16 使用。
2:“最佳”算法,较慢,越大的--bframes值会越多的下降编码速度。
(固然若是追求压缩率..而又不怎么损失画质..这个算法配合bframes 16的口味真心不错)
默认值:1
推荐值:2数学
--keyint
做用是设定最大IDR帧间隔,为0时则永远不插入非场景变动的IDR帧
依旧是看了 I P B帧科普的UP们的胜利!
前面也提到了..keyint实际上设定的是GOP长度..越长的GOP通常包含B帧越多..压缩率也越高~
默认值:250
可设定值:任意正整数(但不要小于视频帧率)
--min-keyint
设定IDR帧之间的最小长度
须要注意的是太小的keyint距离会致使“不正确的”IDR帧位置..所以出现此设置限制最短的IDR帧间隔..
默认值:视频的帧率
推荐默认值便可..不须要改变
--scenecut
场景变动侦测
何为场景变动?..依旧是认真食用科普的UP们的胜利~
x264为每一帧计算一个度量值,来估计与前一帧的不一样程度。若是该值低于scenecut,则算侦测到一个“场景变动”。
一旦出现场景变动.x264就会根据我上面提到的两个规则插入对应的 I 帧..(请自行回去阅读 I P B帧科普)
因此来讲..越小的scenecut值侦测到的场景变动越少
换言之放置的 I 帧相对越少..
默认值:40
--me
全称 Motion Estimation(动态估算)
x264在编码视频时会在全尺寸上搜索有效的”动态向量“..而后经过记录这些有效向量的移动来编码视频..
可用选项有五个:
dia(diamond):最简单的搜寻方法,起始于最佳预测器(predictor),检查上、左、下、右方一个像素的动态向量,挑选其中最好的一个,并重复此过程直到它再也不找到任何更好的动态向量为止。
hex(hexagon):由相似策略组成,除了它使用周围6点范围为2的搜寻,所以叫作六边形。它比dia更有效率且几乎没有变慢,所以做为通常用途的编码是个不错的选择。
umh(uneven multi-hex):比hex更慢,但搜寻复杂的多六边形图样以免遗漏难以找到的动态向量。不像hex和dia,merange参数直接控制umh的搜寻半径,容许增长或减小广域搜寻的大小。
esa(exhaustive): 一种在merange内整个动态搜寻空间的高度最佳化智慧搜寻。虽然速度较快,但数学上至关于搜寻该区域每一个单一动态向量的暴力(bruteforce) 方法。不过,它仍然比UMH还要慢,并且没有带来很大的好处,因此对于平常的编码不是特别有用。
tesa(transformed exhaustive):一种尝试接近在每一个动态向量执行Hadamard转换法比较的效果之算法,就像exhaustive,但效果好一点而速度慢一点
默认值:hex
推荐值:umh
从上到下效果递增但编码速度递减..越靠下的算法越能找到更多的有效动态向量..但速率也越慢..通常来讲追求速度质量平衡就用umh..追求压缩率就用tesa...(由于esa速度几乎和tesa差很少..可是效果不如tesa..)
--merange
控制动态向量搜索的最大范围
有了动态向量估算..那么总得指定一个估算的搜索范围吧?..
默认值:16
可设定任意正整数
推荐值:20-28
须要注意的是...此设定范围和--me的设置有关
当--me设定为hex或更差的算法时..--merange最大值为16
当--me设定为umh或更好的算法时..--merange值可超过16
但一般来讲720p设置为24-28都仍是不错的..固然做死设置32没问题..不过编码速度会降低很多..32以上值不推荐..
--subme
全称(Subpixel Refinement)
用来设定子像素(subpixel)估算复杂度。值越高越好!
可选项 1 - 11
1 - Qpel SAD:用全像素块进行动态搜索,对每一个块再用快速模式进行四分之一像素块精确搜索
2 - Qpel SATD:用半像素块进行动态搜索,对每一个块再用快速模式进行四分之一像素块精确搜索
3 - Hpel on MB then QP:用半像素块进行动态搜索,对每一个块再用质量模式进行四分之一像素块精确搜索
4 - Always QPel:用快速模式进行四分之一像素块精确搜索
5 - Qpel Bidir ME:用质量模式进行四分之一像素块精确搜索
6 - RD on I/P frames:进行I、P帧像素块的速率失真最优化(rdo)
7 - RD on all frames:进行所有帧像素块的速率失真最优化
8 - RD refinement on I/P frames:进行I、P帧运动矢量及块内部的速率失真最优化
9 - RD refinement on all frames:进行所有帧运动矢量及块内部的速率失真最优化
10 - QP-RD:对每一个块进行四分之一像素块精确搜索及块内部的速率失真最优化 (须要Trellis=2,AQ-Mode>0)
11 - Mod编译版特有的福利..最优化的算法..速度也最慢!(须要Trellis=2,AQ-Mode>0)
默认值:7
推荐值:9 或 10
不在乎时间就11
由于9到10在到11...压缩率的提高真的很出色!
我本人用这个实测过..9 到10的状况下..一样画面的码率能至少下降100-200kbps!
因此说只要我的能忍受..越高越好!
--trellis
trellis量化设置
可选项:
0:停用。
1:只在一个宏区块的最终编码上启用。
2:在全部模式决策上启用。
默认值:1
推荐值:2
须要注意的是这个设置能在相同码率下提供更好的画质.因此尽可能开推荐值吧~.
但会略微下降编码效率..
--aq-mode
即自适应量化器模式
做用是在一帧中不一样区块间从新分配量化值..能提升暗部细节!并使帧内的码率分配更加合理!
此设定会变动自适应量化器会从新分配码率到什么范围里~
可选项:
0:彻底不使用aq
1:容许AQ从新分配码率到整个视频和帧内。
2:自动变化(Auto-variance)AQ,会尝试对每帧调整强度。
3:综合aq2模式的升级版本..可使码率分配更加合理!
默认值:1
推荐值:3
--aq-strength
顾名思义自适应量化强度..
设定AQ偏向低细节(flat)的宏区块的强度..
较低的值能够保留更多高频信息..但flat区域会有些惨..
通常来讲画面动态较高的话就用0.6-0.8..以避免在flat区域浪费太多码率致使动态画面糊掉..
画面总体静态惟美的那种就用1.0左右的值便可..防止暗部出现因欠码产生的色带等问题
默认值:1.0
可设定为任意正浮点数
psy
心理视觉优化算法(须要subme≥6...trellis≥1)
默认开启~强烈建议开启
维持默认不要动就是了
参数之 --psy-rd 心理视觉优化算法的强度 格式为x :x 第一个数为psy-rdo的强度 第二个数为psy-trellis的强度 --direct 设定"direct"动态向量(motion vectors)的预测模式.. 默认值:spatial 推荐值:auto auto容许x264自行切换预测模式..而对速度的影响微乎其微.但能略微提升压缩率~.因此推荐直接写上 --direct auto