视频文件定义
视频文件是指将一系列连续静态图片数据及音频数据的一个集合。视频文件包含了视频数据、音频数据、字幕数据,而且视频文件存放视频、音频编码信息等,如我们常见H264、MPEG、yuv、acc、FLV、MP4等。
视频基础知识
概念
视频是由一组图像组成,为了将视频数据在网络中传输只能被压缩变小,最终在显示设备上显示。
图像是由像素组成,像素由RGB组成,目前显示屏幕是以红、绿、蓝三原色来调配所有颜色。
分辨率是记录横向和纵向的像素点个数。
位深是指每一个像素占用的位数(最常见24位,RGB888,每一个颜色都是8位。32位,RGBA,其中A表示alpha表示透明色)
帧率是指每秒钟播放的图像个数
屏幕指标数分为三类:PPI(屏幕的质量,一寸长的空间放多少像素)、DPI(每英寸的点数,基本上DPI等于PPI)、PPI(PPI>300就属于视网膜级别,人眼区分不出来,认为是一体的)
I帧(Intra coded frames):
I帧不需要参考其他画面而生成,解码时仅靠自己就重构完整图像;
I帧图像采用帧内编码方式;
I帧所占数据的信息量比较大;
I帧图像是周期性出现在图像序列中的,出现频率可由编码器选择;
I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
IDR帧是帧组GOP的基础帧(第一个(I)帧),在一组GOP中只有一个IDR帧;
I帧不需要考虑运动矢量;
P帧(Predicted frames)根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据,同时利用了空间和时间上的相关性。
P帧属于前向预测的帧间编码。它需要参考前面最靠近它的I帧或P帧来解码。
B帧(Bi-directional predicted frames)采用双向时间预测,可以大大提高压缩倍数。
分辨率
1.分辨率:x像素个数 * y像素个数
2.常见的宽高比16:9和4:3。现在基本都是16:9,对于非标准的分辨率需要转换为16:9或4:3,否则在渲染时容易出错
3.360P(640360)/720P(1280720)/1K/2K.这些分辨率都是16:9的.4:3常见的是640*480
帧率
每秒钟播放图像的个数,常见帧率:15,30,60帧/s。
实时通信一般是15帧/s(帧率越大,占用的传输带宽就越大)
录课一般30帧/s能够满足需求;电影一般在60帧/s;
要求的平滑度越高,帧率就越大。要求的清晰度越高,分辨率就要越高。
码流计算方式
RGB码流=分辨率3Byte帧率
假设当前的分辨率 宽为1920 高为1080 像素深度为RGB三原色3Byte 帧率为1秒25帧 那么该每秒产生的RGB码流计算公式为:
RGB码流=分辨率宽高*像素深度*每秒帧率
例如:192010803*25=155520000约155M。
YUV压缩
主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。
其中Y表示明亮度(Luminance或Luma),也称灰阶值。
U和V表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续存储的。
libyuv,Google开源的实现各种YUV与RGB间相互转换、旋转、缩放的高效库。
YUV4:4:4采样,每一个Y对应一组UV分量。
YUV4:2:2采样,每两个Y共用一组UV分量。
YUV4:2:0采样,每四个Y共用一组UV分量。
H264(新一代视频压缩编码标准)
图⽚帧的像素块之间存在相似性,因此视频帧图像可以进⾏图像压缩;H264采⽤了16*16的分块⼤⼩对视频帧图像进⾏相似⽐较和压缩编码。
H264使⽤帧内压缩和帧间压缩的⽅式提⾼编码压缩率。H264采⽤了独特的I帧、P帧和B帧策略来实现连续帧之间的压缩。
I帧经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是⼀个图像经过压缩后的产物。⾃身可以通过视频解压算法解压成⼀张单独的完整的图⽚。
P帧通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。需要参考其前⾯的⼀个I帧或者P帧来⽣成⼀张完整的图⽚。
B帧既考虑与源图像序列前⾯已编码帧,也顾及源图像序列后⾯已编码帧之间的时间冗余信息来压缩传输数据量的编码图像, 也叫双向预测帧。则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。
H264除了实现了对视频的压缩处理之外,为了⽅便⽹络传输,提供了对应的视频编码和分⽚ 策略;类似于⽹络数据封装成IP帧,在H264中将其称为组(GOP, group of pictures)、⽚ (slice)、宏块(Macroblock) 这些⼀起组成了H264的码流分层结构;H264将其组织成为序列(GOP)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock) 五个层次。