假想参考解码器 vbv HRD
视频编码中有个hypothetical reference decoder(HRD), 从标准H26x系列的各个协议的附录中都可以看到有专门介绍该解码器的,在MPEG2/H262的附录中,把它叫视频缓冲校验video buffer verifier(VBV),其实这两个是一个东西。vbv buffer的作用是平滑编码器的输出码流,防止码流抖动过大,通常可以和码率控制模块结合使用。在面向传输的视频编码中,vbv buffer很有用处,因此当前主流的编解码器都有这个东西或者类似的东西,比如x264/x265中的vbv,webRTC中的jitter buffer。
vbv buffer原理
vbv buffer其实是一个leaky bucket 漏桶模型。编码端和解码端都有这样的一个buffer,编码端的buffer是用来模拟解码的过程的,从而有效得控制好码率。我们的控制目标是为了尽量让vbv buffer不上溢(overflow)并且不下溢(underflow),上溢的后果就是会出现码流丢失,下溢的结果就是出现视频播放卡顿。
vbv buffer有三个重要的参数(B, R, F):
B: buffer 的大小,用bits来衡量
R: 传输的峰值码率,用bits/s来衡量
F: buffer的初始充盈度,用bits来衡量。
刚开始时,buffer为空,随着码流进入buffer,一直到他的初始充盈度F,这时才能开始解码(也就是说解码器从这个时候开始才能从buffer里面取数据),那么这就产生了一个解码时延的问题,又叫init delay,或者叫vbv delay,总之都是一个东西,很多实时通信技术所谓的低时延优化其实就是优化这个地方。解码器每隔一定的时钟周期就来检查一下buffer,并从中取走一帧数据。这个时钟周期和FPS有关。下面详细说明MPEG 和 H263中的buffer是怎么操作的,其他后来的协议都是基于此原理改进。
一、MPEG 的 video buffer verifier
MPEG的vbv有两种模式,分别是CBR和VBR,MPEG1和MPEG4只支持CBR,MPEG2两个都支持。
在CBR模式下:
- R = RMAX = 平均码率
- B的大小是在码流头部的vbv_buffer_size指定(单位是16*1024 bits)
- vbv_delay也是码流头部指定,也就是说初始充盈度也就确定了,因为vbv_delay = F / R
- vbv buffer的充盈度满足下面的条件
B0 = F
Bi+1 = Bi - bi + R/M
解释下,Bi代表取第i帧时,buffer的充盈度,bi代表第i帧的bits大小。M是个时钟频率。编码器必须保证Bi - bi总是大于0(不下溢),Bi总是小于B(不上溢)如图所示。
在VBR模式下: - R = RMAX = 最大码率,也就是说总是用最大码率灌数据
- F = B,也就是初始充盈度是整个buffer的大小
- vbv buffer的充盈度满足下面的条件
B0 = B
Bi+1 = min(B,Bi - bi + R/M)
vbr只保证缓冲器不下溢,不保证缓冲器不上溢,如图。
其实还有个低时延模式,这个模式打开后初始充盈度很小,只比第一帧多一点点,这种情况是不保证缓冲器不下溢的,也就是说可能会出现缓冲区下溢,进而造成视频卡顿,这是低时延的牺牲。从这里可以看出,初始充盈度越大,时延越长。
二、H263的HRD
H263的HRD其实和MPEG的vbv buffer有点像,区别主要有以下两点:
1、解码器定期检查buffer,只要有一个完整的帧就取出来开始解码,跳帧是允许的,也就是说下溢是允许的,下溢的发生意味着解码器来检查的时候发现没有完整的一帧,必须等完整的一帧都到达bufer之后才能开始解码。
2.检查发生在取出来一帧之后。
另外,模型稍微有一点不一样。H263的buffer的大小是B + MAXBPP,检查的时候要求第i帧的尺寸满足:
也就是在取走每一帧后,都摇保证剩下的充盈度小于B。
H263的模型适用于低时延,并且允许偶尔有较大的码率波动,这就是他加一个MAXBPP的原因。MAXBPP是协商出来的一帧最大bits.
为什么需要vbv buffer
假如我们的编码时面向存储的,那么久无需这个buffer,编码出来的码率随便你怎么波动,我只存在本地就OK。现在问题是我们是面向传输的,要考虑到网络的带宽问题,以及网络的抖动,如果我们编码出来的码率变化非常大,那么很不利于传输,比如为了帧的质量,突然编出来一个很大的帧,需要传输很久,那么解码端那边就会需要等很久,体现在播放时长时间卡住。因此需要这个buffer来平滑码率,他通过码控模块来进行反馈,当码控模块检测buffer时发现buffer很满了,就通过调节QP的方式,是编码的码率降下来。另外关于时延的问题,必须要说明的是,引入vbv buffer模型并不是问了降低时延,相反他反而会引入解码时延,但是他可以有效防止时延抖动,让你看视频不卡(只要防止下溢就行),通过把初始充盈度调大一点就能做的很好。
假想参考解码器 vbv HRD相关推荐
- 假定参考解码器(HRD)及它如何用来检查比特流与解码器一致性
有两类比特流是HRD 一致性检查的对象:第一类比特流称为类型I 比特流,为 NAL 单元流,只包含有VCL NAL 单元与在比特流里对于所有访问单元的填充NAL 单元数据.第二类比特流, 称为类型II ...
- 【HEVC学习与研究】11.HEVC参考解码器的设置及参数解析过程
之前已经讨论过如何运行HM的encoder工程,已经可以成功将一个yuv测试序列编码为一个.bin格式的二进制码流.这里我们再看看它的逆过程,即将二进制码流进行解码. 在整个HM的solution中很 ...
- 视频编码中的一些缩写
视频编码中一些缩写 HEVC/VVC 码率控制 AVS3 指令集相关 @***-保持更新-*** GOP(Group of Pictures)--图像组 CTU(Coding Tree Unit)-- ...
- H.264压缩算法详解
H.264压缩算法详解 H.264是一种视频高压缩技术,全称是MPEG-4 AVC,用中文说是"活动图像专家组-4的高等视频编码",或称为MPEG-4 Part10.它是由国际电信 ...
- VVC spec中文翻译
本文仅为作者阅读VVC spec的翻译笔记,若理解有误,欢迎留言. 参考文章:VVC spec / H266 spec 目录 第3章.定义 第4章.缩写 第7章.语法 和 语义 7.4.4.Profi ...
- X264算法参数二(VUI参数配置)
一.VUI参数概览 参数名称 参数类型 参数含义 参数配置 i_width int 视频图像的宽 i_height int 视频图像的高 i_csp int 视频图像数据格式 参见X264_C ...
- 视频编码标准汇总及比较
MPEG-1 类型:Audio&Video 制定者:MPEG(Moving Picture Expert Group) 所需频宽:2Mbps 特性:对动作不激烈的视频信号可获得较好的图像质量, ...
- VVC/VSEI 高层语法
参考The High-Level Syntax of the Versatile Video Coding (VVC) Standard 0 基本情况 HLS:High-level syntax,高层 ...
- 视频编码标准H.264/AVC
H.264/AVC 是ITU-T VCEG 和ISO/IEC MPEG 共同开发的视频处理标准,ITU-T作为标准建议H.264,ISO/IEC作为国际标准14496-10(MPEG-4 第10部分) ...
- 数字电视信号源编码的主要技术及标准
[摘要]:本文介绍了有关数字电视信源编码的一些主要技术和标准,包括数字演播室标准ITU--601,压缩编码的基本原理和方法,图像压缩编码标准H261,JPEG和MPEG,以及作为数字电视信源编码标准输 ...
最新文章
- jQuery / jQuery mvc plugin
- 浮点数相加php,利用php怎么实现一个浮点数精确运算功能
- CSS3动画(典型模板)
- ROS2学习(九).ROS概念 - ROS 2参数(ROS 2 parameters)
- 有关进程的一些基本概念
- 十年只为一个摧残的梦(转载)
- 程序人家:你的老板逼你上微服务了吗??
- android读写缓存文件路径,Android app-cache-Path的 缓存图片、缓存文件的路径包名路径 和外路径比较...
- 帆软报表-打印sql日志设置
- es的query及filter 1
- 微信小程序全国城市搜索(可进行城市中文拼音首字母搜索)
- java毕业设计彩妆销售网站Mybatis+系统+数据库+调试部署
- 阿里云服务器ECS测评
- 七年级计算机上册知识树,七年级上知识树.doc
- 协调世界时转换为GPS周秒(转载)
- c++获取umg ue_[UE4][V4.10]C++中定义UMG widget变量时的头文件引用有关问题
- 4.OC仿写知乎客户端
- elasticjob已下线_elasticJob 源码解析之自诊断恢复
- 从Hadoop到Spark、Flink,大数据处理框架十年激荡发展史!
- android metal api,Metal入门002-Metal相关API