视频基础

三色光

等量的三原色光相加会变为白光,即白光中含有等量的红光(R)、绿光(G)、蓝光(B)。

分辨率和像素点

假设一部手机屏幕的分辨率是1280×720,说明水平方向有720个像素点,垂直方向有1280个像素点,所以整个手机屏幕就有1280×720个像素点(这也是分辨率的含义)。每个像素点都由三个子像素点组成,这些密密麻麻的子像素点在显微镜下可以看得一清二楚。

图像的数值表示

任何一个图像都可以由RGB组成,音频里面的每一个采样(sample)均使用16个比特来表示,那么像素里面的子像素又该如何表示呢?常用的表示方式有以下几种:

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

对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张1280×720的RGBA_8888图像的大小,可采用如下方式:1280 * 720 * 4 = 3.516MB,这也是位图(bitmap)在内存中所占用的大小,所以每一张图像的裸数据都是很大的。

视频帧的编码方式-YUV

对于图像的裸数据来讲,直接在网络上进行传输也是不太可能的,所以就有了图像的压缩格式,比如JPEG压缩:JPEG是静态图像压缩标准,由ISO制定。JPEG图像压缩算法在提供良好的压缩性能的同时,具有较好的重建质量。这种算法被广泛应用于图像处理领域,当然其也是一种有损压缩。在很多网站如淘宝上使用的都是这种压缩之后的图片,但是,这种压缩不能直接应用于视频压缩,因为对于视频来讲,还有一个时域上的因素需要考虑,也就是说,不仅仅要考虑帧内编码,还要考虑帧间编码。

对于视频帧的裸数据表示,其实更多的是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最常用的采样格式是4:2:0,4:2:0并不意味着只有Y、Cb而没有Cr分量。它指的是对每行扫描线来说,只有一种色度分量是以2:1的抽样率来存储的。相邻的扫描行存储着不同的色度分量,也就是说,如果某一行是4:2:0,那么其下一行就是4:0:2,再下一行是4:2:0,以此类推。

YUV格式有两大类:(平面格式)planar和(打包格式)packed。

1.planar:先存储Y,然后U,然后V
2.packed:yuv交叉存储

还有我们常说的YUV420sp与YUV420p。
YUV420sp: 一种two-plane模式,即Y和UV分为两个平面,U、V交错排列。
YUV420p: 先把U存放完后,再存放V。UV是连续的。

YUV420的数据大小为: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:W*H*3/2,

普遍的编码器都以接受planar的I420数据(YUV420P)



而android摄像头一般默认为NV21(YUV420SP)


相较于RGB,我们可以计算一帧为1280×720的视频帧,用YUV420P的格式来表示,其数据量的大小如下:

1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318MB

如果fps(1秒的视频帧数目)是24,按照一般电影的长度90分钟来计算,那么这部电影用YUV420P的数据格式来表示的话,其数据量的大小就是:

1.318MB * 24fps * 90min * 60s = 166.8GB

小结:静态图像的标准压缩格式是JPEG压缩,视频帧的裸数据则使用YUV的格式表示,不过数据很大,不适用于网络传输,所以需要进行编码(压缩)。

视频的编码(压缩)方式

音频压缩主要是去除冗余信息,从而实现数据量的压缩。那么对于视频压缩,又该从哪几方面来对数据进行压缩呢?其实与音频编码类似,视频压缩也是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。

  • 帧间编码技术:用帧间编码技术可以去除时间上的冗余信息,具体包括以下几个部分。

    • 运动补偿:运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。
    • 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。
    • 运动估计:运动估计是从视频序列中抽取运动信息的一整套技术。
  • 帧内编码技术 :使用帧内编码技术可以去除空间上的冗余信息。

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

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

视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一种。

IPB

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

  • 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帧作为被参考的帧。

DTS和PTS

PTS:Presentation Time Stamp。于度PTS主要用量解码后的视频帧什么时候被显示出来

DTS:Decode Time Stamp。DTS主要是标识读入内存中的帧数据在什么时候开始送入解码器中进行解码。

在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。

dts与pts.jpg

如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

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的大小,以得到更高质量的视频。

码率帧率

​ 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。码率和质量成正比,但是文件体积也和码率成正比,即码率越高越清晰,视频文件越大。码率率超过一定数值,对图像的质量没有多大影响,因为原始图像只有那么清晰,再高码率也不会变的比原图更清晰。

​ 每秒的帧数表示图形处理器处理场时每秒钟能够更新的次数,一般使用fps(Frames per Second)表示。因此帧率越高,画面越流畅。比如Android理论上是16ms一张图像,即60fps。

Android操作图像:

  • Java SDK: SurfaceView,TextureView
  • NDK : OpenGL ES

你可能感兴趣的:(视频基础)