1 基础扫盲:
什么是H264?
定义: 对摄像头采集的每一帧视频需要进行编码,由与视频中存在空间和时间的冗余, 需要用算法来去除这些冗余。H264是专门去除这些冗余的算法,我们把这种算法称为H264编码。
H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称。
应用: 像大多数看到的视频,如rmvb avi mp4 flv 大都是由h264进行编码
当然也会有不同的 如 mpeg4 vp9 这样比较冷门的编码。
无论是h264 mpeg4 vp9 都是基于宏块的方式进行编码,原理是一样的,只不过实现的算法
不一致罢了。
两大电信联盟 ---国际电信联盟(ITU-T),国际标准化组织(ISO)
其他关于编码的发展历史这里就过多叙述了。
2 为什么需要对视频进行编码
从上图可以看到视频帧是连续且有关联的,如果每一帧都原封不动的保持,数据量是非常庞大,早起的电影院中,一个胶卷30kg,可见保存视频数据非常难。除了存储困难,这么大的数据量如果走网络传输,也会非常的慢。
编码 = 压缩
3 视频中哪些地方可以进行压缩
帧分组
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。
为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。
4 音视频组成
5 视频编码原理
DSP芯片主要做视频编解码器的工作
H264编码规则
H264数据流
除了I/P/B帧外,还有图像序列GOP
GOP图像序列 可以理解成一个场景,场景的物体都是相似的
GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。
如图所示
H264编码
6 H264编码传输
H264码流组成
*组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是**
> **H264视频序列,图像,片组,片,NALU,宏块 ,像素。**
NALU单元设计
NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。
•H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的。
NALU = NALU头 + RBSP (切片),每个单元都按独立的NALU传送。
RBSP单元
每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
切片由来
把一张图片划分成若干个小的区域,这些小的区域称之为宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
若干个连续性的宏块 组成了切片
音视频编码中的sps与pps的设计
7 为什么采用YUV而不采用RGB

NV21编码
如1920*1080的一帧图片,经过yuv的方式排列
0 ~ 1920*1080 全部是Y
后面是 u 和v 的交替变换
YUV I420编码
如1920*1080的一帧图片,经过yuv的方式排列
0 ~ 1920*1080 全部是Y
1920*1080 ~ 1920*1080+ 1920*1080/4全部是u
1920*1080+ 1920*1080/4 ~ 一帧末尾 全部是v
结语:音视频后面的内容更精彩。