[转载]FFmpeg中使用libx264进行码率控制
1. X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF.
if ( bitrate ) rc_method = ABR;
else if ( qp || qp_constant ) rc_method = CQP;
else rc_method = CRF;
bitrate和QP都没有缺省值,一旦设置他们就表示要按照相应的码率控制方法进行编码,CRF有缺省值23,没有任何关于编码控制的设置时就按照CRF缺省值23来编码。
一般的使用建议:
CQP – not recommended anymore unless you know you want it
CRF – good for one pass when the priority is quality and file size/bit rate is not really a concern
1 pass ABR – good for streaming purposes or targeting a bit rate when two-pass is unfeasible
2 pass VBR – good for targeting a bit rate when you have the time to spend on two passes (though the first pass can be quite fast) and are writing to a file
2. CQP,恒定QP. 无缺省值
最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的。
参数qp_constant设置的是P帧的QP。I,B帧的QP根据f_ip_factor, f_pb_factor,计算得到。
rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );
rc->pb_offset = 6.0 * log2f( h->param.rc.f_pb_factor );
rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;
rc->qp_constant[SLICE_TYPE_I] = x264_clip3( h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, QP_MAX );
rc->qp_constant[SLICE_TYPE_B] = x264_clip3( h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, QP_MAX );
连续多个B帧时,QP会渐增。
x264 YUV420格式 8比特采样的QP范围是[0, 51]。QP值越小,编码视觉质量越好。QP=0为无失真编码。
在研究编码算法的时候,一般会选用CQP方法,设定QP为24,28,32,36,40等(一般选4个QP值),编码得到RD曲线,然后比较算法优劣。
相同视觉质量时,CQP编码输出的文件会比CRF模式更大。一般而言CRF都能代替CQP方法,不过CQP因为完全不需要预测所以它会运行得更快一些。
帧的重要级别为:IDR帧 > I帧 > P帧 > 做参考的B帧 > 不做参考的B帧。QP可以依次增大。
qpmin,默认值: 0。定义X264可以使用的最小量化值。量化值越小,输出视频质量就越好。
当QP小于某一个值后,编码输出的宏块质量与原始块极为相近,这时没必要继续降低QP。
如果开启了自适应量化器(默认开启),不建议提高qpmin的值,因为这会降低平滑背景区域的视觉质量。
qpmax,默认值: 51。定义X264可以使用的最大量化值。默认值51是H.264规格中可供使用的最大量化值。
如果想要控制X264输出的最低品质,可以将此值设置的小一些。
QPmin和QPmax在CRF,ABR方法下是有效的,过低的设置QPmax,可能造成ABR码率控制失败。不建议调整这个参数。
qpstep,默认值: 4。设置两帧间量化值的最大变化幅度。
帧间QP变化,帧内宏块QP不变,输出码率未知,各帧输出视觉质量有变化(高QP低码率的情况下会更明显)。
3. CRF,恒定Rate Factor (码率系数)缺省值23
CQP是把某个量化值作为目标,bitrate是把某个输出文件大小作为目标,而CRF则是把某个输出“视觉质量”作为目标。
CRF可以提供跟QP一样的视觉质量,但是文件更小,CRF是通过降低那些“less important”帧的质量来达到此目的的。
“less important”的意思是那些过于耗费码率又难以用肉眼察觉的帧,比如复杂或者高速运行的场景。省下来的码率会分配给其它更有效的帧。
在X264编码器内部CRF和bitrate采用了相同的调整策略,只是它不遵循一个特定的输出码率。
它也是通过改变不同重要级别帧(I,P,B类型),以及帧内不同宏块类型(高速运动,复杂纹理,平坦区域)的QP值,以此来调整输出视觉质量。
和QP的范围一样RF的范围也是[0, 51]。其中0为无损模式,23为缺省,51质量最差。和QP一样的趋势。RF值加6,输出码率大概减少一半;减6,输出码率翻倍。
从主观上讲,18~28是一个合理的范围,18往往被认为从视觉上看是近似无损的。
帧间QP变化,帧内宏块QP变化,输出码率未知,各帧输出视觉质量基本恒定。
4. ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate。
X264中bitrate的单位是Kbps(K bit per sec). --bitrate 128指的是设置目标码率为128Kbps, 这样一秒钟的数据量为 128/8比特 = 16K字节。
如果输入为352x288@15fps,相当于128Kbit/(352*288*15) = 0.086比特每像素。编码后每个像素平均分配不到0.1个比特。
与ABR相应的技术有CBR,VBR。这些码率控制技术首先都是在音频编码中采用,是解决音频编码采用什么样的比特率最优的问题。
CBR编码码比特率基本保持恒定在目标比特率,有利于流式播放。
CBR的缺点在于复杂场景码率不够用,简单场景码率浪费,因此编码内容的视觉质量不稳定。通常在较低比特率下,这种质量的变化会更加明显。
VBR编码为简单场景分配较大的QP,为复杂的场景分配较小的QP,得到基本稳定的输出视觉质量。
相对于CBR,在相同文件大小的条件下,VBR的输出结果要比CBR好的多,这有利于媒体下载和本地存储。
VBR的缺点在于输出码流大小不可控。同时对于复杂度恒定的内容(例如新闻播音)没什么优势。
ABR编码为简单场景分配较少的比特,从而留出足量的比特用于生成高质量的复杂部分。使得有限的比特数能够在不同的场景间合理分配,这类似于VBR。
同时ABR分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件大小,这点类似于CBR。
因此可以认为ABR是CBR和VBR的一种折中优化方案。
分析视频编码码率控制可以通过三个因素:
1. 视觉质量稳定性,利于视觉主观质量;
2. 即时输出码率,相当于每帧编码输出比特数;
3. 输出视频文件大小可控,利于传输,存储。
比较这三种码率控制方式如下:
# 视觉质量稳定性 即时输出码率 输出文件大小
CBR 不稳定 恒定 可控
VBR 稳定 变化 不可控
ABR 基本稳定 变化 可控 (即时码率变化,但一段时期内平均码率趋近目标码率)
5. 在当前X264版本中(version 142),选用ABR需要注意两个设置,1.fps;2.输出帧pts计算。
1. fps。ABR会根据帧率来估算每帧的平均数据量,bitrate/fps为平均一帧数据量。
当输入视频源为YUV数据,需要显式的指定正确的帧率--fps,否则X264会用缺省的25fps来计算,有可能控制不到设定的目标码率。
2. pts计算。ABR算法中用到不同帧的pts作为帧间距离,如果没有设置输出帧的pts值,X264会报“non-strictly-monotonic PTS”警告。
编码出来的视频文件码率很小,根本达不到bitrate的设置,同时视频质量很差,几乎都为马赛克。两种方法解决这个问题:
a. 设置param.b_vfr_input = 0,这时根据fps而不是timebase,timestamps来计算帧间距离。
b_vfr_input=1是X264缺省设置,在zerolatency有=0的配置。
b. 在解码后主动增加 pic_out.i_pts++; 语句。
这两个方法可以同时使用。ABR 需要设置 bitrate, fps, 以及param.b_vfr_input = 0。
转自:http://www.bubuko.com/infodetail-471698.html
[转载]FFmpeg中使用libx264进行码率控制的更多相关文章
- [转载] FFMpeg的码率控制
mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在google上search了一下,这方面 ...
- FFMpeg的码率控制
mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在google上search了一下,这方面 ...
- ffmpeg码率控制
一.VBR与CBR的含义和区别 VBR是动态码率.CBR是静态码率. VBR(Variable Bitrate)动态比特率.也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率, ...
- mediaxyz访谈录:ffmpeg的码率控制
mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在 google上search了一下,这方 ...
- 最近调试HEVC中码率控制, 发现HM里面一个重大bug
最近调试HEVC中码率控制, 发现里面一个重大bug! 码率控制中有这么一个函数: Int TEncRCGOP::xEstGOPTargetBits( TEncRCSeq* encRCSeq, Int ...
- ffmpeg中的日志控制、保存日志到指定文件、处理进度查询
ffmpeg默认就会输出一些日志,包含编译的工具(gcc版本).可用的组件(--enable-xxxx).组件版本号码,如下图 这些信息是默认输出的,每次执行合作都会打印在控制台中,如果不想看这些信息 ...
- (原)理解码率控制模式(x264,x265,vpx)
理解码率控制模式(x264,x265,vpx) 原文链接:https://slhck.info/video/2017/03/01/rate-control.html 翻译:lihaiping1603@ ...
- FFmpeg中overlay滤镜用法-水印及画中画
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10434209.html 1. overlay技术简介 overlay技术又称视频叠加技术 ...
- 2016-06-06:X264码率控制
H.264与x264 H264是一个视频压缩编码标准.https://zh.wikipedia.org/wiki/H.264/MPEG-4_AVC X264实现H264视频压缩标准的开源项目.http ...
随机推荐
- 用01随机函数构造[a,b]整数范围随机数
#include <stdio.h> #include <stdlib.h> #define RAND_0_1 (rand()&0x1) int random(int ...
- php两个多维数组组合遍历
$res = $this->LoanRecord->searchloan($conditions,$columns,$page,$this->num,$user_id); forea ...
- LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...
- 从零开始学习html(十)CSS格式化排版——上
一.文字排版--字体 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type&qu ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 4
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 3------------------- 17 带比较运算符的嵌套查询 ...
- Android性能优化系列之APK终极瘦身策略
第1条:使用一套资源 这是最基本的一条规则,但非常重要. 对于绝大对数APP来说,只需要取一套设计图就足够了.鉴于现在分辨率的趋势,建议取720p的资源,放到xhdpi目录. 相对于多套资源,只使用7 ...
- Fiddler抓包使用教程-会话图标
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72933882 本文出自[赵彦军的博客] 使用fiddler抓包时,会看到左侧按照顺 ...
- Linux find查找指定文件 按照名称 然后cp拷贝到指定目录且指定文件名
最近有一个需求,需要将指定目录下的文件(已知文件名)复制到另一个指定的目录且重命名文件. 要求: 在var目录下会定义系统的启动日志相关信息,请查找对应的boot.log文件,并把它备份一份到var/ ...
- 常用内置方法之:__str__,__repr__
class Test(object): def __init__(self): pass def __str__(self): return "test" test = Test( ...
- docker in all
docker vs hyper-v,vmware,xen,kvm docker host, docker container, docker engineen, docker image images ...