h264编码参数

本文详细介绍了X264编码器的码率控制方法,包括bitrate、qp和crf三种方式,并解析了x264的preset和tune参数,提供了编码延时和线程数的优化建议。同时,讨论了不同帧类型的编码耗时和大小,帮助优化编码效率。
摘要由CSDN通过智能技术生成

FFmpeg X264编码参数

目录

  1. 码率控制 1
  2. X264的preset和tune 2
  3. 编码延时建议 2
  4. ffmpeg编码参数和x264参数对照 3
  5. x264参数说明 5

2.码率控制
X264提供三种码率控制的方式:bitrate, qp, crf。这三种方式是互斥的,使用时设置其中之一即可。

(1)bitrate
x264会尝试把给定的位元率作为整体平均值来编码。这意味着最终编码文件的大小是已知的,但最终的品质未知。此选项通常与-pass(两阶段编码)一起使用。
注意,ffmpeg中设置bitrate的具体参数为bit_rate,单位是bits/s(x264里面对应参数i_bitrate的单位则是kbits/s, 1kbits为1000bits而非1024bits).

(2)qp
使用qp选项时,表示P帧的量化值为qp。I帧和B帧的量化值则是从--ipratio和--pbratio中取得。可使用默认参数,也可自己设定。使用qp模式,即固定量化值,意味着停用弹性量化(aq_mode)。
当qp为0时,为无损编码。

(3)crf
固定位元率系数,Constant Ratefactor,
可用的值从1到51,越小编码质量越好,码率越高。一般使用16到24,可以为浮点。(crf并不是恒定质量的方式,同一片子同一crf值,其他参数不同可能码率和质量差较大,不同的片子之间就更没有可比性了)
此模式把某个“质量”作为编码目标,根据片子质量自动分配码率的vbr(Variable Bit Rate动态比特率)。X264中构想是让crf n提供与qp n相当的视觉品质,但编码文件更小一些。
CRF是借由降低“较不重要”帧的品质来达到此目的。在此情况下,“较不重要”是指在复杂或高动态场景的帧,其品质不是很耗费位元数就是不易察觉,所以会提高它们的量化值。从这些帧里所节省下来的位元数被重新分配到可以更有效利用的帧。
当crf为0时,与qp 0相同,实现无损编码。

3.X264的preset和tune
鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设定的参数会覆盖preset和tune里的参数。

--preset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

--tune的参数主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。tune的值有:
film: 电影、真人类型;
animation: 动画;
grain: 需要保留大量的grain时用;
stillimage: 静态图像编码时使用;
psnr: 为提高psnr做了优化的参数;
ssim: 为提高ssim做了优化的参数;
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

4.一些编码建议
编码延时
降低x264的延时是可能的,但是会降低质量。若需零延时,设置--tune zerolatency。若你可以接受一点儿小延时(如小于1秒),最好还是允许延时。下列步骤可以降低延迟,当延迟足够小时,就别再进行后续步骤了:
1.从初始值开始
2.关闭sync-lookahead(设置用于线程预测的帧缓存大小。最大值是250.在第二遍及更多遍编码或基于分片线程时自动关闭)
3.降低rc-lookahead,但别小于10(设定mb-tree位元率控制和vbv-lookahead使用的帧数)
4.降低threads(比如从12降到6)
5.使用切片线程(sliced threads)
6.禁用rc-lookahead
7.禁用b-frames
8.实在不行,就用--tune zerolatency
param->rc.i_lookahead = 0;param->i_sync_lookahead = 0; param->i_bframe = 0; param->b_sliced_threads = 1; param->b_vfr_input = 0;param->rc.b_mb_tree = 0;(使用宏块树位元率控制会改善整体压缩率)
x264线程
x264起多少个线程比较好 ?
建议线程数:
1、2、4、8
测试结论:
1、更多的线程会消耗更多总CPU时间片,因此在长期满载的机器上不宜使用多线程。
2、获得的时间收益随线程增多呈递减趋势,8线程以后尤为明显。
3、PNSR下降随线程数增加呈抛物递增趋势,16线程增加到24线程PSNR时下降了0.6之巨。
4、设置threads=auto时,线程数为逻辑CPU个数的1.5倍。

x264各类型帧的大小及编码耗时
注:作参考,未必属实。
I帧、B帧、P帧都极大地受编码参数的影响。
通常情况下:
h264编码的帧由大到小依次为:
I > P > B
(互相之间约有5倍的差距)
x264的编码耗时由长到短依次为:
P > B > I
通常而言,较小的帧因为帧内压缩计算量(deblock、cabac等)小,所以耗时相对短。
P帧的编码耗时长是因为帧间压缩(宏块寻找、运动补偿等)耗时长所以提高了总体耗时。
另外:可以修改x264中的x264_slices_write函数来测量不同类型帧的编码耗时。


作者:古则
链接:https://www.jianshu.com/p/b46a33dd958d
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值