x264实时编码的码率控制--一个简单的QP调节方法

合集下载

X264编码参数设置

X264编码参数设置

X264编码参数设置By:林立翔standfly@北京邮电大学多媒体通信中心2011-11一,X264版本本项目使用X264编码版本为20091008-2245,附带FFMPEG解码器用以验证编码效果。

二,编译条件本测试在windows xp平台下的visual studio 2008 编译环境下进行三,软件配置1. 打开X264CODEC文件夹,双击X264CODEC解决方案,用Visual Studio 2008打开工程文档2. 单击左上角解决方案资源管理器中X264ENCODE解决方案—>击右键 左击属性,进入X264ENCODE属性页—>选择配置属性—>调试—>在右栏的命令参数中输入所需的编码参数。

四,编码参数设置1.x264基本参数设置格式[--参数名参数值 ...] --output 输出文件输入文件其中方括号里是可输入可不输入的,“...”是可以输很多个的意思。

观察这个形式,每个参数名之前要加“--”,空格后跟此参数名的参数值;一定要有“--output”并指定输出文件;一定要指定输入文件,但前面没有“--”之类的提示符号。

此外,还有短参数模式。

这是为了简化某些常用参数名设计的。

一个“-”加一个字母构成一个短参数名,和与之对应的普通参数名效果一样。

注意此时这个字母区分大小写。

在--fullhelp 列表里,有短参数的参数的短参数都列在此参数的前面。

2.本测试预设的编码参数--crf 23 --tune psnr --preset medium --output X:\xxx\xxx.264 --fps 25 X:\广科院测试序列\左测试序列1.yuv 1920x1080其中,1).crfcrf为一种根据片子质量自动分配码率的 vbr 码率控制方式。

可用的值从 1到 51,越小编码质量越好,码率越高。

一般使用 16 到 24可以为浮点。

本测试预采用此参数或许不同码率下的编码数据。

X264用法

X264用法
@pause
----
@cd /d "%~dp0"
x264 -p2 --stat "XXX.stat" -B XXXX [option] -o "%~dpn1_p2.mp4" "%~1"
@pause
注意一般pass 1 都加上--slow-firstpass这个参数。
pass 1压完看下视频是否满足自己要求,不满意就继续
输入:
x264支持输入的文件类型有raw yuv、y4m、avs和任何可以由ffms或lavf打开的文件。raw yuv会用在64位的x264里。有ffms/lavf打开的片子会自动正确的处理vfr问题。avs和ffms/lavf输入不需要指定片子的分辨率。
输出:
x264可以输出没有封装的H.264视频流,扩展名是.264;matroska视频,扩展名是.mkv;flash视频,扩展名是.flv;mp4视频,扩展名是.mp4。mkv、mp4和flv可以是vfr的。
除了2pass,还有多pass模式,在之前分析的基础上再继续分析,理论上会使码率分配更加合理,但实际上2pass已经足够了。
--bitrate 1000 (以1000kbps码率为例)
>x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs
ssim:为提高ssim做了优化的参数;
fastdecode:可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

中文版MeGUI的x264编码配置

中文版MeGUI的x264编码配置

中文版MeGUI的x264编码配置在MeGUI用内置工具AVS创建一个简单脚本(这里暂时不介绍AVS的各种滤镜使用参数),要求在点击DirectShowsource(手工、专业)能弹出视频预览窗就可以保存AVS了。

此时内建的AVS会自动加载到MeGUI 主界面,进入本文主题压制参数x264配置。

用内置工具建AVS脚本保存后会自动加载到MeGUI界面(AVS的保存最好和视频同在一起)视频输出,注意MeGUI分配的路径是和源视频同一处的,如果本身源视频就是mkv的那么视频输出要改一下视频名称或是存放路径,以免被覆盖转制出错。

没有勾选―显示高级设置‖英文―Show Advanced Setting‖设置界面没有显示完全。

勾选―显示高级设置‖后,配置界面完全显示出来,主要主要面板:编码模式有这么几种:ABR \ Const.Quantizer \ 2pass –1st pass \…… \ Const.Quality,说说常用的,ABR:平均码率,做动画基本不用,Const Quality:恒定质量模式(追求质量不计码率和容量大小的片子使用),一次编码,做动画基本不用,xPass:x次处理,能做到动态高码率,静态低码率,看到很多动画在激烈的打斗场面的时候都会有很高的码流,甚至有10m,20m的说,但是,在静态画面的时候码流较低,这是为了使体积都用在最需要的时候,如果激烈战斗的动态画面码率低的话那么就什么都看不清楚了…所以2pass 对于压缩后片子的整体质量有所提高。

对于那么多的编码模式,最终要用的都是:Auto-2PASS,两次的编码压缩使得码率低,体积更小,质量也高,但是消耗的时间是CQ模式的大约一倍,CQ模式相当于只跑了第2PASS,而2PASS模式还要跑完第一PASS才跑第二PASS。

(加入列队编码时注意到,自动二次编是要跑完两个x264才完成视频输出,时间久就是因为这样来的。

)BITRATE:码率设置,以kbps为单位,片源好以1500kbps以上压制成1024X576的片子体积能减三倍以上,当然码率越高和源的差别越小。

X264简单配置详解

X264简单配置详解

X264 简单配置详解1、X264 介绍X264 是一个基于 H264 的免费开源的视频编码器,属于后起之秀,采用x264 编解码的视频文件,相比较 xvid 或者其它流行的编解码器转换效率和转换后的画面质量都更加优异,已经受到众多非编人士的青睐。

2、Basic 基本配置preset 预设:通过preset 的参数调节编码速度和质量的平衡。

preset 预设参数类似于 WinRAR 的压缩方式参数,参数值有:UltraFast、SuperFast、VeryFast、Faster、Fast、Medium、Slow、Slower、VerySlow、Placebo。

从快到慢,参数越来越慢,越慢压缩比越高,消耗的时间也越长,默认是 Medium。

Tuning 优化:特别的情况时可以指定片子的类型和视觉优化的参数。

默认值为None,没有特殊要求的不用设置此项。

Tuning 的参数值有:●f ilm:电影、真人类型;●a nimation:动画类型;●g rain:需要保留大量的颗粒时使用;●s tillimage:静态图像编码时使用;●p snr:为提高psnr 做了优化的参数;解释:峰值信噪比(PSNR),是一种评价图像的客观标准。

●s sim:为提高 ssim 做了优化的参数;解释:一种衡量两幅图像相似度的指标,其值越大越好,最大为 1,经常用到图像处理中,特别在图像去噪处理中在图像相似度。

Profile 画质级别:X264 有四种画质级别,分别是baseline, extended, main, high;默认为:Auto(自动),其他参数值的含义:(1)Baseline Profile:基本画质。

支持 I/P 帧,只支持无交错(Progressive)和 CAVLC;(2)Extended profile:进阶画质。

支持 I/P/B/SP/SI 帧,只支持无交错(Progressive)和 CAVLC;(3)Main profile:主流画质。

X264-libx264编码库

X264-libx264编码库

X264-libx264编码库X264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。

编码帧的类型分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H264中叫做图像⽚Slice。

X264把整帧图像看作⼀个Slice,⽚中有slice_type_i、slice_type_p、slice_type_b之分。

I帧只有slice_type_i,P帧有slice_type_i、slice_type_p,B帧三种⽚都有。

X264的H264视频编码过程可以分为三个步骤:⾸先根据规则判定当前帧的编码类型,如果是B帧,要缓冲存放、获取;然后对待编码图像进⾏帧内预测、帧间预测、整数DCT变换、量化和熵编码;最后把压缩的H264数据进⾏NAL层打包输出。

X264编码器有关的重要结构体:x264_image_t:实际参与编码的编码帧图像信息。

typedef struct{int i_csp; //图像空间颜⾊int i_plane; //图像平⾯数⽬int i_stride[4]; //每个图像平⾯的跨度,也就是每⼀⾏数据的字节数uint8_t *plane[4]; //每个图像平⾯存放数据的起始地址,plane[0]是Y平⾯,plane[1]是U平⾯,plane[2]是V平⾯}x264_image_t; //待编码的图像x264_picture_t:x264编码器定义便于控制的图像帧,描述⼀帧的特征。

包含x264_image_t和x264_param_t结构体。

typedef struct{int i_type; //帧的类型,初始化为auto,在编码过程⾃⾏控制int i_qpplus1; //此参数减1代表当前帧的量化参数值int i_pic_struct; //帧的结构类型int b_keyframe; //输出是否是关键帧int64_t i_pts; //⼀帧的显⽰时间戳int64_t i_dts; //输出解码时间戳x264_param_t *param;x264_image_t img;x264_image_properties_t prop;x264_hrd_t hrd_timing;void *opaque;} x264_picture_t; //x264编码视频帧x264_param_t:初始化编码器。

X264参数设置(1)

X264参数设置(1)
Vbv-maxrate
0
设置VBV模式的最大码率,强烈建议如果使用,则用2-pass bitrate
Vbv-buffsize
0
设置VBV的最大Buffer大小
Vbv-init
0
初始化buffer值
qpmin
10
Qp最小量化值,qp值越小,视频越清晰,码率越高,一般qp小于16即接近无损压码
qpmax
Aq-mode
1
0:不使用AQ自适应模式,
1:使用
推荐:使用缺省值
Beta deblocking值越低,被去块化(deblock)的方块越少。增加Beta值,环状物(ringing)就越少,而降低Beta则DCT块越少(矛盾)?。/showthread.php?t=109747
如果你不需要编码很细,不介意偶尔的块,可以用-2:-1;如果你喜好更明亮的画面,且不介意一点点模糊,那就用1:2;动画则用低beta值;推荐用缺省值
X264参数设置(1)
X264参数设置
注:I帧:关键帧,P帧:预报帧,B帧:I帧和P帧之间的双向插值帧
名称
缺省值设置IDR帧的最大间隔为250帧,IDR帧就是可备用于拖拽的帧,IDR帧一定是I帧,反之不成立。最好是设成帧率的10倍。显然改值越小,P,B帧越少。
min-keyint
interlace

交错编码,无详细说明,缺省值
以下是码率控制
码率控制方法有三种:qp, bitrate, crf,他们是互斥的。三种方法目标不同:qp:固定量化子,bitrate:固定文件大小,crf固定视频“质量”
qp

固定量化模式(CQ),数值是针对P帧的量化值,I,B帧则根据ipratio和pbratio算出;0值表示无损压缩;推荐使用crf方法替代qp;值越小越清晰。

码率控制

码率控制

X264码率控制流程分析码率控制的理论知识:码率控制的目的和意义:图像通信中码率控制的目的:通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求。

视频压缩的效率和视频内容有很大的关系,对于变化多样的画面,视频编码的输出的码流变化较大,在信道环境不好的时候就容易导致解码端显示的质量的不稳定。

率失真理论:由于传输带宽和存储空间的限制,视频应用对压缩比有较高的要求。

而无损编码较低的压缩比无法满足视频在实际应用中的需求。

但如果给视频引入一定程度的失真,通常可以获得较高的压缩比。

率失真理论对有损压缩编码下的失真和编码性能之间的关系的描述,为码率控制的研究提供了坚实的理论依据。

率失真理论主旨是描述编码失真度和编码数据速率的关系。

该理论建立在图像是连续的基础上的,在有限数据速率下,由于存在量化误差,必然存在失真。

当使用有损编码方法时,重建图像g(x,y)和原始图像f(x,y)之间存在差异,失真度D的函数形式在理论上是可以根据需要自由选取的,在图像编码中,D 常用均方差形式表示的,典型的率失真曲线。

R(D)为D的凸减函数。

对于怎么选择哪个函数的率失真效果更好,则是比较哪个函数的率失真函数更为接近典型的率失真函数的曲线。

x264码率控制方法:采用的码率控制算法并没有采用拉格朗日代价函数来控制编码,而是使用一种更简单的方法,即利用半精度帧的SATD(sum of absolute transformed difference)作为模式选择的依据。

SATD 即将残差经哈德曼变换的4×4块的预测残差绝对值总和,可以将其看作简单的时频变换,其值在一定程度上可以反映生成码流的大小。

SATD是将残差经哈达曼变换4*4块的预测残差绝对值总和。

自适应宏块层码率控制策略:X264的宏块没有任何码率控制的机制,其在帧层得到一个QP后,属于该帧的所有宏块都用着统一的QP进行量化。

码率控制性能测度:1、比特率误差|ABR-TBR|/TBR ,越小越好。

[VCB-Studio][教程09]x264参数设置

[VCB-Studio][教程09]x264参数设置

[VCB-Studio][教程09]x264参数设置VCB-Studio教程09 x264参数设置0. 前言本教程旨在讲述x264参数设置的技巧,并侧重于vcb-s定位的使用:10bit,动漫,高码率,高参数。

对于非这类定位的压制,虽有叙述但不详细。

本教程请搭配MeGUI的参数设置面板一起阅读:本教程会按照标签卡(Main->Frame Type->…->Misc)分别讲解,每个标签卡内,按照从左上到左下,到右上到右下的顺序,讲述每个参数的使用,并给出它们在批处理命令行中的写法。

或者,你完全可以在MeGUI中调好,然后复制下方的命令行(去掉开头的program和结尾的--output "output" "input")到批处理。

后续会有教程讲述低码率下8bit压制的技巧。

不要将本篇中讲述的任何参数和逻辑套用在x265上。

1. Main标签卡,x264基础设置Main标签卡里面都是最主要的参数,新手上路,掌握Main标签卡的内容,就足以去一些普通字幕组担任压制了。

Encoding Mode(rc,ratecontrol,码率控制方法):ABR: Average Bit Rate,指定一个平均码率。

x264会试图让整部视频的平均码率达到你的给定值。

如果视频前后编码复杂度相差很大,那么码率的时间分配效果就很差,尤其是到了结尾,为了达到预定的码率值,x264经常不得不采用过高/过低的码率。

所以一般不推荐这个模式。

命令行: --bitrate 1000,1000是码率,单位Kbps。

Const quantizer:cq模式,固定量化模式。

所有P帧(下文有讲)采用一个固定的Quantizer。

Quantizer, 量化,是一种衡量图像压缩程度的方法,用0-69的浮点数表示,0为无损。

图像被压缩的越多,量化值越大,码率越低,注意量化值不一定代表目视质量,比如说一个纯色的图像可以以很高的量化值被量化,占用的体积很小,而一个很复杂的图像就算量化值不高,但是压缩后观感也可能很差。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

x264实时编码的码率控制
一个简单的QP调节方法
在用x264做实时视频,由于用在智能手机上,计算能力有限,网络带宽有限,故设计了一个简单的新的码率控制算法,效果还不错,与大家分享。

一般做实时视频,x264作者推荐用vbv-CBR模式,这样来稳定码流,适应带宽。

但对于嵌入式系统,CBR模式计算量较大。

CBR模式需要进行前期的半精度SATD值计算,以得到图像复杂度,进而得到预计的bits(这一SATD还用在slice type的选择,实际这个计算过程的函数就叫slice_type_decision,在lookaheand_get_frame中);通过预计bits与期望bits的比较得到qscale,进而得到本编码帧的QP。

当然若用上mb_tree,aq_mode 还更复杂。

这一前期的计算过程大致占整个计算量的12%-20%(根据参数的不同),但若略去这步,使用固定QP,码率波动较大。

现设计了一个新的模式,利用帧间的相似性,根据上一帧编码的实际bits与期望bits的差,来调节QP(帧级调整)。

实现上的思路也很简单,利用CQP模式的壳,在每帧编码前再次调节QP。

需要采用参数如下:
--bframes 0 不要B帧
对于嵌入式,手机等系统,建议采用:
--scenecut 0---(不需额外增加i 帧,由于实时不需b帧,故一个GOP组中,只有一个IDR 帧及其余的P帧);
--subme 1 1/4精度的SAD值
--no-8x8dct (这个是high profile, 不需要,同样可加快编码,节省码流)
--partition none 不要划分(可提高编码速度,节省码流,psnr基本不变)
其余参数可参见,x264 --preset-veryfast的参数配置;
好了接下来是帧级的码流控制,即调节QP;
1. 在x264参数中添加新码率控制的参数(get_opt函数),如:--newqp <bitrate>
2. 这个newqp与CQP,可以起使用。

可照常使用--qp <integer>的形式给出初始qp,若无,则初始默认为23;
3. 控制流程:
1)在本帧编码前,获取上一编码帧的实际大小,单位最好用bit, 这样便于后面的调节;
2)根据设定的bitrate,得到期望的编码帧实际大小,即bitrate/fps (此处的FPS是输
出,一般是25);
3)拟合qp-bitrate曲线:
比如:现在目标是视频通讯,画面复杂度不高,找到这样的片源,用上述选定参数实验不同固定QP下的qp-bitrates曲线;
4)根据拟合曲线及目标bitrate,选出关键的调节点;
以上是整体流程,目前实验的效果是:比如设定500kbps ,超越上限在1%以内,最低在5%以内;
但如果用片源变了,如换成画面复杂度较高的,则上限在5%,下限15%左右;
这主要是调节点是针对某一类片源设定的;
为此,设计了一个简单的权重数组,根据不同设定的bitrate来改变调节点的值,目前看,控制精度有所提高:上限1%,下限10%。

计算量上:可忽略,只是每帧多了上百次的加减乘除;
码率控制实际上是一种编码的优化算法,它用于实现对视频流码流大小的控制。

那么它控制的目的是什么呢?
我们可以试想一下,同样的视频编码格式,码流大,它包含的信息也就越多,那么对应的图像也就越清晰,反之亦然。

目前常用的两种码流控制方式是VBR和CBR,VBR是动态比特率,CBR是固定比特率。

那么他们是怎么来实现的呢?
我们首先看视频编码的目的,它是为了在有限的带宽中传输尽可能清晰的视频,我们以每秒25帧的图像举例,25帧图像中定义了GOP组,目前主要是有I,B,P帧三种帧格式,I帧是关键帧,你可以想象它就是一幅JPEG压缩图像,而B,P帧是依靠I帧存在的,如果丢失了I帧,B,P帧是看不到图像的,B,P帧描述的不是实际的图像像素内容,而是每个相关像素的变化量,他们相对于I帧信息量会很小。

GOP组是指一个关键帧I帧所在的组的长度,每个GOP组只有1个I帧。

我们再来看,一组画面的码流大小跟什么有关?
当视频编码的压缩方式都一样,清晰度要求都一样的时候,GOP组的长度格式决定了码流的大小,例如:每秒25帧画面,GOP组长度为5,那么帧格式为IBPBP,那么1秒钟有5个I帧,10个B帧,10个P帧,如果GOP组长度为15,帧格式就是IBBPBBPBBPBBPBB,那么1秒钟内会有2个I帧和16个B帧和7个P帧,那么5个I帧比2个I帧占用的数据信息量大,所以GOP组的长度格式也决定了码流的大小。

最后,我们再来看VBR和CBR,对于VBR来说,它可以通过特殊的算法来控制一个GOP 组的长度,也就是I帧的数量,当图像中运动图像多时,我可以把I帧数量加大,那么图像会很清晰,如果图像内元素基本静止时,它甚至可以把GOP组调到25的长度。

那么根据前面的描述,可以想象这是一种为了确保图像质量的控制手段,它非常灵活,不死板,但是要求控制算法非常的精确,不精确会导致很多问题,例如码流突增后不降低,即使带宽足够,会导致图像出现问题。

CBR相反,它的带宽不变,码流不改变,一直都是一样的大小(会有少许的变化),图像运动量超过码流承受能力时,图像会出现边缘模糊的现象,它的目的是为了稳定带宽,它的实现方式就相对简单,码流不变就需要均衡IBP之间的关系,动态视频大时I帧小,BP大,运动视频小时I帧大,BP小。

总之都是通过编解格式的算法来实现的。

总结一下,VBR码流控制方式可以降低图像动态画面少时候的带宽占用,CBR控制方式码流稳定,图像状态较稳定。

他们为了解决的是不同需求下的不同应用。

相关文档
最新文档