视频的一些名词概念

帧类型介绍

I帧:帧内编码帧

尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像

P帧:前向预测编码帧

通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧

B帧:双向预测内插编码帧

既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧

一般地,I帧压缩效率最低,P帧较高,B帧最高。

I、P、B 帧编码的基本流程

I 帧编码的基本流程为:

  1. 进行帧内预测,决定所采用的帧内预测模式。

  2. 像素值减去预测值,得到残差。

  3. 对残差进行变换和量化。

  4. 变长编码和算术编码。

  5. 重构图像并滤波,得到的图像作为其它帧的参考帧。

P 帧和 B 帧编码的基本流程为

  1. 进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。

  2. 进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。

  3. 计算实际值和预测值的差值。

  4. 对残差进行变换和量化。

  5. 熵编码,如果是帧间编码模式,编码运动矢量

MPEG压缩中的 I、B、P帧

首先,MPEG-1压缩的基本思想:帧内压缩和帧间压缩。其次,时间相关性的统计分析:统计的结果表明,在间隔1~2帧的图像中,各像素只有10%以下的点,其亮度差值变化超过2%,而色度差值的变化只有1%以下。

采用的压缩方法:

分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。 1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧; 2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧; 3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

I帧:帧内编码帧

I帧特点:

1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 2.解码时仅用I帧的数据就可重构完整图像; 3.I帧描述了图像背景和运动主体的详情; 4.I帧不需要参考其他画面而生成; 5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量); 6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧; 7.I帧不需要考虑运动矢量; 8.I帧所占数据的信息量比较大。

P帧:前向预测编码帧。

P帧的预测与重构

P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

1.P帧是I帧后面相隔1~2帧的编码帧; 2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差); 3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧; 5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 6.由于P帧是参考帧,它可能造成解码错误的扩散; 7.由于是差值传送,P帧的压缩比较高。

B帧:双向预测内插编码帧。

B帧的预测与重构

B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点

1.B帧是由前面的I或P帧和后面的P帧来进行预测的; 2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量; 3.B帧是双向预测编码帧; 4.B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确; 5.B帧不是参考帧,不会造成解码错误的扩散。

注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

GOP

GOP:Group of Pictures 画面组

GOP(Group of Pictures)策略影响编码质量:所谓 GOP,意思是画面组,一个 GOP 就是一组连续的画面。MPEG编码将画面(即帧)分为 I、P、B 三种,I 是内部编码帧,P 是前向预测帧,B 是双向内插帧。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。没有 I 帧,P 帧和 B 帧就无法解码,这就是 MPEG 格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。 MPEG-2 帧结构 MPEG-2 压缩的帧结构有两个参数,一个是 GOP(Group Of Picture)图像组的长度,一般可按编码方式从 1-15; 另一个是 I 帧和 P 帧之间 B 帧的数量,一般是 1-2 个。前者在理论上记录为 N,即多少帧里面出现一次 I 帧;后者描述为多少帧里出现一次 P 帧,记录为 M。

码率和帧率

码率(Bitate)

码率影响视频文件的大小,码率越大,视频文件越大;码率越小,体积越小。

码率是视频的取样率,单位是kbps(千位每秒)。单位时间内取样越大,精度就越高,处理出来的文件就越接近原始文件,码率越高越清晰,反之画面粗糙多马赛克。

码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。也就是取样率(并不等同与采样率,采样率的单位是Hz,表示每秒采样的次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来cbr(固定码率)与vbr(可变码率), “码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。

所有的编码格式都追求的是如何用最低的码率达到最少的失真。以大家最熟悉的RMVB视频文件为例,RMVB中的VB,指的是VBFR,即Variable BitRate的缩写,中文含义是可变比特率,即RMVB采用的是动态编码方式,把较高的采样率用于复杂的动态画面(歌舞、飞车、战争、动作等),而把较低的采样率用于静态画面,合理利用资源,达到画质与文件大小可兼得的效果。

比特率模式

VBR 动态比特率,ffmpeg默认采用,简单的内容少给码率,复杂内容多给码率。

ABR 平均比特率,网络视频会采用这一格式,因为VBR码率变化太大,不适用网络传输

CBR 恒定比特率

帧率(FPS)

与画面的流畅度成正比:帧率越大,画面越流畅;帧率越小,画面有卡顿感。在VBFR可变码率编码中,帧率也会影响文件的大小,帧率越高,每秒钟采集的画面越多,需要的码率越高,体积也越大。

YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV

那么YUV又从何而来呢?在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄像机进行摄像,然后把摄得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。

采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

YUV420

YUV420格式是指,每个像素都保留一个Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,则其接着一行就只取V分量,以此重复(即4:2:0, 4:0:2, 4:2:0, 4:0:2 .......),所以420不是指没有V,而是指一行采样只取U,另一行采样只取V。在取U和V时,每两个Y之间取一个U或V。但从4x4矩阵列来看,每4个矩阵点Y区域中,只有一个U和V,所以它们的比值是4:1。所以对于一个像素,RGB需要8 * 3 = 24位,即占3个字节;而YUV420P,8 + 8/4 + 8/4 = 12位,即占2个字节,其中8指Y分量,8/4指U和V分量。

从这里也可以看出,YUV要比RGB节省存储空间。

这里为什么一个分量是8位呢?

不管是R G B还是 Y U V他们每个分量的取值都是0-255,而计算机都是用二进制来存储的。巧了,一个字节(8bit)刚好可以记录0-255的数,所以刚好就是这样存了吧。

yuv420又分为yuv420p和yuv420sp.

yuv420sp格式如下:

yuv

yuv

yuv420P格式如下:

yuv

yuv

还是图像比较直观,从上面的图片中就能看出来yuv420sp和yuv420p的区别了。

对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的。(记得结合上图查看)

目前我所知道的安卓手机上摄像头采集到的数据就是yuv420sp。

有了上面的理论,就可以准确的计算出一个YUV420在内存中存放的大小。

Y = width * hight (总和) U = Y / 4 V = Y / 4

所以一张YUV图像他的存储空间就是:

YUV420P内存中的存储方式:

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

前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);

而后者使用三个数组分开存放YUV三个分量

YUV420P(planar格式)在ffmpeg中存储是在struct AVFrame的data[]数组中

data[0]-------Y分量

data[1]------U分量

data[2]-------V分量

参考资料

http://blog.yundiantech.com/?log=blog&id=18

U为Cb,V为Cr。

首先要知道YUV究竟有多少种格式,我从FFmpeg和mpp库中提取了它们所支持的所有YUV格式。FFmpeg头文件中libavutil/pixfmt.h,64行开始是显示格式相关的。包括:YUV420P/YUYV422/YUV422P/YUV444P/YUV444P/YUV410P/YUV411P/YUVJ420P/YUVJ422P/YUVJ444P/UYVY422/UYYVUU411/NV12/NV21/YUV440P/YUVJ440P/YUVA420P/NV16/NV20/YVYU422/,同时也包括一些10bit等等之类的版本。

其中SP表示Semi-Planar,表示YUV不是分成3个平面而是分成2个平面。Y数据一个平面,UV数据合用一个平面。UV平面的数据格式是UVUVUV。

P有两种:打包(packed)格式和平面(planar)格式。对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

6*4的图片为例。

YUV420

每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。

YUV420SP(NV12)

像素排列:YYYYYYYY UVUV

每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。

nv12

nv12

图像大小为w * h,Y分量占用内存为w * h,UV占用w * h / 4。

那么整个YUV分量占用内存为w * h+(w * h / 4) * 2 = w * h * 3/2字节;

在运算中涉及到除法,而在读取数据中不可能读取0.5个字节,或者读取一个字节的部分数据。那么w和h必须为2的倍数,这样在运算中就不会出现异常。

YUV420SP_VU(NV21)

像素排列:YYYYYYYY VUVU

每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。

nv21

nv21

图像大小为w * h,Y分量占用内存为w * h,UV占用w * h / 4。

那么整个YUV分量占用内存为w * h+(w * h / 4) * 2 = w * h * 3/2字节;

YUV420P(I420/YU12)

像素排列:YYYYYYYY... UU... VV...

每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。

i420

i420

图像的大小为w * h,Y分量占用大小为w * h,UV分量各占w * h / 4。

那么整个YUV分量占用内存为w * h + (w * h/4) * 2 = w * h * 3/2。

示例1: 示例2:

YUV420P_VU(YV12)

像素排列:YYYYYYYY VV UU

每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。

yv12

yv12

YUV422

基于YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

YUV422SP(NV16)

YUV422P

像素排列:YYYYYYYY VVVV UUUU

YUV444P

基于YUV 4:4:4采样,每一个Y对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。

友情链接

[1] 可以查到所有的格式,包括RGB/YUV。https://www.fourcc.org/

你可能感兴趣的:(视频的一些名词概念)