假想参考解码器 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模型并不是问了降低时延,相反他反而会引入解码时延,但是他可以有效防止时延抖动,让你看视频不卡(只要防止下溢就行),通过把初始充盈度调大一点就能做的很好。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值