在做视频编码时,当我们给编码器设定一个目标码率的时候,编码器内部是怎么达到码率要求的呢 ?

编码器如何合理分配码率,以获得更高的视频质量 ?

这都是码率控制的问题。

x264的码率控制分为帧间级和帧内级,本文介绍帧间级各种码率控制类型,其内涵和使用方法。

1 目的和意义:

码率控制有两个目的

  • 兼容传输、播放条件
  • 更高的视频质量

1.1 兼容传输、播放条件

视频编码中,越高的码率通常可以产生更高的质量。同时,保持一定质量的情况下,不同复杂度场景需要的码率是不一样的。

如果不进行码率控制,视频的码率会不可控制。下图是对一段40s的视频,采用固定量化参数(也就是没有码率控制)编码后的瞬时码率分布。

可以看到,码率的波动很大。这对于传输是不利的。码率控制通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求。

【图1】固定量化参数,码率分布

1.2 更高的视频质量

在满足码率要求的前提下,码率控制的另一个目标是更高的视频质量。

如何通过在帧间以及帧内合理分配比特,实现率失真性能优化,是码率控制研究的问题。

2. 分类

码率控制可以分为两类:

  • CBR :  constant bit rate, 固定码率
  • VBR:   variable bit rate, 可变码率

2.2 恒定码率模式

图2是第一节中同样视频用CBR模式编码得到的码率分布图。

可以看到它的码率波动比图1小。

恒定码率不代表每个瞬间的码率都一样,实际上那是不可能的。恒定码率模式究竟是什么原理,我们在下文会详细展开。

【图2】恒定码率

使用固定码率会损害视频质量,但对传输有好处。

2.3 可变码率模式

可变码率是一类码率控制算法的统称,它们的特点是局部的码率是可变的。 常用的可变码率子类包括:

  • abr : average bit rate, 平均码率。
    局部码率是可变的,限制整个文件的的评价码率。
  • crf: constant refactor, 恒定质量
    把某个恒定的“质量”作为目标,灵活分配码率,最终的码率大小是不确定的。
  • cqp: constant qp: 恒定量化参数
    采用固定的qp, 相当于没有码率控制

3. 恒定码率 CBR 的内涵

恒定码率模式有点tricky,容易导致误解。

  • 它不代表每个瞬间码率相同。这是不可能的,由于I帧,P帧和B帧体积相差巨大。
  • 它也不代表每一秒(或者某个时间窗口)码率相同。实际上,如图2所见,每一秒的数据量是不同的。
  • CBR 的 “固定码率”, 指的是固定 “信道容量”。 码率控制的目标是,在用恒定的速率传输码流,播放器的接收缓存不会上溢,也不会下溢。

3.1 vbv 模型

CBR 码率控制算法是针对缓冲区校验模型的。

区校验模型是视频编码标准的重要组成部分,是用来验证编码码流是否符合标准的重要工具。

在 MPEG系列标准中缓冲区模型常称 VBV ( Video Bu Verifier ) , 即视频缓冲区校验器,在 H.26x系列标准中,该部分称 HRD ( Hypothetical Reference Decoder) ,即假想参考解码器。

vbv 模型假想编码码率通过一个容量受限的信道传输到解码设备,解码设备在解码前有一个缓存。解码器实时从缓存区取数据解码。vbv必须保证缓存区不上溢,也不下溢。

解码器的缓存可以理解成一个水池,如下图所示。水池的输入速度是恒定的,也就是设定的码率。水池的输出的不恒定的,是视频的实际瞬时码率。

缓存区的存在使得视频的瞬时码率可以在一定范围内波动。

但是,如果视频实际瞬时码率过大,从缓存区取数据的速度就会大于填数据的速度,这是缓冲区有可能就被取空了,这叫做缓冲区的下溢。

相反,如果视频实际瞬时码率过小,从缓存区取数据的速度就会小于填数据的速度,这是缓冲区有可能就会溢出,这叫做缓冲区的上溢。

不难理解,vbv 能容忍的最大码率波动和缓冲区的大小,以及缓冲区初始充盈程度有关。

3.2 vbv 参数的设置方法

在x264中, vbv 有两个参数可以设置,分别是:

---vbv-maxrate, 设置缓冲区最大填入速度。

---vbv-bufsize , 设置缓冲区大小。

例子:

假设设置maxrate= 1M, bufsize = 2M,  缓冲区初始是充盈的。假设某时峰值率是2M, 那么能容忍的峰值的最大长度为 2M/(2M-1M) = 2s

假设某时峰值率是3M, 那么能容忍的峰值的最大长度为 2M/(3M-1M) = 2s

假设某时峰值率是11M, 那么能容忍的峰值的最大长度为 2M/(11M-1M) =0.1s

也就是说,计算设置最大码率为1M, 也能容忍很高的码率峰值。越高的峰值,能容忍的时长越短。

效果:

bufsize 越大,码率波动空间越大 → 视频质量越好。

bufsize 越大,播放延时越大。 延时 delay = bufsize / maxrate。 (假设需要等缓冲区填满才开始播放)

bufsize设置的大小取决于容忍的延时以及播放器的硬件内存限制。

足够长的时间里,总码率 约等于  maxrate * 时间。

4. 可变码率 VBR 的类型和内涵

  • abr   平均码率,控制的目标是整个文件的平均码率
    2 pass : 两趟编码,根据第一趟的实际码率,估计每一帧复杂度
    1 pass : 一趟编码, 根据已编码的邻近帧,估计正在编的帧的复杂度
  • crf 
    恒定质量: 控制一个恒定的“质量”,总码率不可控。
  • cqp
    恒定qp: 恒定量化参数,关闭一切码率控制算法。cqp 和crf 的区别是,crf 允许x264对每一帧,每一宏块灵活选取qp, 通过对视觉感知特点的运用,产生一个恒定的“质量”。

视频 码率控制类型和内涵相关推荐

  1. MediaInfo+c#获取视频码率

    MediaInfo,简介我不重复了,我使用的方式主要是在项目中引用其dll来查看视频的码率. MediaInfl带有How to user的c# sample,使用时注意要将MediaInfo的dll ...

  2. 视频码率,帧率和分辨率的区别

    视频码率,帧率和分辨率到底哪一个影响电影的清晰度 码率(bit 率):影响体积,与体积成正比:码率越大,体积越大:码率越小,体积越小. 码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kb ...

  3. 视频码率[百科词条]

    视频码率 编辑 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒. 中文名 视频码率 定    义 数据传输单位时间传送的数据位数 单    位 kbps即千位每秒 ...

  4. 视频码率,帧率和分辨率

    视频码率,帧率和分辨率到底哪一个影响电影的清晰度 码率:影响体积,与体积成正比:码率越大,体积越大:码率越小,体积越小. 码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒 ...

  5. 【视频码率相关笔记】

    码率是指视频文件在单位时间内使用的数据流量,是视频编码中画面质量控制中最重要的部分,一般用的单位是kbps.码率并不是越高越好,因为码率高到一定极限之后,人眼就很难辨别出更好的画质了,但是视频的体积会 ...

  6. 视频码率(Bitrate),帧率(FPS)和分辨率的联系与区别

    一.视频码率 码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒.也就是取样率(并不等同与采样率,采样率的单位是Hz,表示每秒采样的次数),单位时间内取样率越大,精度就越高 ...

  7. 音视频码率,采样率,帧率基础知识

    音视频码率,采样率,帧率基础知识 简单来讲,采样率和比特率就像是坐标轴上的横纵坐标. 横坐标的采样率表示了每秒钟的采样次数.  纵坐标的比特率表示了用数字量来量化模拟量的时候的精度(在计算机里面占几个 ...

  8. 3GPP: IMS视频码率自适应调整介绍

    3GPP即第三代合作计划,是权威的3G技术规范机构.3GPP成立时的目标是实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性. 其职能: 3GPP主要是制 ...

  9. 【ffmpeg】生成的视频码率显示N/A或者0kb?

    cv::Mat转 yuv时 ,写入本地视频H264,生成的视频码率显示N/A或者0, 解决办法:设置GOP size大小 c->codec = codec;c->gop_size = 50 ...

  10. 视频码率 - Bitrate

    视频码率编辑 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒. 中文名 视频码率 定    义 数据传输单位时间传送的数据位数 单    位 kbps即千位每秒 分 ...

最新文章

  1. JSP显示页面和数据库乱码
  2. 《Agile Impressions》作者问答录
  3. mysql导入csv大数据
  4. java ndk 在哪_NDK简介
  5. 计算机存有多少游戏,8G和16G的计算机内存之间有很大区别吗?玩游戏需要多少内存?...
  6. android studio Cmake undefine func
  7. [Ext JS ] 7.25.1 Form或者面板自动定位到错误的输入框
  8. Arch Linux配置gnome桌面
  9. 超强的照片无损放大修复工具 SmartDeblur模糊照片变清晰工具
  10. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificat
  11. 【ARM】程序快速定位segmentation fault core dumped错误
  12. 怎么用python画房子_用python画一个小房子
  13. 微信小程序毕业设计题目音乐播放器+后台管理系统|前后分离VUE.js
  14. 一种简单的色彩平衡算法的OPENCV实现
  15. java实现PEKS_JAVA线程基础
  16. 用IE浏览器打开vsd文件
  17. Luogu P2245 星际导航
  18. 芯片测试术语 ,片内测试(BIST),ATE测试
  19. 1:MOST: A Multi-Oriented Scene Text Detector with Localization Refinement
  20. java se的命令文件_Java SE的命令文件(java、javac、javadoc等)所在目录是___

热门文章

  1. JavaCV图片和视频互转 视频添加文字
  2. uni-app 极光推送
  3. Gateway过滤器详解
  4. Required method destroyItem was not overridden
  5. kettle读txt文件并处理
  6. YOLOv4 改进 | 记录如何一步一步改进YOLOv4到自己的数据集(性能、速度炸裂)
  7. 游戏加速器安卓apk代码
  8. 生活中的算法的实际举例_生活中的算法
  9. CNN的基本概念、常用的计算公式和pytorch代码
  10. 小米8使用usb连接计算机,小米怎么连接电脑usb(小米8连接电脑看不到文件)