音视频开发学习笔记(二)----视频基础概念

文章目录
1.图像的表示方式--RGB
2.视频的表示方式--YUV
3.视频编码
3.1 压缩方式
3.2 编码标准
3.2.1 MPEG
3.2.2 H.264
3.3 编码概念
3.3.1 IPB帧
3.3.2 PTS与DTS
3.3.2 GOP的概念
1.图像的表示方式–RGB
   咱们都知道视频都是由图片组成的,任何一个图像均可以由RGB组成,凡是渲染到屏幕上的东西,都要转换为RGB的表示形式。当屏幕要显示某篇文字或者某幅图像时,就会把这幅图像的每个像素点的RGB通道分别对应的屏幕位置上的子像素点绘制到屏幕上,从而显示整个图像,而每一个像素点都由三个子像素点组成。那么像素里的子像素又改如何表示呢?主要有如下两种:算法

浮点表示:
   取值范围为0.0~1.0,好比,在OpenGL ES中对每个子像素点的表示使用的就是这种表达方式。
整数表示:
   取值范围为0~255或者00~FF,8个比特表示一个子像素,32个比特表示一个像素,这就是相似于某些平台上表示图像格式的RGBA_8888数据格式。好比,Android平台上RGB_565的表示方法为16比特模式表示一个像素,R用5个比特来表示,G用6个比特来表示,B用5个比特来表示。
   对于一幅图像,通常使用整数表示方法来进行描述。网络

   每一张图像的裸数据(bitmap 位图)都是很大的。对于图像的裸数据来说,直接在网络上进行传输也是不太可能的,因此就有了图像的压缩格式,好比JPEG压缩:JPEG是静态图像压缩标准,由ISO制定。JPEG图像压缩算法在提供良好的压缩性能的同时,具备较好的重建质量。这种算法被普遍应用于图像处理领域,固然其也是一种有损压缩。可是,这种压缩不能直接应用于视频压缩,由于对于视频来说,还有一个时域上的因素须要考虑,也就是说,不只仅要考虑帧内编码,还要考虑帧间编码。视频采用的是更成熟的算法。性能

2.视频的表示方式–YUV
   对于视频帧的裸数据表示,其实更多的是YUV数据格式的表示,YUV主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传输相比,它最大的优势在于只须要占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中 “Y”表示明亮度(Luminance或Luma),也称灰阶值;而 “U”和“V”表示的则是色度(Chrominance或Chroma),它们的做用是描述影像的色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一块儿。“色度”则定义了颜色的两个方面——色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差别,而Cb反映的则是RGB输入信号蓝色部分与RGB信号亮度值之间的差别。优化

   之因此采用YUV色彩空间,是由于它的亮度信号Y和色度信号U、V是分离的。若是只有Y信号份量而没有U、V份量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号,最经常使用的表示形式是Y、U、V都使用8个字节来表示,因此取值范围就是0~255。,在传输过程当中,为了防止信号变更形成过载,Y的取值范围一般都是16~235,UV的取值范围都是16~240。编码

   YUV最经常使用的采样格式是4:2:0,4:2:0并不意味着只有Y、Cb而没有Cr份量。它指的是对每行扫描线来讲,只有一种色度份量是以2:1的抽样率来存储的。相邻的扫描行存储着不一样的色度份量,也就是说,若是某一行是4:2:0,那么其下一行就是4:0:2,再下一行是4:2:0,以此类推。对于每一个色度份量来讲,水平方向和竖直方向的抽样率都是2:1,因此能够说色度的抽样率是4:1。.net

3.视频编码
   视频压缩也是经过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上(空域)的冗余信息和时间上(时域)的冗余信息。压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技术。设计

3.1 压缩方式
去时域:视频

使用帧间编码技术能够去除时间上的冗余信息,具体包括如下几个部分:blog

运动补偿:
   运动补偿是经过先前的局部图像来预测、补偿当前的局部图像,它是减小帧序列冗余信息的有效方法。图片

运动表示:
   不一样区域的图像须要使用不一样的运动矢量来描述运动信息。运动矢量经过熵编码进行压缩。

运动估计:
   运动估计是从视频序列中抽取运动信息的一整套技术。

   使用帧内编码技术能够去除空间上的冗余信息。

去空域:

主要使用帧内编码技术和熵编码技术:

变换编码
帧内图像和预测差分信号都有很高的空域冗余信息。变换编码将空域信号变换到另外一正交矢量空间,使其相关性降低,数据冗余度减少。

量化编码
通过变换编码后,产生一批变换系数,对这些系数进行量化,使编码器的输出达到必定的位率。这一过程致使精度的下降。

熵编码
熵编码是无损编码。它对变换、量化后获得的系数和运动信息,进行进一步的压缩。

3.2 编码标准
3.2.1 MPEG
   MPEG(Motion JPEG)编码是由ISO也制定的视频编码标准。MPEG算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样能够大大提升视频的压缩比。截至目前,MPEG的版本一直在不断更新中,主要包括这样几个版本:Mpeg1(用于VCD)、Mpeg2(用于DVD)、Mpeg4 AVC(如今流媒体使用最多的就是它了)。

3.2.2 H.264
   相比较于ISO制定的MPEG视频压缩标准,ITU-T制定的H.26一、H.26二、H.26三、H.264一系列视频编码标准是一套单独的体系。其中,H.264集中了以往标准的全部优势,并吸收了以往标准的经验,采用的是简洁设计,这使得它比Mpeg4更容易推广。如今使用最多的就是H.264标准,H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/四、1/8)和新一代的环路滤波器,这使得压缩性能获得大大提升,系统也变得更加完善。

3.3 编码概念
3.3.1 IPB帧
视频压缩中,每帧都表明着一幅静止的图像。而在进行实际压缩时,会采起各类算法以减小数据的容量,其中IPB帧就是最多见的一种。

I帧:
帧内编码帧(intra picture),I帧一般是每一个GOP(MPEG所使用的一种视频压缩技术)的第一个帧,通过适度地压缩,做为随机访问的参考点,能够当成静态图像。I帧能够看做一个图像通过压缩后的产物,I帧压缩能够获得6:1的压缩比而不会产生任何可觉察的模糊现象。I帧压缩可去掉视频的空间冗余信息,P帧和B帧是为了去掉时间冗余信息。

P帧:
前向预测编码帧(predictive-frame),经过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。

B帧:
双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧。

基于上面的定义,咱们能够从解码的角度来理解IPB帧。

I帧自身能够经过视频解压算法解压成一张单独的完整视频画面,因此I帧去掉的是视频帧在空间维度上的冗余信息。
P帧须要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。
B帧则须要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,因此P帧与B帧去掉的是视频帧在时间维度上的冗余信息。
IDR帧与I帧 区别

   在H264的概念中有一个帧称为IDR帧,那么IDR帧与I帧的区别是什么呢?由于H264采用了多帧预测,因此I帧以后的P帧有可能会参考I帧以前的帧,这就使得在随机访问的时候不能以找到I帧做为参考条件,由于即便找到I帧,I帧以后的帧仍是有可能解析不出来,而IDR帧就是一种特殊的I帧,即这一帧以后的全部参考帧只会参考到这个IDR帧,而不会再参考前面的帧。在解码器中,一旦收到一个IDR帧,就会当即清理参考帧缓冲区,并将IDR帧做为被参考的帧。

3.3.2 PTS与DTS
    DTS主要用于视频的解码,PTS主要用于在解码阶段进行视频的同步和输出。在没有B帧的状况下,DTS和PTS的输出顺序是同样的。由于B帧打乱了解码和显示的顺序,因此一旦存在B帧,PTS与DTS势必就会不一样。这里先简单介绍一下FFmpeg中使用的PTS和DTS的概念,FFmpeg中使AVPacket结构体来描述解码前或编码后的压缩数据,用AVFrame结构体来描述解码后或编码前的原始数据。对于视频来讲,AVFrame就是视频的一帧图像,这帧图像何时显示给用户,取决于它的PTS。DTS是AVPacket里的一个成员,表示该压缩包应该在何时被解码,若是视频里各帧的编码是按输入顺序(显示顺序)依次进行的,那么解码和显示时间应该是一致的,可是事实上,在大多数编解码标准(如H.264或HEVC)中,编码顺序和输入顺序并不一致,因而才会须要PTS和DTS这两种不一样的时间戳。

3.3.2 GOP的概念
   两个I帧之间造成的一组图片,就是GOP(Group Of Picture)的概念。一般在为编码器设置参数的时候,必需要设置gop_size的值,其表明的是两个I帧之间的帧数目。前面已经讲解过,一个GOP中容量最大的帧就是I帧,因此相对来说,gop_size设置得越大,整个画面的质量就会越好,可是在解码端必须从接收到的第一个I帧开始才能够正确解码出原始图像,不然会没法正确解码(这也是前面提到的I帧能够做为随机访问的帧)。在提升视频质量的技巧中,还有个技巧是多使用B帧,通常来讲,I的压缩率是7(与JPG差很少),P是20,B能够达到50,可见使用B帧能节省大量空间,节省出来的空间能够用来更多地保存I帧,这样就能在相同的码率下提供更好的画质。因此咱们要根据不一样的业务场景,适当地设置gop_size的大小,以获得更高质量的视频。

能够结合IPB帧和下图,更好地理解PTS与DTS的概念。

相关文章
相关标签/搜索