视频编码(持续更新)

来源:互联网 发布:宁波淘宝托管公司排名 编辑:程序博客网 时间:2024/05/18 16:17

1、为什要编码

编码的目的就是在最小图像或音频信息丢失情况下得到最大的数据压缩率,减轻带宽压力,例如:

一张1280*720的图片占用内存为:
每个像素由RGB组成,每个通道占用1byte,共3byte

图像尺寸 总像素点 总字节数(Byte) 字节转MB(MB=1024*1024B) 1280 x 720 921600 x3 = 2764800 /(1024*1024)=2.64MB

带宽:以稳定的10Mbps带宽计算每秒传输的数据量

带宽(bps) 每秒字节数(Btye=8bit) 字节转MB(MB=1024*1024B) 10M /8=1250000B /(1024*1024) = 1.19MB

所以可以看出,10Mbps的带宽依然远远不能满足传输1280x720大小的图片。因为图片大小为2.64MB,网络传输最多每秒传输1.19MB,这样就会导致2秒多才看到一帧画面,整个视频流就会变得非常卡顿。


2、编码原理

去冗余。
2.1 数据冗余

2.2 视觉冗余


3、视频数据格式描述

3.1 YUV格式

YUV(Y:亮度,UV:色度和浓度) 有YUV4:4:4 YUV4:2:2 YUV4:2:1 YUV4:2:1

3.2 RGB格式

RGB(红,绿,蓝)
公式
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb

3、编码之前需要了解的基本概念

SPS:序列参数集(Sequence parameter set)
PPS:图像参数集(Picture parameter set)
SEI :附加增强信息(subjoin enhancement information)
VCL:视频编码层(Video Coding Layer)
NAL:网络提取层(Network Abstraction Layer)
NALU:网络提取层单元(Network Abstraction Layer Unit)
Slice:片(每一帧图像可以分为多个片)
MACROBLOCK:宏块
I帧:关键帧,包含完整的一幅画面的数据;解码时只需要本帧数据就可以完成
P帧:P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B帧:B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU占用比较大。

补:各模块之间的关系图
补:各模块内部结构

4、编码流程

采集->编码

0 0
原创粉丝点击