码率控制_vbv-maxrate_山西茄子的博客-程序员秘密

技术标签: 多媒体--编解码应用  

ABR,CBR,VBR的关系

与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         基本稳定              变化               可控 (即时码率变化,但一段时期内平均码率趋近目标码率)

x264的码率控制

--vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0]
默认:0
说明:设置VBV可用的最大缓冲区,单位是kbits。VBV(Video Buffering Verifier,视频缓存检验器),它作用是处理各帧编码后大小不一和恒定输出码率的矛盾。可以将VBV想象成为一个水池,水池的入口连接着encoder的输出,出口为恒定码率的网络输出。为了使得输出恒定,encoder必须保证水池既不上溢也不下溢。下溢会导致无数据输出,上溢会导致数据丢失。所以encoder在编码一帧时会参考当前vbv的充盈情况,并由此计算出,当前帧应当编码出多少比特,从而保证既不上溢(增加QP)也不下溢(减少QP)。为了防止上溢,VBV会要求降低编码比特,encoder会采用更大一些的QP,这样必然降低了视频序列质量,因此只在真正需要的时候才设定它。一般在硬件解码端的时候,一定要做这个设置。例如蓝光定义最大的数据缓冲为30M比特,能够解码的最大视频码率为40Mbps。这是对硬件解码器资源选配的一个合理限制,否则解码器不知道预留多大的数据缓冲空间才是安全的。这类似264标准的level设定。

--vbv-maxrate <integer> Max local bitrate (kbit/s) [0]
默认:0
说明:设置VBV可用的最大码率,单位是kbps。使用它等于限制了I帧最大的码率输出(一般都是I帧达到maxrate的限制,除非bitrate设置过低不合理)。而I帧质量的降低,会拉低整个视频序列的视频质量。因此只在真正有最大码率限制的情况下才去设定它。
参见:–vbv-bufsize, –vbv-init,
在VBR和ABR情况下,可以设置vbv-maxrate和vbv-bufsize(很多情况下设置为vbv-maxrate = vbv-bufsize = bitrate,注意vbv-bufsize的量纲是不同,即最大缓存1s的数据)。
在RC_ABR码率控制方法下,如果vbv-maxrate == bitrate这时候其实进行的是CBR码率控制方法,encoder力争控制每一帧输出都稳定在bitrate上。
如果设置vbv-maxrate则vbv-bufsize必须设置,否则会提示"VBV maxrate specified, but no bufsize, ignored", vbv-maxrate会被改回为0。
如果设置vbv-bufsize而vbv-maxrate没有设置,则会提示"VBV maxrate unspecified, assuming CBR",vbv-maxrate会被设为bitrate,此时进行CBR编码。
一般设置为 vbv-maxrate = vbv-bufsize = a*bitrate。
a=0,不启用VBV机制,编码性能最好,适用于硬盘文件编码;但它输出的码率波动性大,有可能某些帧的比特数过高,不适用于有实际带宽限制的流媒体传输。
0<a<1,这样的设置没有什么意义,得不到任何的好处。
a=1,等于CBR,CBR是一种复杂和平滑场景都不大讨好的码率控制方法,一般不采用这一方法。
a>1,对每帧数据有限制,但又可以暂时超过平均码率,适用于流媒体传输。
对于某些特殊场景编码,例如电脑屏幕编码,它的特点是I帧纹理细节丰富,编码数据极大,P帧变化很小或者根本没变化,p帧数据很小。
这种情况,如果不设置vbv参数(保持缺省值0),I帧数据压不下来,码流会周期性的高低变动;有可能造成网络拥塞,数据包丢失,解码端花屏。
如果设置a=1,I帧得到限制,可以压下来,但编码质量下降太多,主观质量差。
因此需要根据网络设置成a>1,使得I帧可以暂时有限度的大于平均码率,而P帧编码时候还能把平均码率降下来。

--vbv-init <float>      Initial VBV buffer occupancy [0.9]
默认:0.9
说明:设置播放之前必须先载入多少码流到VBV缓冲中。如果值小于1,那么大小就为 vbv-init * vbv-bufsize。如果大于1,则是以kbits为单位的值。
参见:–vbv-maxsize,
ABR时不要设置这个参数,可以完全忽略这个参数。

ffmpeg的码率控制
ABR(Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 1000k ....
它提供了某种“运行均值”的目标,终极目标是最终文件大小匹配这个“全局平均”数字(因此基本上来说,如果编码器遇到大量码率开销非常小的黑帧,它将以低于要求的比特率编码,但是在接下来几秒内的非黑帧它将以高质量方式编码方式使码率回归均值)使用两边编码模式是这个方法变得更加有效,你可以和“max bit rate ”配合使用来防止码率的波动。

CBR(Constant Bit Rate)
事实上根本就没有CBR这种模式,但是你可以通过补充ABR参数“模拟”一个恒定比特率设置,比如:
ffmpeg -i input -c:v libx264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
在这个例子中,-bufsize是一个“码率控制缓冲区”,因此它会在每一个有用的1835k视频数据内强制一个你所要求的均值(此处为4000k),所以基本上我们会认为接收端/终端播放器会缓冲那么多的数据,因此在这个数据内部波动是没有问题的。
当然,如果只有黑帧或者空白帧,它所花费的的比特率将少于需求位率(但它会尽可能的提高质量水平,直到crf)。
最大比特率的CRF模式
你可以通过声明-crf和-maxrate设置来使用带有最大比特率crf模式,比如:
ffmpeg -i input -c:v libx264 -crf 20 -maxrate 400k  -bufsize 1835k  
这将会有效的将crf值锁定在20,但是如果输出码率超过400kbps,在这种情况下编码器会将质量降低到低于crf 20。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/evsqiezi/article/details/53215797

智能推荐

Peewee 使用_xiaoming0018的博客-程序员秘密

Peewee是一个简单小巧的Python ORM,它非常容易学习,并且使用起来很直观。如果想快速入门,请参考官方的Quckstart。基本知识在官方的Quckstart中,Peewee中Model类、fields和model 实例与数据库的映射关系如下:也就是说,一个Model类代表一个数据库的表,一个Field字段代表数据库中的一个字段,而一个model类实例化对象则代...

jax_ws_带有JAX-RS和PrimeFaces的RESTful图表_cunfen8879的博客-程序员秘密

jax_ws 通常,利用图表提供数据的可视表示很有用。 PrimeFaces提供制图解决方案,使您可以轻松地将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起,我们可以创建自定义图表,以适合台式机和移动设备。 在本文中,我将更新Java EE 7动手练习MoviePlex应用程序,以提供一个仪表板,我们可以...

深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)_weixin_34248849的博客-程序员秘密

目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引、父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1.8 属性表集 ...

HackTheBox - Vaccine_hackthebox vaccone_Briyney的博客-程序员秘密

Hack The Box :: Starting Point - Tier2 - Vaccine

AD18常用快捷键_小学徒666的博客-程序员秘密

目录Altium Designer(AD18)常用操作和快捷方式简单操作分层设计原理图库PCB库集成库PCB绘制覆铜 Altium Designer(AD18)常用操作和快捷方式 简单操作 方格与格点的切换:View-Grids-ToggleVisible Grid Kind 原点:Edit-Origin-Set 边界的定义:Keep Out Layer-Utility Tools-Place Line 按TAB可定义线宽

译(五十)-Pytorch转换Tensor至numpy数组_MWHLS的博客-程序员秘密

文章首发及后续更新:https://mwhls.top/3680.html新的更新内容请到mwhls.top查看。无图/无目录/格式错误/更多相关请到上方的文章首发页面查看。stackoverflow热门问题目录如有翻译问题欢迎评论指出,谢谢。 目录 1. Pytorch tensor 转为 numpy array 2. Pytorch tensor to numpy array Pytorch tensor 转为 numpy arrayDukeLover asked:对于一个大小为 torch

随便推点

WebLogic 12c 二三事_weixin_34061482的博客-程序员秘密

写在前面的话,在前人的基础上,重新实践了一遍,有些是截取了部分总结,有些是照搬,原文请注意蓝色超链。安装篇关于WebLogic的安装,之前通过图形化的安装方式,部署WebService以后,通过不带WSDL地址访问WebService路径,会有一个TEST选项。(稍后补图) 后来项目正式环境没有图形化界面,只能静默安装,结果就没有这个TEST的选项,也不知道是为什么,无从下...

iOS 定位和地图_FirstBloodFB的博客-程序员秘密

iOS中有三个定位服务组件:   Wifi定位,通过查询一个Wifi路由器的地理位置的信息。比较省电,iPod touch和iPad也可以采用。   蜂窝基站定位,通过移动运用商基站定位。也适合有3G版本的iPod touch和iPad。   GPS卫星定位,通过3-4颗GPS定位位置定位,最为准确,但是耗电量大,不能遮挡。Core LocationCore

python 数据库框架peewee_Python加peewee让数据库访问更简单_weixin_39629679的博客-程序员秘密

经常有人贬低ORM(Object Relational Mapping),说性能不好,麻烦。这种人要么是互联网企业的大牛,要么是根本没维护过大型代码。做为接地气的程序 员,多少还是要接触到Hibernate, ActiveRecords这样各种ORM框架的。不然你就要面对成千上万行的SQL代码无从下手。peewee是以简单为卖点的ORM, 我就喜欢这样的框架,类似的还有flask, sinatra...

javascript中常用属性和方法的笔记_羊阳洋丶的博客-程序员秘密

下面写了一些经常用的e.target //e.target是指向我们点击的对象,那个触发了事件,点那个li你们a.target就指向li //this是指向绑定的对象,绑定了ul那么this指向ul var ul=document.querySelector("ul"); ul.addEventListener("click",function(e){ console.log(e.target); co..

《Linux4.0设备驱动开发详解》笔记--第十一章:内存与I/O访问_zcj仲从建的博客-程序员秘密

由于Linux系统提供了复杂的内存管理功能,所以内存的概念在Linux系统中的相对复杂,有常规的内存、高端的内存、虚拟地址、逻辑地址、总线地址、物理地址、I/O内存、设备内存、预留内存等概念11.1 CPU与内存、I/O11.1.1 内存空间与I/O空间I/O空间:在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的它通过特定的指令in、out来访问指令格式:IN 累加器

数据库领域颠覆先行者虽难 但总有机会_cuanlielian4510的博客-程序员秘密

导语:去年双11支付宝核心交易流量完全不依赖Oracle数据库,100%由阿里巴巴自主研发的数据库产品OceanBase承载的消息,不仅让OceanBase名声大噪,也让项目负责人阳振坤被推到了前台。不少人惊呼国产数据库发...