X264设定

来自NMM Doc
Holy讨论 | 贡献2010年12月12日 (日) 12:44的版本
跳到导航 跳到搜索

本页说明所有x264参数之目的和用法。参数的排列相同于在x264 --fullhelp出现的顺序。

x264设定

说明

x264带有一些内置的文件。要阅读此说明,执行x264 --helpx264 --longhelpx264 --fullhelp。越后面的选项将提供更详细的资讯。

输入

以一个位置参数指定输入的视讯。例如:

x264.exe -o NUL C:\input.avs
x264 -o /dev/null ~/input.y4m

当输入的视讯是raw YUV格式时,还必须告诉x264视讯的分辨率。你可能也要使用--fps来指定帧率:

x264.exe -o NUL --fps 25 --input-res 1280x720 D:\input.yuv 
x264 -o /dev/null --fps 30000/1001 --input-res 640x480 ~/input.yuv

预设值系统

为了减少使用者花费时间和精神在命令列上而设计的一套系统。这些设定切换了哪些选项可以从x264 --fullhelp的说明中得知。

profile

预设值:无

限制输出资料流的profile。如果指定了profile,将覆盖所有其他设定。所以如果指定了profile,将保证得到一个相容的资料流。如果设了此选项,将不能使用无损编码(--qp 0--crf 0)。

如果播放设备仅支援某个profile,就应该设此选项。大多数解码器都支援High profile,所以没有设定的必要。

可用的值:baseline, main, high

preset

预设值:medium

更改选项,以权衡压缩效率和编码速度。如果指定了preset,更改的选项将在所有其他参数套用前被套用。

通常应将此选项设为你所能承受的最慢的值。

可用的值:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo

tune

预设值:无

调整选项,以进一步优化为视讯的内容。如果指定了tune,更改的选项将在--preset之后,但所有其他参数之前被套用。

如果视讯内容符合其中一个可用的值,则可以使用此选项,否则就别使用。

可用的值:film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency

slow-firstpass

预设值:无

随着预设值系统在r1177版本的出现,使用--pass 1会在解析命令列的最后套用以下设定:

可以设--slow-firstpass来停用此特性。注意,使用--preset placebo也会启用slow-firstpass。

参阅:--pass

帧类型选项

keyint

预设值:250

设定x264输出的流之最大IDR帧(亦称为关键帧)间隔。可以指定infinite让x264永远不要插入非场景变换的IDR帧。

IDR帧是资料流的“分隔符号”,所有帧都不能从IDR帧的另一边参考资料。因此,IDR帧也是I帧,所以它们不从任何其他帧参考资料。这意味着它们可以用作视讯的搜寻点(seek points)。

注意,I帧通常明显大于P/B帧(在低动态场景通常为10倍大或更多),所以当它们与极低的VBV设定合并使用时会打乱速率控制。在这些情况下,研究--intra-refresh

预设值对于大多数视讯没啥问题。在为蓝光、广播、即时资料流或某些其他特殊情况编码时,可能需要更小的GOP长度(通常等于帧率)。

参阅:--min-keyint, --scenecut, --intra-refresh

min-keyint

预设值:自动 (MIN(--keyint/10, --fps))

设定IDR帧之间的最小长度。

IDR帧的说明可以参阅--keyint。过小的keyint范围可能会导致“错误的”IDR帧放置(例如闪屏场景)。此选项限制在每个IDR帧之后,要有多少帧才可以再有另一个IDR帧的最小长度。

min-keyint的最大允许值为--keyint/2+1。

建议:预设值,或者等于帧率

参阅:--keyint, --scenecut

no-scenecut

预设值:无

完全停用弹性I帧决策。

参阅:--scenecut

scenecut

预设值:40

设定放置I/IDR帧的阈值(场景变换侦测)。

x264为每一帧计算一个度量值,来估计它与前一帧的不同程度。如果该值低于scenecut,则算侦测到一个“场景变换”。如果此时与最近一个IDR帧的距离低于--min-keyint则放置一个I帧,否则放置一个IDR帧。越高的scenecut值会增加场景变换侦测到的数目。场景变换是如何比较的详细资讯可以参阅http://forum.doom9.org/showthread.php?t=121116

将scenecut设为0等同于--no-scenecut

建议:预设值

参阅:--keyint, --min-keyint, --no-scenecut

intra-refresh

预设值:无

停用IDR帧,作为替代x264会为每隔--keyint的帧的每个宏块(macroblock)使用内部编码(intra coding)。块是以一个水平卷动的行刷新,称为刷新波(refresh wave)。这有利于低延迟的资料流,使它有可能比标准的IDR帧达到更加恒定的帧大小。这也增强了视讯资料流对封包遗失的恢复能力。此选项会降低压缩效率,因此必要时才使用。

有趣的事:

  • 第一帧仍然是IDR帧。
  • 内部块(Intra-blocks)仅处于P帧中,刷新波在一或多个B帧后的第一个P帧更广泛。
  • 压缩效率的损失主要来自于在刷新波上左侧(新)的宏块不能参考右侧(旧)的资料。

bframes

预设值:3

设定x264可以使用的最大并行B帧数。

没有B帧时,一个典型的x264资料流有着像这样的帧类型:IPPPPP...PI。当设了--bframes 2时,最多两个连续的P帧可以被B帧取代,就像:IBPBBPBPPPB...PI。

B帧类似于P帧,只是B帧还能从它之后的帧做动态预测(motion prediction)。就压缩比来说效率会大幅提高。它们的平均品质是由--pbratio所控制。

有趣的事:

  • x264还区分两种不同种类的B帧。"B"是代表一个被其他帧作为参考帧的B帧(参阅--b-pyramid),而"b"则代表一个不被其他帧作为参考帧的B帧。如果看到一段混合的"B"和"b",原因通常与上述有关。当差别并不重要时,通常就以"B"代表所有B帧。
  • x264是如何为每个候选帧选定为P帧或B帧的详细资讯可以参阅http://article.gmane.org/gmane.comp.video.ffmpeg.devel/29064。在此情况下,帧类型将如下所示(假设--bframes 3):IBBBPBBBPBPI。

参阅:--b-bias, --b-pyramid, --ref, --pbratio, --partitions, --weightb

b-adapt

预设值:1

设定弹性B帧位置决策算法。此设定控制x264如何决定要放置P帧或B帧。

0:停用,总是选取B帧。这与旧的no-b-adapt相同作用。
1:“快速”算法,较快,越高的--bframes设定会稍微提高速度。在使用此模式时,基本上建议使用--bframes 16
2:“最佳”算法,较慢,越高的--bframes设定会大幅降低速度。

注意:对于多重阶段(multi-pass)编码,仅在第一阶段(first pass)才需要此选项,因为帧类型在此时已经决定完了。

b-bias

预设值:0

控制B帧被用来代替P帧的可能性。大于0的值增加偏向B帧的加权,而小于0的值则相反。此数是一个随意自定的度量值。范围是从-100到100。100并不保证全为B帧(要全为B帧该使用--b-adapt 0),而-100也不保证全为P帧。

仅在你认为你能比x264做出更好的速率控制决策时才使用此选项。

参阅:--bframes, --ipratio

b-pyramid

预设值:normal

允许B帧作为其他帧的参考帧。没有此设定时,帧只能参考I/P帧。虽然I/P帧因其较高的品质作为参考帧更有价值,但B帧也是很有用的。作为参考帧的B帧将得到一个介于P帧和普通B帧之间的量化值。b-pyramid需要至少两个以上的--bframes才会运作。

如果是在为蓝光编码,须使用nonestrict

none:不允许B帧作为参考帧。
strict:每个minigop允许一个B帧作为参考帧,这是蓝光标准强制执行的限制。
normal:每个minigop允许多个B帧作为参考帧。

参阅:--bframes, --refs, --no-mixed-refs

open-gop

预设值:none

open-gop是一个提高效率的编码技术。有三种模式:

none:停用open-gop。
normal:启用open-gop。
bluray:启用open-gop。一个效率较低的open-gop版本,因为normal模式不能用于蓝光编码。

某些解码器不完全支援open-gop资料流,这就是为什么此选项并未预设为启用。如果想启用open-gop,应该先测试所有可能用来拨放的解码器。

open-gop的说明可以参阅http://forum.doom9.org/showthread.php?p=1300124#post1300124

no-cabac

预设值:无

停用弹性内容的二进制算数编码(CABAC:Context Adaptive Binary Arithmetic Coder)资料流压缩,切换回效率较低的弹性内容的可变长度编码(CAVLC:Context Adaptive Variable Length Coder)系统。大大降低了压缩效率(通常10~20%)和解码的需求。

ref

预设值:3

控制DPB(Decoded Picture Buffer)的大小。范围是从0到16。总之,此值是每个P帧可以使用它前面多少个帧作为参考帧的数目(B帧可以使用的数目要少一或两个,取决于它们是否作为参考帧)。可以作为参考帧的最小ref数是1。

还要注意的是,H.264规格限制了每个level的DPB大小。如果遵守Level 4.1规格,720p和1080p视讯的最大ref数分别为9和4。

参阅:--b-pyramid, --no-mixed-refs, --level

no-deblock

预设值:无

完全停用loop滤镜。不建议。

参阅:--deblock

deblock

预设值:0:0

控制loop滤镜(亦称为inloop deblocker),这是H.264标准的一部分。就性价比来说非常有效率。

可以在http://forum.doom9.org/showthread.php?t=109747找到loop滤镜的参数是如何运作的说明(参阅第一个帖子和akupenguin的回复)。

参阅:--no-deblock

slices

预设值:0

设定每个帧的切片数,而且强制为矩形切片(会被--slice-max-size--slice-max-mbs覆盖)。

如果是在为蓝光编码,将值设为4。不然,别使用此选项,除非你真的知道有需要。

参阅:--slice-max-size, --slice-max-mbs

slice-max-size

预设值:0

设定最大的切片大小(单位为字节),包括估计的NAL额外负荷(overhead)。(目前与--interlaced不相容)

参阅:--slices

slice-max-mbs

预设值:0

设定最大的切片大小(单位为宏块)。(目前与--interlaced不相容)

参阅:--slices

tff

启用交错式编码并指定顶场优先(top field first)。x264的交错式编码使用MBAFF,本身比渐进式编码的效率还低。出于这个原因,仅在打算于交错式显示器上播放此视讯时才应该编码为交错式(或者视讯在送给x264之前无法进行去交错)。此选项会自动启用--pic-struct

bff

启用交错式编码并指定底场优先(bottom field first)。详细资讯可以参阅--tff

constrained-intra

预设值:无

启用限制的内部预测(constrained intra prediction),这是SVC编码的基础层(base layer)所需要的。由于每个人都忽略SVC,你同样可以忽略此选项。

pulldown

预设值:none

使用其中一个预设模式将渐进式、固定帧率的输入资料流标志上软胶卷过带(soft telecine)。软胶卷过带在http://trac.handbrake.fr/wiki/Telecine有更详细的解释。

可用的值:none, 22, 32, 64, double, triple, euro

指定除了none以外的任何一个模式都会自动启用--pic-struct

fake-interlaced

预设值:无

将资料流标记为交错式,即使它并未以交错式来编码。用于编码25p和30p为符合蓝光标准的视讯。

速率控制

qp

预设值:无

三种可用的速率控制方法之一。设定x264以固定量化值(Constant Quantizer)模式来编码视讯。这里给的值是指定P帧的量化值。I帧和B帧的量化值是衍生自--ipratio--pbratio

CQ模式把某个量化值作为目标,这意味着无法得知最终的档案大小(虽然可以透过一些方法来准确地估计)。将值设为0会产生无失真输出。对于相同视觉品质,qp会比--crf产生更大的档案。qp模式也会停用弹性量化,因为按照定义“固定量化值”意味着没有弹性量化。

此选项与--bitrate--crf互斥。各种速率控制系统的详细资讯可以参阅http://git.videolan.org/?p=x264.git;a=blob_plain;f=doc/ratecontrol.txt;hb=HEAD

通常应该改用--crf,尽管qp不需要lookahead来执行因此速度会较快。

参阅:--bitrate, --crf, --ipratio, --pbratio