图片的信息可以分为亮度信息(luminance information)和色彩信息(color information)。亮度信息传达了图片的大部分信息,一部黑白电影相较于彩色电影而言并不会丢失多少细节。色彩信息虽然重要,但是对于人们对于图片的认知而言,并不会有决定性的影响。人的视觉对亮度更加敏感,而对于色彩相对而言没有那么敏感。色彩采样法可以在保留亮度信息的基础上减少色彩的信息,以此来起到压缩图片尺寸的效果。
下面的三张图展示了不同的采样方法所带来的效果。采样由三个参数的比值构成:J:a:b。其中J表示区域的宽度,通常为4。a表示在第一行进行色彩抽样的数目,b表示在第二行进行色彩抽样的数目。
上图展示了4:4:4的抽样效果。由于宽度为4,因此参数J为4。第一行采样数为4个,因此参数a为4。第二行采样数为4个,因此参数b为4。
上图展示了4:2:2的抽样效果。由于宽度为4,因此参数J为4。第一行采样数为2个,因此参数a为2。第二行采样数为2个,因此参数b为2。
上图展示了4:2:0的抽样效果。由于宽度为4,因此参数J为4。第一行采样数为2个,因此参数a为2。第二行直接使用了第一行采样的结果,因此没有进行任何采样,参数b为0。
首先要说明RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间(有时也叫彩色系统或彩色空间)。它的用途是在某些标准下用通常可接受的方式对彩色加以描述。本质上,彩色模型是坐标系统和子空间的阐述。
【1】RGB
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开。它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像。
【2】YUV
在 YUV空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下改变。
YUV使用RGB的信息,但它从全彩色图像中产生一个黑白图像,然后提取出三个主要的颜色变成两个额外的信号来描述颜色。把这三个信号组合回来就可以产生一个全彩色图像。
Y 通道描述Luma 信号,它与亮度信号有一点点不同,值的范围介于亮和暗之间。 Luma 是黑白电视可以看到的信号。U (Cb) 和 V (Cr)通道从红 (U) 和蓝 (V) 中提取亮度值来减少颜色信息量。这些值可以从新组合来决定红,绿和蓝的混合信号。
【3】YCbCr
YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分,其实是YUV经过缩放和偏移的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV家族中, YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。
YUV(YCbCr)采样格式:
主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值), 每 2 x 2 个点保存一个 Cr和Cb值,图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 每个点需要8x3=24 bits, 而现在仅需要 8+(8/4)+(8/4)=12bits,平均每个点占12bits。这样就把图像的数据压缩了一半。
上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:
(1) YUV 4:4:4
YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。
下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3V3]
存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
(2) YUV 4:2:2
每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存(例如下面映射出的前两个像素点只需要Y0、Y1、U0、V1四个字节)。
下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3V3]
存放的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 V3 有的描述为 Y0 U0 Y1 V0 Y2 U2 Y3 V2
映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2V3] 有的描述为[Y0 U0 V0] [Y1 U0 V0] [Y2 U2 V2] [Y3 U2V2]
(3) YUV 4:1:1
4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存
下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3V3]
存放的码流为: Y0 U0 Y1 Y2 V2 Y3 存在同上的另种描述
映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0V2] 存在同上的另种描述
(4)YUV4:2:0
4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。
下面八个像素为:
[Y0 U0 V0][Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的码流为:
Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
映射出的像素点为:
[Y0 U0 V5][Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5][Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
YUV格式有两大类:planar和packed。
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。
YUV采样的进一步说明
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。
用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
先记住下面这段话,以后提取每个像素的YUV分量会用到。
2. 存储方式
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
(1) YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。(2) UYVY 格式 (属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
(3) YUV422P(属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。
(4)YV12,YU12格式(属于YUV420)
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
(5)NV12、NV21(属于YUV420)
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
YV12和I420的区别 一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV标准格式4:2:0)的数据量是 size=width×heigth×1.5 Bit。 在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。即将图像的颜色空间由RGB2YUV。因为,X264在进行编码的时候需要标准的YUV(4:2:0)。但是这里需要注意的是,虽然YV12也是(4:2:0),但是YV12和I420的却是不同的,在存储空间上面有些区别。如下: YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
可以看出,YV12和I420基本上是一样的,就是UV的顺序不同。
继续我们的话题,经过第一次数据压缩后RGB24->YUV(I420)。这样,数据量将减少一半,为什么呢?呵呵,这个就太基础了,我就不多写了。同样,如果是RGB24->YUV(YV12),也是减少一半。但是,虽然都是一半,如果是YV12的话效果就有很大损失。然后,经过X264编码后,数据量将大大减少。将编码后的数据打包,通过RTP实时传送。到达目的地后,将数据取出,进行解码。完成解码后,数据仍然是YUV格式的,所以,还需要一次转换,这样windows的驱动才可以处理,就是YUV2RGB24。
YUY2 是 4:2:2 [Y0 U0 Y1 V0]
yuv420p 和 YUV420的区别 在存储格式上有区别
yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv
YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
J:a:b
,以表示一个宽为 J 像素、高为 2 像素的采样区域内 Y Cb Cr(Y U V)的采样比:
例如上图:
4:1:1
:宽度 J 为 4,第一行只有一个样点(一种颜色),所以 a 为 1,第二行和第一行不同的样点只有一个,所以 b 为 1,所以为 4:1:1
;4:2:0
:宽度 J 为 4,第一行有两个样点,所以 a 为 2,第二行和第一行样点完全相同,所以 b 为 0,所以为 4:2:0
;这个比例值并非 Y Cb Cr 分量个数的直接比例。对亮度来说,一个样点由一个 Y 构成,而对色度来说,一个样点由两个值构成:Cb 和 Cr。以 4:2:0
为例,在 4x2 的采样区域内,有 8 个亮度样点,2 个色度样点(在上图中可以看成左右各一个),所以有 8 个 Y,2 个 Cb,2 个 Cr。
a 和 b 的取值并非可以随意组合,比如 a 为 2 时,表示第一行有两个样点,如果 b 为 1,那就是说第二行样点有一个和第一行不同,但到底哪一个样点和第一行不同,无法确定,所以这种组合就被禁止了。实际上常见的可取组合也就是上图中列出的五种。
planar, packed 和 semi planar 是描述分量如何存储的:
YUV 数据在内存中存储时,每行像素的数据后面可能还有填充字节,这主要是因为有些系统/环境/操作对内存的字节对齐有要求,比如 64 字节对齐,那么宽度为 720 像素的图像,一行就不满足 64 对齐的要求,那就要填充到 768 像素。存储一行像素所需的字节数,就叫 stride,也叫 pitch。比如这里举的例子,宽为 720,stride 或 pitch 就是 64。
图像的高度通常没有类似的情况,因为图像处理通常都是逐行的,所以才会对一行的宽度有要求,而对于多少行则没有要求。
I420 的采样比是 4:2:0
,它是 planar 存储方式,分量存储顺序依次是 Y, Cb, Cr,例如下图表示了宽为 6 像素、高为 4 像素图像的三种分量存储方式:
最好忽略那几个箭头,采样区域通常都是 4x2,而非 2x2。
安卓的 MediaCodec 对于 YUV 的输入格式,COLOR_FormatYUV420SemiPlanar
支持得最好,而这种格式就是 NV12 格式。
NV12 的采样比是 4:2:0
,它是 semi planar 存储方式,先存储 Y 分量,后面 Cb 和 Cr 分量一起存储,Cb 在前,Cr 在后:
安卓的 Camera API 回调的 YUV 数据,默认就是 NV21 格式。
NV21 和 NV12 类似,采样比是 4:2:0
,也是 semi planar 存储方式,先存储 Y 分量,后面 Cb 和 Cr 分量一起存储,只不过 Cr 在前,Cb 在后:
注意:有个工具网站 rawpixels.net,它的 Predefined format 应该是把 NV12 和 NV21 搞反了,它的 NV12 是 V 在前,NV21 是 U 在前,实际上应该是 NV12 U 在前,NV21 V 在前,因此使用这个网站时,这两种格式应该互换一下。
YUV 的格式太多,这里就不一一介绍了,把握上面介绍的两个要点即可:采样比,存储方式。
可以参考下 fourcc 的这个网页。
Textures can be bound to the graphics pipeline as shader resource (SRV), render target (RTV), depth-stencil (DSV) or unordered access view (UAV)
编码器中有一个码率控制模块,通过选择一系列编码参数,来控制编码视频的码率满足需要,并且使编码失真尽可能小。码率控制严格上不属于视频编码标准,属于率失真优化。
码率控制的几种模式[1]:
恒定QP(Quantization Parameter)。
ffmpeg -s 1280x720 -i -c:v libx264 -qp 23
恒定质量因子。
codec | 取值范围 | 默认值 | 建议值 |
---|---|---|---|
x264 | [0, 51] | 23 | [18, 28] |
x265 | [0, 51] | 28 | ? |
VP9 | [0, 63] | - | [15, 35] |
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
指定平均码率。
ffmpeg -s 1280x720 -i -c:v libx264 -b:v 1M
ffmpeg -s 1280x720 -i -c:v libx265 -b:v 1M
ffmpeg -s 1280x720 -i -c:v libvpx-vp9 -b:v 1M
2-Pass ABR
ffmpeg -i -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i -c:v libx264 -b:v 1M -pass 2 .mp4
ffmpeg -i -c:v libx264 -b:v 1M -x265-params pass=1 -f null /dev/null
ffmpeg -i -c:v libx264 -b:v 1M -x265-params pass=2 .mp4
ffmpeg -i -c:v libvpx-vp9 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i -c:v libvpx-vp9 -b:v 1M -pass 2 .webm
前面几个模式都属于可变码率VBR(Variable Bitrate),瞬时码率在波动。恒定码率与之相对,在更小的时间窗口保持码率的波动更小。
nal-hrd
选项强制编码器始终使用某个比特率[1]。输出文件需要是.ts(MPEG-2 TS),因为MP4不支持NAL填充。注意,如果视频源是易于编码的,此模式将浪费带宽,但它确保比特率在整个流中保持不变。ffmpeg -i -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M
ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M
视频缓冲校验提供了一种方法,以保证码率被限制在一定的最大值。
-maxrate
和-bufsize
选项打开VBV以设置最大比特率和预期的客户端缓冲区大小:ffmpeg -i -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M
ffmpeg -i -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000
ffmpeg -i -c:v libvpx-vp9 -crf 30 -b:v 2M
ffmpeg -i -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2
ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f null /dev/null
ffmpeg -i -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000
ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2
如何设置bufsize?
如果要限制流的码率,尝试将bufsize设置为最大速率的一半或更低。
BLA、CRA、IDR是文献中提到过的三种随机接入点(RAP),在文献中的解释的确不是很容易理解。更关键的是,与这三个名词相应的还有GOP,open/closed GOP, RASL,RADL等等概念,环环相扣,一个不理解,剩下的也很难弄懂,下面我们一个一个解释,很多也是我自己刚刚想到的,不一定正确全面,欢迎批评。
(1)关于GOP。这是图像组(Group of Pictures)的意思,表示编码的视频序列分成了一组一组的有序的帧的集合进行编码。每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是关键帧。在程序cfg中,GOP的长度和两个I帧的距离也是两个不同参数指定的(如GOP Size和IntraPeriod或者类似的参数)。所以,两个I帧的间距不可能大于GOP的长度,一般情况是更小的。
(2)关于IDR。这个词儿的全称是Instantaneous Decoding Refresh,是在H.264中定义的结构。在H.264中,IDR帧一定是I帧,而且一定是GOP的开始,也是H.264 GOP的关键帧。但是反过来却不成立,I帧不一定是IDR帧。GOP的长度不是定死不变的,在H.264的编码器中,如果判定场景发生变化,那么即使不到原定GOP的末尾,也会在这个位置加入一个IDR,作为新一个GOP的开始。此时这个GOP的长度就被缩小了。
(3)闭合GOP和开放GOP(closed GOP/open GOP),CRA。闭合GOP是H.264中GOP的格式。在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“封闭”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。这时,一个GOP的起始帧命名为CRA(clean random access),同样采用帧内编码,但是这个GOP内的帧间编码帧可以越过CRA参考前一个GOP的数据,这便是GOP的open。
(4)关于BLA。个人感觉BLA只是CRA在视频流切换情况下的一种特例。视频流在某个RAP上要求切换到另一个视频流继续解码,则直接将该CRA同另一个视频流中的接入CRA连接,后者便是BLA。由于BLA之前解码到缓存的视频流与当前视频流无关,因此其特性类似于直接从该点进行随机存取后的CRA。
(5)RASL和RADL。这是两种GOP间的图像类型。如果解码器从某个CRA随机接入,则按照显示顺序的后面几帧数据由于缺少参考帧而不能解码,这些图像将被解码器抛弃,即skip leading。而对于没有从当前CRA接入的数据,这些图像可以被正常解码显示,因此称为decodable leading。由于这些数据是有可能舍弃的,因此其他图像(trailing pictures)不能参考这些数据,否则万一这些图像被舍弃,将会有更多的图像受其影响而不能正常解码。
下面举个例子:
假设视频序列的显示顺序为①,这是一个完整的GOP,解码顺序为②
①I B B P B B P B B P
②I P B B P B B P B B
在H.264中,第一个I帧为IDR,GOP为闭合结构,因此两个GOP组成视频的结构为
I B B P B B P B B P I B B P B B P B B P(显示顺序)
I P B B P B B P B B I P B B P B B P B B(解码顺序)
而在HEVC中,两个I帧为CRA,GOP为开放结构,因此GOP的结构为:
I B B P B B P B B P B B I B B P B B P B (显示顺序)
I P B B P B B P B B I B B P B B P B B...(解码顺序)
两个红色的B帧表示的是按照解码顺序在CRA之后,该GOP内参考的前一个GOP进行编码的图像。这样便很容易得知,如果选择在第二个CRA进行随机接入,这两个红色的B帧将会由于没有参考帧无法解码而被舍弃。这两个红色的B帧即RASP。如果没有选择这个CRA进行随机接入,这两个红色B帧将可以顺利解码,即成为RADP。
对于BLA,情况也是类似的。由于出现码流拼接,第二段码流的CRA之后的B也会因为没有参考帧无法解码而丢弃。很容易理解,此时缓存中的参考帧数据还来自上一段码流,跟当前码流没关系,当然不能用作B的参考了。
之余HEVC这么设计的目的,我觉得应该是为了编码效率考虑的。因为B帧的压缩比相对是最高的,引入这种设计可以在不影响随机存取性能的前提下,尽可能增大B帧的比重,提高整体压缩编码的性能。
BRISK算法是2011年ICCV上《BRISK:Binary Robust Invariant Scalable Keypoints》文章中,提出来的一种特征提取算法,也是一种二进制的特征描述算子。
它具有较好的旋转不变性、尺度不变性,较好的鲁棒性等。
在图像配准应用中,速度比较:SIFT 在对有较大模糊的图像配准时,BRISK算法在其中表现最为出色。 在过去的十年里,基于网络的视频应用变得非常普遍,现代设备和网络基础设施推动了高分辨率、高质量内容消费的快速增长。因此,占主导地位的带宽消费者,如视频点播(VoD)、实时流媒体和会话视频,以及新兴的新应用,包括虚拟现实和云游戏,这些都非常依赖于高分辨率和低延迟,对传输基础设施提出了严峻的挑战,因此对高效视频压缩技术的需求更加强烈。 VP9使用从64×64级别到4×4级别的四种划分方式,对于8×8以下的块有额外的限制,在8x8块中,所有子块都应保存相同的参考帧,如图1上半部分所示,以确保色度块至少可以用4×4块单元处理。注意,图中标有为R的分块是递归的,因此R分块可以重复再划分,直到达到最低的4×4级。 AV1将最大编码块单元增加到128×128,并扩展分区树以支持10种可能的结果,以进一步包括4:1/1:4矩形编码块尺寸。与VP9相似,仅允许使用方形块进行进一步细分。此外,AV1为8x8以下的块增加了更大的灵活性,使每个编码块都可以在行内/帧内模式和参考帧选择之间进行切换。为了支持这种灵活性,它允许对色度分量进行2×2的帧间预测,同时保持最小的变换大小为4×4。 VP9支持10种帧内预测模式,包括8种方向模式,分别对应45到207度的角度模式,以及两种非定向预测器:DC和true motion(TM)模式。AV1,潜在的帧内编码进一步探索了不同的方法:方向预测的粒度进一步升级,而非方向性的预测,纳入了梯度和相关性,亮度的一致性和色度信号也得到充分利用,并开发出针对人造视频内容特殊优化的工具。 以利用方向纹理中更多种类的空间冗余。在AV1中,对于大于8 × 8的块,方向帧内模式被扩展到具有更精细粒度的角度集。最初的8个角度是标称角度,在此基础上引入3度步长的细微角度变化,即预测角度由标称内部角度加上角度增量表示,角度增量是步长的-3 ~ 3倍。为了通过一般方式在AV1中实现方向预测模式,48种扩展模式由统一的方向预测器实现,该方向预测器将每个像素链接到边缘中的参考子像素位置,并通过2抽头双线性滤波器插值参考像素。AV1总共支持56种方向帧内模式。 AV1中方向帧内预测的另一个增强是,在参考像素值用于预测目标块之前,对其应用低通滤波器。滤波器强度是基于预测角度和块大小预先定义的。 VP9有两种非定向帧内预测模式:DC_PRED和TM_PRED。AV1在此基础上增加了三种新的预测模式: SMOOTH_PRED、SMOOTH_V_PRED和SMOOTH_H_PRED。第四种新的预测模式PAETH_PRED [19]是现有的TM_PRED模式。新模式的工作原理如下: 为了捕捉边缘具有参考的衰减空间相关性,通过将块视为二维不可分离马尔可夫模型,为亮度块设计了FILTER _ INTRA模式。为AV1预先设计了五种滤波器帧内模式,每种模式由一组八个7-tap滤波器表示,反映了与补片相邻的4 × 2 p像素之间的相关性(例如,图2中蓝色补片的P0 P6)。一个帧内块可以选择一个滤波器帧内模式,并以4 × 2 的补丁的进行批量预测。通过所选的一组7抽头滤波器对8个像素位置的相邻像素进行不同的加权,来预测补丁块。对于那些没有完全附着到块边界上的参考的4 × 2单元,例如图2中的绿色块,将直接相邻的预测像素用作参考,这意味着在4 × 2补丁块之间递归地计算预测,以便合并更多较远位置上的边缘像素。 Chroma from Luma(CfL)是仅用于色度的帧内预测器,通过以重建后亮度像素的线性函数建模得到色度像素。预测的色度像素是通过将DC预测加到缩放的交流贡献上而获得的。DC预测是使用DC帧内预测模式通过当前块相邻的重建色度像素计算的。在零均值二次采样的重合重建亮度像素中,通过比特流中信号表示的比例因子。二次抽样步骤和平均减法相结合,以减少误差。为每个色度分量发信号通知缩放因子,但是它们是联合编码的。信号比例因子降低了解码器的复杂性,并产生更精确的研发优化预测。更多信息请参考图3和[20]。 有时,尤其是对于像截屏和游戏这样的人工视频,块可以用少量独特的颜色来近似。因此,AV1将调色板模式引入帧内编码器,作为通用的额外编码工具。块的每个平面的调色板预测器由(I)具有2-8种颜色的调色板和(ii)块中所有像素的颜色索引来指定。基色的数量决定了保真度和紧凑度之间的权衡。通过参考相邻块的基色,在比特流中传输块的基色。然后,不存在于相邻块调色板中的基色被增量编码。颜色索引是使用基于邻域的上下文逐像素熵编码的。亮度和色度通道可以决定是否独立使用调色板模式。对于亮度通道,调色板中的每个条目都是一个标量值;对于色度通道,中的每个条目都是一个二维元组。在用调色板模式建立块的预测之后,变换编码和量化被应用于残差块,就像其他帧内预测模式一样。 AV1允许其帧内编码器参考同一帧中先前重建的块,其方式类似于帧间编码器引用前一帧中块的方式。这对于通常包含重复纹理的屏幕内容视频非常有用。具体来说,一种名为IntraBC的新预测模式被引入,它将在当前帧中拷贝一个重建的块作为预测。参考块的位置由位移矢量指定,其方式类似于运动补偿中的运动矢量压缩。位移矢量以亮度平面的整像素为单位,可以指相应色度平面上的半像素位置,其中双线性滤波用于子像素插值。 IntraBC模式仅用于关键帧或者仅帧内编码的帧。它可以通过帧级标志打开和关闭。IntraBC模式不能引用当前Tile之外的像素。为了便于硬件实现,对参考区域有一些额外的限制。例如,当前superblock和IntraBC可能引用的最新superblock之间有256个水平像素的延迟。另一个限制是当IntraBC在当前帧打开时,必须关闭包括去块滤波器、环路恢复滤波器和CDEF滤波器在内的环路滤波器。尽管有所有这些限制,IntraBC模式仍然为屏幕内容视频带来了显著的压缩改进。 运动补偿是视频编码中必不可少的模块。在VP9中,在最多三个候选参考帧中允许最多两个参考,然后预测器将进行基于块平移的运动补偿,或者如果有两个参考信号则取这两次预测的平均值。AV1具有更强大的帧间编码器,极大地扩展了参考帧和运动矢量库,打破了基于块的平移预测的局限性,并通过使用适应性强的加权算法和信源来增强复合预测。 AV1将每个帧的参考数量从3个扩展到7个。除了VP9的LAST (最近过去的)帧、GOLDEN(遥远过去的)帧和ALTREF(临时过滤的未来)帧之外,我们还添加了两个过去的帧(LAST2和LAST3)和两个未来帧(BWDREF和ALTREF2)[21]。图4展示了GOLDEN组的多层结构,其中自适应数量的帧共享相同的GOLDEN帧和ALTREF帧。BWDREF是一种直接编码的超前帧,无需应用时域滤波,因此更适合用作相对距离较短的后向参考。ALTREF2用作GOLDEN和ALTREF之间的中间过滤的将来参考。所有的新参考方式都可以通过单个预测模式使用,也可以被组合成复合模式使用。AV1提供了丰富的参考帧对集合,既提供双向复合预测,又提供单向复合预测,从而可以对各种具有动态时域相关特性的视频进行更自适应、更优化的编码。 有效的运动矢量(MV)编码对于视频编解码器至关重要,因为它占用了帧间的很大一部分码率成本。为此,AV1结合了复杂的MV参考选择方案,以通过搜索空间和时间候选来获得给定块的良好MV参考。AV1不仅搜索比VP9更广的空间邻域来构建空间候选库,而且利用运动场估计机制来生成时间候选。运动场估计过程分为三个阶段:运动矢量缓冲、运动轨迹创建和运动矢量投影。首先,对于每个编码后的帧,我们存储其参考帧索引和相关的运动矢量。该信息将被下一编码帧参考以生成其运动场。运动场估计检查运动轨迹,例如图5中的MVRef2将一个参考帧Ref2中的块指向另一个参考帧Ref0Ref2的某个位置,可能会通过每个64×64处理单元,检查最多3个参考中并列的128×128缓冲运动矢量场。接下来,在编码块级别,一旦已经确定参考帧,就通过将运动轨迹线性投影到期望的参考帧上(例如,将图5中的MVRef2转换为MV0或MV1)来生成运动矢量候选。一旦所有的空间和时间候选被聚集在池中,它们被排序、合并和排序以获得最多四个最终候选[22,23]。评分方案依赖于计算当前块具有特定MV作为候选的可能性。为了编码MV,AV1用信号通知从列表中选择的参考MV的索引,然后根据需要对运动矢量差进行编码。 OBMC通过平滑地组合从邻近运动矢量创建的预测,可以大大减少块边缘附近的预测误差。在AV1中,设计了一种两面因果重叠算法,以使OBMC轻松适合高级分块框架[9]。它通过在垂直和水平方向上应用预定义的一维滤波器,逐步将基于块的预测与二次帧间预测器结合在上方边缘和左侧边缘。二次预测器仅在当前块的上/左半部分的受限重叠区域中操作,因此它们不会在同一侧彼此缠绕(参见图6)。AV1OBMC仅对使用单个参考帧的块启用,并且仅与具有两个参考帧的任何邻居的第一个预测器一起工作,因此最坏情况下的存储器带宽与传统复合预测器所要求的相同。 AV1通过两种仿射预测模式(全局和局部扭曲运动补偿)开发扭曲运动模型[25]。全局运动工具用于处理摄影机运动,并允许在帧和每个参考之间发出仿射模型的帧级信号。局部扭曲运动工具旨在通过从分配给因果邻域的运动矢量信号的二维位移中推导块级模型参数,从而以最小的开销隐式描述变化的局部运动。通过比较两种编码工具在块级别转换模式,只有在RD成本方面有优势时才选择它。更重要的是,AV1中的仿射扭曲受到的限制较小,因此可以在SIMD和硬件中通过水平剪切和垂直剪切来有效地实现仿射扭曲(图7),其中每个剪切点使用1/64像素精度的8-tap插值滤波器。 为提高AV1编码器间的通用性,开发了一系列新的复合预测工具。在本节中,可以将任何复合预测操作针对像素(i,j)概括为:: pf (i, j) = m(i, j)p1(i, j)+(1 − m(i, j))p2(i, j),其中p1和p2是两个预测变量,而pf是最终的复合预测,其中[0,1]中的加权系数m(i,j)专为不同的用例而设计,可以很容易从预定义表中生成。 [11] AV1无需像VP9中那样强制执行固定的变换单元大小,而是将亮度帧间编码块划分为多种大小的变换单元,这些变换单元可以由递归分区(最多递减两个级别)表示。为了合并AV的扩展编码块分区,我们支持从4×4到64×64的正方形,2:1/1:2和4:1/1:4比例也都可以。此外,色度转换单元总是要尽可能地大。 AV1中为帧内和帧间定义了更丰富的变换核集合。完整的2-D核集由四种1-D变换类型的水平/垂直组合生成,总共产生16个核选项[27]。一维变换类型包括VP9中使用的DCT和ADST、flipADST则以相反的顺序应用ADST,并且身份变换(IDTX)意味着沿某个方向跳过变换编码,因此对于编码锐利边缘特别有用。。在实践中,这些内核中的几个在较大的块大小时会给出类似的结果,从而允许随着变换大小的增加而逐渐减少可能的内核类型。 VP9使用基于树的布尔型非自适应二进制算术编码器对所有语法元素进行编码。AV1转向使用符号间自适应多符号算术编码器。AV1中的每个语法元素都是由N个元素组成的特定字母表中的成员,上下文由一组N个概率和一个小计数组成,以便于早期快速适应。概率被存储为15位累积分布函数(CDFs)。与二进制算术编码器相比,精度更高,从而可以准确地跟踪字母表中不太常见的元素的概率。概率通过简单的递归缩放进行调整,其中更新因子基于字母大小。由于符号比特率是由编码系数、运动矢量和预测模式共同决定的,所有这些都使用大于2的字母,因此对于典型的编码方案,与纯二进制算术编码相比,这种设计实际上使吞吐量降低2倍以上。 在硬件中,复杂度由核心乘法器的吞吐量和大小决定,核心乘法器会重新调整算术编码状态间隔。编码实际上并不需要跟踪概率所需的较高精度。这允许通过从16×15位四舍五入到8×9位乘法器来实质上减小乘法器大小。通过强制执行最小间隔大小,可以简化此舍入,而最小间隔大小又允许简化的概率更新,其中值可能变为零。在软件中,操作计数比复杂度更重要,并且减少吞吐量和简化更新相应地减少了每个编码/解码操作的固定开销。 在VP9中,编码引擎按照扫描顺序顺序处理每个量化的变换系数。用于每个系数的概率模型与先前编码的系数级别,其频带,变换块大小等相关。为了正确捕获广阔基数空间中的系数分布,AV1更改为用于较大变换系数建模的电平图设计和压缩[28]。它建立在以下观察基础上:较低的系数水平通常会占主要的费率成本。 对于每个变换单元,AV1系数编码器从编码一个跳过符号开始,然后是变换核类型和当不跳过变换编码时所有非零系数的结束位置。然后,对于系数值,并没有采用为所有系数级别统一分配上下文的模型,而是将级别分为不同的平面。在结束位置被编码之后,低层和中层平面以相反的扫描顺序被编码在一起。然后,符号平面和更高级别平面以正向扫描顺序编码在一起。低层平面对应于0–2的范围,中层平面负责3–14的范围,高层平面覆盖15及以上的范围。这种分离允许我们将丰富的上下文模型分配给较低级别的平面,而这一平面充分考虑了变换维、块大小、以及邻近系数信息,以适度的上下文模型大小提高压缩效率。较高级别的平面对3到15之间的级别使用简化的上下文模型,并使用ExpGolomb代码直接对15级以上的残差进行编码。 AV1允许将多个环路滤波工具相继应用于解码帧数据的过程。第一级是去块滤波器,它与VP9中使用的去块滤波器大致相同,只是做了些微小改动。最长的滤波器从VP9中的15抽头减少到13抽头。此外,对于亮度和每个色度平面,现在在水平和垂直方向上发出单独滤波级别的信号,更具灵活性,并且能够在超级块之间更改级别。AV1中的其他过滤工具描述如下: CDEF是一种细节保持去块滤波器,设计为在去块之后应用。它的工作原理是估计边缘和图案的方向,然后应用一个大小为5 × 5、12个非零权重的不可分离的非线性低通方向滤波器。为了避免发送方向信号,解码器使用标准的快速搜索算法来估计方向。解码过程的完整描述可以在参考文献中找到。[29]。 其中N包含x(i,j)附近的像素,权重wm,n,f()和g()是下面描述的非零非线性函数,R(x)将x舍入为最接近零的整数。 f()函数修改要过滤的像素与相邻像素之间的差异,并由分别在64×64块级别和帧级别指定的两个参数(强度S和阻尼值D)确定。强度S钳位允许的最大差值减去D所控制的削减。g()函数将要过滤的像素x的修改值限制为x与支撑区域中x(m,n)之间的最大差值保持滤波器的低通特性。 循环恢复过滤器:AV1在CDEF之后添加了一组用于循环应用的工具,这些工具的使用是相互斥的,其可选大小为64×64、128×128、或256×256的被称之为循环恢复单元(LRU)。具体来说,对于每个LRU,AV1允许在如下两个滤波器[15]之一之间进行选择。 根据当前带宽自适应切换帧分辨率是视频流服务中的常见做法。例如,当可用带宽较低时,服务可以发送较低分辨率的帧,然后将它们升级到显示设备分辨率。然而,这种缩放现在发生在视频编解码器之外。 AV1中新的帧超分辨率框架背后的动机是通过使其成为编解码器本身的一部分来使这一缩放过程更加有效。这种编码模式允许以较低的空间分辨率对帧进行编码,然后在更新参考缓冲器之前,以标准方式在环路内超分辨率至全分辨率。后来,这些超分辨参考缓冲区可用于预测后续帧,即使它们的分辨率不同,这要归功于AV1的有限预测能力。 在客观指标上,超分辨率几乎总是比在编解码器之外放大较低分辨率的帧好得多。此外,在非常低的比特率下,就感知度量而言,有时也观察到比全分辨率更好。此外,它为编码器的速率和质量控制提供了额外的维度。虽然在这一领域有大量的研究,但图像处理文献中的大多数超分辨率方法对于视频编解码器中的环路操作来说过于复杂。在AV1中,为了使运算在计算上易于处理,超分辨过程被分解为线性向上扩展,随后以更高的空间分辨率应用循环恢复工具。具体来说,维纳滤波器特别擅长超分辨率和恢复丢失的高频。唯一附加的标准操作是在使用循环恢复之前的线性升级。此外,为了实现成本有效的硬件实现,不需要线缓冲器中的开销,放大/缩小被限制为仅水平操作。图11描述了使用帧超分辨率时环路滤波管道的总体架构,其中CDEF以编码(较低)分辨率运行,但是在线性升频器水平扩展图像以解决部分分辨率后,环路恢复运行较高的频率丢失。 AV1中的胶片颗粒合成是应用于编码/解码循环之外的标准后处理[31]。富含电视和电影内容的电影胶片通常是电影的一部分。它的随机性使得传统的编码工具很难压缩。相反,在压缩之前从内容中去除颗粒,其参数被估计并在AV1比特流中发送。解码器基于接收到的参数合成颗粒,并将其添加到重建的视频中(参见图12的细节)。 颗粒被建模为自回归(AR)过程,其中亮度的最高AR系数为24,每个色度分量的AR系数为25。这些系数用于生成64×64亮度颗粒模板和32×32色度模板。然后从模板中的随机位置获取小颗粒补丁并将其应用于视频。补丁之间的不连续性可以通过可选的重叠来缓解。薄膜的颗粒强度也随信号强度而变化,因此每个颗粒样品都按比例缩放[16]。 该工具支持胶片颗粒强度和信号强度之间关系的灵活建模,如下所示: Y’是用胶片颗粒重噪声的结果亮度,Y是添加胶片颗粒之前亮度的重建值,GL是亮度胶片颗粒样本。这里,f(Y)是一个分段线性函数,根据亮度分量值缩放胶片颗粒。这个分段线性函数被信号通知给解码器,并且可以被实现为预先计算的查找表(LUT),该查找表在运行当前帧的颗粒合成之前被初始化。对于色度分量(例如Cb),当色度中的膜颗粒强度取决于luma分量时,使用以下公式调制噪声以便于颗粒强度建模: 其中u是LUT中对应于Cb分量比例函数的索引,参数bCb、dCb和hCb用信号通知解码器。 一组胶片颗粒参数最多可占用大约145个字节。每个帧可以接收一组新的纹理参数,或者如果先前解码的帧中的一个可用,则可以重复使用这些参数。 AV1支持由多个超级块(super blocks)组成的独立tiles,tiles可以任意顺序编码和解码。由编码参数定义,tiles可以是均匀的(即tiles具有相同的尺寸)或不均匀的(即tiles可以具有不同的尺寸)。独立的tiles支持提供了编码的灵活性,这样编码器和解码器就可以运行了,并且可以变得更快。 在libaom代码库中,多线程(MT)已经在编码器和解码器中实现,包括基于tile的MT和基于行的MT。当允许使用tile,基于tile的MT提供了显著的加速。当不使用或很少使用tile时,基于行的MT允许线程对单个超级块行进行编码和解码,从而进一步提高了速度。在一个720p视频编码中使用四个tiles和四个线程,编码器的加速比约为3倍,解码器的加速比约为2.5倍。 随着虚拟现实(VR)应用的日益普及,AV1第一次提供了一种使实时VR应用可行的解决方案。大规模平铺工具允许解码器只提取帧中感兴趣的部分,而不需要解压缩整个帧。这显著地降低了解码器的复杂性,并且对于实时应用非常有用,例如光场,其随着观看者的头部移动呈现帧的单个部分。 https://www.cnblogs.com/xkfz007/archive/2012/07/30/2614467.html 1.视频处理 2. 预处理 预处理的目的 为了减少原图像受到的损害,保持原图像的重要特征,使原图像能被高效的压缩 为了进行视频格式转换 去隔行(Deinterlace) 3. 去隔行的方法 在单场内去隔行 两场间去隔行 运动补偿方法 4. MPEG去隔行处理 5. 空间缩放 上采样(Up sample)方法 最近邻插值(Nearest-neighbor interpolation ) P(x,y)=P(0,0)xy+P(1,0)(1-x)y+P(0,1)x(1-y)+P(1,1)(1-x)(1-y) 下采样(Down sample)方法 5. 超分辨率 6. 帧率转换 3:2下拉 7. 后处理 后处理的目的是为了去除解码图像的各种效应,最大程度恢复损失的图像数据,提高解码图像的主观质量 量化方法使变换系数信息损失导致解码图像产生失真和块边界的不连续性 视频码流传输及解码导致的解码图像质量问题 8. 块效应 块效应产生原因 9. 去除块效应滤波 去除块效应滤波 环外滤波(Out loop filter): 环路滤波(In loop filter): 10. 振铃效应 振铃效应产生原因 11. 数据丢失 12. H.264的环路滤波 滤波强度 滤波强度和量化参数QP有关 根据滤波强度(Bs)的不同有两种滤波器 当满足以下条件对边界进行强滤波 第11章 视频编码标准 1.国际标准组织 2. ITU 3. VCEG VCEG制订标准: 4. ISO/IEC 5. MPEG MPEG制订标准: 6. 视频编码标准 7. 标准的应用 8. 其他标准组织 AVS (China Audio and Video Standard) SMPTE (The Society of Motion Picture and Television Engineers ) 9. 视频编码标准发展 10. MPEG-1 编码技术:基于H.261 11. MPEG-2 编码技术:基于MPEG-1 三种类型的缩放 12. H.263系列 H.263编码技术:基于H.261 四种高效编码模式 H.263+编码技术:基于H.263 增加了12个选项提高压缩效率 H.263++编码技术:基于H.263+ 增加了三个选项,增强抗误码能力 13. MPEG-4 编码技术:基于H.263 增加了基于对象的编码和操作 基于对象编码 Sprite编码 网格(Mesh)动画编码 14. H.264/AVC 15. H.264编码结构 16. H.264-Intra编码 17. H.264-运动补偿 ¼象素精度亮度运动补偿 1/8象素精度色度运动补偿 多参考帧 18. H.264多参考帧 P帧 B帧 每个List最大可包含16个参考帧 19. H.274-加权预测 20. H.264-切换图像 SP/SI帧实现 特点 21. H.264-FMO 灵活宏块顺序(Flexible MB Order,FMO) 22. H.264-数据分区 将码流按照重要程度分成三部分 23. H.264-ASO,RP 任意条带顺序(Arbitrary Slice Order,ASO) 冗余图像(Redundant Picture) 24. H.264-视频编码层 VCL层包含: 25. H.264-网络提取层 26. H.264-Profiles 27. H.264-Levels 28. AVS vs. H.264 29. 性能比较 IDR Instantaneous Decoding Refresh,即时解码刷新。为将首个I帧和其他I帧区别开,定义首个I帧为IDR帧。它与I帧、P帧、B帧的区别见 http://blog.csdn.net/sphone89/article/details/8086071。 GOP Group of Picture,关键帧的周期,也就是两个IDR帧之间的距离,一个帧组的最大帧数,一般而言,每一秒视频至少需要使用 1 个关键帧。增加关键帧个数可改善质量,但是同时增加带宽和网络负载。在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP 开始才有可能得以恢复,所以GOP值也不宜设置过大。 同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。 采样率 指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大,音质越好。比特率 = 采样率 × 采用位数 × 声道数. 比特率 比特率是指每秒传送的比特(bit)数。单位为bps(Bit Per Second),比特率越高,传送的数据越大。在视频领域。比特率是指将数字声音、视频由模拟格式转化成数字格式的采样率,采样率越高,还原后的音质、画质就越好。 比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最小的单位,要么是0,要么是1。比特率与音、视频压缩的关系,简单的说就是比特率越高,音、视频的质量就越好,但编码后的文件就越大;如果比特率越少则情况刚好相反。 分辨率 就是帧大小每一帧就是一副图像。640*480分辨率的视频,建议视频的码率设置在700以上,音频采样率44100就行了。一个音频编码率为128Kbps,视频编码率为800Kbps的文件,其总编码率为928Kbps,意思是经过编码后的数据每秒钟需要用928K比特来表示。 计算输出文件大小公式:[音频编码率(KBit)/8 +视频编码率(KBit)/8]×影片总长度(秒)=文件大小(MB) 码流/码率 码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就 越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。 当然,码流越大,文件体积也越大,其计算公式是文件体积=时间X码率/8。例如,网络上常见的一部90分钟1Mbps码流的720P RMVB文件,其体积就=5400秒×1Mb/8=675MB。 通常来说,一个视频文件包括了画面及声音,例如一个RMVB的视频文件,里面包含了视频信息和音频信息,音频及视频都有各自不同的采样方式和比特率, 也就是说,同一个视频文件音频和视频的比特率并不是一样的。而我们所说的一个视频文件码流率大小,一般是指视频文件中音频及视频信息码流率的总和。 以国内最流行,大家最熟悉的RMVB视频文件为例,RMVB中的VB,指的是VBR,即Variable Bit Rate的缩写,中文含义是可变比特率,它表示RMVB采用的是动态编码的方式,把较高的采样率用于复杂的动态画面(歌舞、飞车、战争、动作等),而把较低的采样率用于静态画面,合理利用资源,达到画质与体积可兼得的效果。 码率设置时,一般需考虑三个因素: 1、分辨率 分辨率是决定位率(码率)的主要因素,不同的分辨率要采用不同的位率。总体而言,录像的分辨率越高,所要求的位率(码率)也越大,但并不总是如此,图1说明了不同分辨率的合理的码率选择范围。所谓“合理的范围”指的是,如果低于这个范围,图像质量看起来会变得不可接受;如果高于这个范围,则显得没有必要,对于网络资源以及存储资源来说是一种浪费。 2、场景 监控的场景是设置码率时要考虑的第二个因素。在视频监控中,图像的运动剧烈程度还与位率有一定的关系,运动越剧烈,编码所要求的码率就越高。反之则越低。因此在同样的图像分辨率条件下,监控人多的场景和人少的场景,所要求的位率也是不同的。 3、存储空间 最后需要考量的因素是存储空间,这个因素主要是决定了录像系统的成本。位率设置得越高,画质相对会越好,但所要求的存储空间就越大。所以在工程实施中,设置合适的位率即可以保证良好的回放图像质量,又可以避免不必要的资源浪费。 码率控制算法 动态调整编码器参数,得到目标比特数。为视频序列中的图像组GOP、图像或子图像分配一定的比特。现有的码率控制算法主要是通过调整离散余弦变换的量化参数(QP)大小输出目标码率。 编码模式 VBR:Variable BitRate,动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。 ABR:Average BitRate,平均比特率 是VBR的一种插值参数。ABR在指定的文件大小内,以每50帧 (30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。 CBR:Constant BitRate,是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。优点是压缩速度快,缺点是每秒流量都相同容易导致空间浪费。 CVBR:Constrained Variable it Rate,VBR的一种改进,兼顾了CBR和VBR的优点:在图像内容静止时,节省带宽,有Motion发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。比较理想的模型如下: QP Quantizer Parameter,量化参数,反映了空间细节压缩情况。值越小,量化越精细,图像质量越高,产生的码流也越长。如QP小,大部分的细节都会被保留;QP增大,一些细节丢失,码率降低,但图像失真加强和质量下降。 fps Frames Per Second,帧率,缩写为帧/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(fps)越多,所显示的动作就会越流畅。 profile level 分别是BP、EP、MP、HP: 1、BP-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC; 2、EP-Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC; 3、MP-Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持; 4、HP-High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、无损视频编码和更多的YUV 格式。 AV1视频编解码器核心编码工具概述
一、介绍
二、AV1编码工具
1.编码块划分
2.帧内预测
1) 帧内预测方向的增强
2)无方向平滑帧内预测器
3)基于递归滤波的帧内预测器
4)从亮度预测色度
5)调色板作为预测器
6)帧内块内复制
3.帧间预测
1)扩展参考帧
2)动态时间与空间运动矢量参考
3)重叠块运动补偿(OBMC)
4)扭曲运动补偿
5)高级复合预测
4. 变换编码
1)变换块分区
2)扩展变换核
5. 熵编码
1) 多符号熵编码
2)水平图系数编码
6. 环路滤波工具和后处理
1)约束方向增强滤波器(CDEF)
2)环路恢复滤波器
3)帧超分辨率
4)胶片颗粒合成
7.Tiles and multi-threading
1) AV1Tiles
2)大规模tiles
视频编解码学习之四:视频处理及编码标准
流媒体码流、分辨率、gop、qp、fps、cvbr等常见概念理解