视频本质就是一组连续播放的图像,所以研究视频离不开对于图像的研究。而图像又是由众多的色彩构成,这里就会涉及到图像的最小单元一个像素点的构成,像素点一般是由RGB三种颜色组成。
RGBA8888:一般一个像素点由RGB三原色组成,A表示图像的透明度,而每一个色彩又由一个八位组成取值范围0-255;一个像素总共是32bit。
RGB565:在安卓平台上采用16bit表示一个像素,R用5bit,G用6bit,B用5bit来表示。
计算一幅图1920*1080的RBGA8888图像大小:
1920 * 1080 * (32 /8)=7.91M
可以看出一张原始数据的图片大小是感觉还好。如果按照每秒30张图片的速度播放一个小时的数据量高达:834G的数据量。
对于视频帧而言比较常用的存储方式是采用YUV,其中Y表示亮度(专业术语灰阶值),UV则是速度,用于描述图像的色彩和饱和度。它的一个好处是可以将图像的亮度和色度分离,可以兼容黑白电视,可以单独显示色度图像。
YUV420:YUV420其中数值表示的是亮度和色度的比例为2:1需要注意的是1是UV共用的,YUV实际一比例是:4:1:1。
重新计算一张1080p图像:
1920 * 1080 * 1.5= 3.037M
可以看出YUV存储视频帧的优势还是比较明显,特别对于视频传输降低带宽占用非常明显。
视频输入一般是指我们从摄像头获取到采集的图像数据。一般分为两种情况:
输入到显示设备:采集设备直接渲染到显示设备
网络输入:一般分为几个步骤:
视频输出模块主动从内存相应位置读取视频和图形数据。一般也分为两种情况:
输出到显示设备:通过相应的显示设备输出视频和图形。
输出到网络:一般分为几个步骤
视频处理:一般是对图像进行处理包括是满足带宽要求处理:帧率控制(FRC)、图像压缩等等;提高图像质量处理:去噪(DNR)、畸变校正(LDC)、鱼眼矫正等等;图像变化:裁剪(CROP)、锐化(Sharpen)、缩放(Scale)、镜像(Mirror)、马赛克(Mosaic)、旋转(Spin)等等。
视频编码主要是对于视频进行数据量的压缩,目标是是去除图像的冗余数据保证图像质量。目前比较常见的有两种:
去除时间上的冗余:
运动补偿:利用前后图像的局部信息预测当前的图像;
去除空间上的冗余:
帧内编码技术:利用图像内部信息进行编码去重和预测减少单帧的数据量的技术。
典型的编码流程包括了输入图像的接收、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。
编码通道作为基本容器,保存编码通道的多种用户设置和管理编码通道的多种内部资源。编码通道完成图像转化为码流的功能,具体由码率控制器和编码器协同完成。这里的编码器指的是狭义上的编码器,只完成编码功能。码率控制器提供了对编码参数的控制和调整,从而对输出码率进行控制。
码率控制器实现对编码码率进行控制。从信息学的角度分析,图像的压缩比越低,压缩图像的质量越高;图像压缩比例越高,压缩图像的质量越低。对于场景变化的真实场景,图像质量稳定,编码码率会波动;编码码率稳定,图像质量会波动。
在码率统计时间内保证编码码率平稳。码率稳定主要由两个量来评估。
码率统计时间越长,每帧图像的码率波动对于码率调节的影响越弱,码率的调节会更缓慢,图像质量的波动会更轻微;码率统计时间越短,每帧图像的码率波动对于码率调节的影响越强,图像码率的调节会更灵敏,图像质量的波动会更剧烈。
行级码率控制调节幅度是一帧内行级调节的最大范围,其中行级以宏块行为单位。调节幅度越大,允许行级调整的 QP 范围越大,码率越平稳。对于图像复杂度分布不均匀的场景,行级码率控制调节幅度设置过大会带来图像质量不均匀。
允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。
允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。码率控制内部会检测当前场景的运动静止状态,在运动时用较高码率编码,在静止时主动降低目标码率。
基于主观图像质量的可变比特率,该码控调节方式是利用实时统计的 PSNR(图像质量客观评价指标)的大小来动态调整码率,从而保证编码图像质量平稳。在 PSNR 较小时主动升高目标码率,PSNR 较大时主动降低目标码率。
以 VBR 为基础,旨在提供平稳的图像质量的码控算法,同时对 VBR 的码率进行限制,以满足传输带宽以及存储空间的要求。
CVBR 设置了瞬时,短期与长期码率的限制。其中,瞬时码率的限制保证了网络带宽对传输的要求;长期码率限制保证了在长时间视频录制时,存储设备有足够的空间储存数据;同时,短期码率会根据长期码率的设置和实际使用情况进行调节,以在场景复杂的情况下提供更加平稳的图像质量,并在场景简单时节省码率。
QP越大压缩率越高同时质量越低,QP越小压缩率越低同时质量越高。
I帧是关键帧,属于帧内压缩。保存了图像所有信息,可以单独显示。属于帧内编码。
P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。
GOP表示一个GOP图像组是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。
Stride :指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。
如下图所示比如分辨率638x480的RGB24图像,我们在内存处理的时候如果要以16字节对齐,则638*3/16=119.625不能整除,因此不能16字节对齐,我们需要在每行尾部填充6个字节。
首先需要知道YUV和RGB转换关系:
绿屏主要是因为解码失败YUV分量都为零。
R = 1.402 * (-128) = -126.598
G = -0.34414*(-128) - 0.71414*(-128) = 44.04992 + 91.40992 = 135.45984
B = 1.772 * (-128) = -126.228
RGB 值范围为[0,255], 所以最终的值为:
R = 0
G = 135
B = 0
此时只有G分量有值所以为绿色。