一、码率 、帧率以及分辨率
帧率:FPS(每秒钟要多少帧画面);以及Gop(表示多少秒一个I帧)
码率:编码器每秒变出多少数据大小,单位是kbps,比如800kbps代表编码器每秒产生800kb(或100KB)的数据
分辨率:单位英寸所包含的像素点;VGA:Video Graphics Array (视频图像分辨率)
三者的对应直播的影响因素
帧率:影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,体积越大。帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理每秒钟能够刷新几次。
分辨率:影响图像大小,与图像大小成正比:分辨率越高,图像越大,分辨率越低,图像越小。
清晰度
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,清晰度越低,图像越清晰。
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
二 视频编码
1.视频编码
帧间编码技术
运动补偿:运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。
运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。
运动估计:运动估计是从视频序列中抽取运动信息的一整套技术。
使用帧内编码技术而已去除空间上的冗余信息。
2.编码概念
(1)IPB帧
视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一种。
I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一帧,经过适度地压缩,作为随机访问的参考点可以当成静态图像。I帧可以看做一个图像经过压缩后觉得产物,I帧压缩可以得6:1的压缩比而不会产生任何可觉察的模糊现象。I帧压缩可去掉视频的空间冗余信息,下面即将介绍P帧和B帧是为了去掉时间冗余信息。
P帧:前向预测编码在帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息去充分去除压缩传输数据量的编码图像,也成为预测帧。
B帧:双向预测内插编码帧(bi-directionalinterpolated prediction frame),既考虑源图像序列前面的已编码帧,又估计源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也成为双向预测帧。
基于上面的定义,我们可以从解码的角度来理解IBP帧。
I帧自身可以通过视频解压算法解压成一行单独的完善的完整视频画面,所以I帧去掉视频帧在空间维度上的冗余信息。
P帧需要参考其前面一个I帧或者P帧来解码成一张完整的视频画面。
B帧则需要参考前一个I帧或者P帧及其后面一个P帧来生成后面一张完整的视频画面,所以P帧与B帧去掉是视频在时间维度上的冗余信息。
(2)IDR帧与I帧的理解
在H264的概念中有一个帧被称为IDR帧(instantaneous decoding refresh picture),那么IDR帧与I帧的区别是什么呢?因为H264采用多帧预测,所以在I帧之后P帧有可能会参考之前的I帧之前的帧,这就使得在随机访问的时候不能以找到I帧作为参考条件,因为即使找到I帧,I帧之后的帧还是有可能解析不出来,而IDR就是一个特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR帧,而不会参考前面的帧。在解码器中,一旦接收到一个IDR帧,就会立即清理参考帧缓存区,并将IDR帧作为被参考的帧。
3.PTS与DTS
DTS(英文全称Decoding Time Stamp)主要用于视频的解码,PTS(Presentation Time Stamp)主要用于视频解码阶段进行视频的同步和输出。在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,所以一旦存在B帧,PTS和DTS势必就会不同。FFmpeg中使用AVPacket结构体描述解码前或解码后的压缩数据,用AVFrame结构体来描述解码后或编码前的原始数据。对于视频来说,AVFrame就是视频的一帧图像,这帧图像什么时候给用户,取决于它的PTS。DTS是AVPacket里的一个成员,表示该压缩包应该什么时候被解压,如果视频里各帧里编码是按照输入顺序(显示顺序)依次进行的,那么解码和显示的时间应该是一致的,但是事实上,在大多数编码标准(如H264或HEVC)中,编码顺序和输入并不是一致的,才会 需要PTS和DTS这两种不同呢的时间戳。
4.GOP的概念
两个I帧之间形成一组图片,就是GOP(Group Of Picture)的概念。通常在为编码器设置为参数的时候,必须设置为gop_size的值,其代表的两个I帧之间的帧数目。一个GOP中容量最大的就是I帧,所以相对来讲,gop_size设置的越大,整个画面就会越好,但是在解码端必须从接收接收到一个I帧的第一个I帧开始I才可以正确解码出原始图像,否者无法正常解码(这也是前面提到的I帧可以作为随机访问的帧)。在提高视频质量的技巧中,还有个技巧是多使用B帧,一般来说,I帧的压缩率是7(与JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量的空间,节省出来的空间可以哦用来更多的保存I帧,这样就能在相同的码率下提供更好的画质。所以我们要根据不同的业务场景,适当的设置gop_size的大小,已得到更高质量的视频。
下面给出一个GOP为15的例子,其解码的参照frame及其解码的顺序都在里面:
请点击此处输入图片描述
如上图:I frame的解码不依赖于任何其他的帧。而Pframe 的几码则依赖于前面的面的Ifarme或者Pframe.Bframe 的解码则依赖于其前的最近一个I frame 或者P frame 及其后的最近的一个P frame .
作者: 岑雄峰
说明:八点钟学院第一期VIP学员
免费学习链接:https://ke.qq.com/course/171725
精修课程链接:https://ke.qq.com/course/229709