H264结构图:
H264视频压缩后会成为一个序列帧,帧里包含图像,图像分为不少片,每一个片能够分为宏块,每一个宏块由许多子块组成 H264结构中,一个视频图像编码后的数据叫作一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由16x16的yuv数据组成。宏块做为H264编码的基本单位。算法
- 场和帧:视频的一场或者一帧能够用来产生一个编码图像。在电视中,每一个电视帧都是经过扫描屏幕两次而产生的,第二个扫描的线条恰好填满第一次扫描所留下的缝隙。每一个扫描即称为一个场。所以 30 帧/秒的电视画面实际上为 60 场/秒
- 片:每一个图像中,若干个宏块被排列成片。片的目的:为了限制误码的扩散和传输,使编码片相互间保持独立。片共有5种类型:I片(只包含I宏块)、P片(P和I宏块)、B片(B和I宏块)、SP片(用于不一样编码流之间的切换)和SI片(特殊类型的编码宏块)。
- 宏块:一个编码图像首先要划分红多个块(4x4 像素)才能进行处理,显然宏块应该是整数个块组成,一般宏块大小为16x16个像素。宏块分为I、P、B宏块,I宏块只能利用当前片中已解码的像素做为参考进行帧内预测;P宏块能够利用前面已解码的图像做为参考图像进行帧内预测;B宏块则是利用先后向的参考图形进行帧内预测
H264编码分层
- NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的做用是H264只要在网络上传输,在传输的过程每一个包以太网是1500字节,而H264的帧每每会大于1500字节,因此要进行拆包,将一个帧拆成多个包进行传输,全部的拆包或者组包都是经过NAL层去处理的。
- VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩
码流的基本概念
- SODB:(String of Data Bits,原始数据比特流):由VCL层产生,数据长度不必定是8的倍数,因此处理起来比较麻烦
- RBSP:(Raw Byte Sequence Payload,SODB+trailing bits,编码后的数据流):算法是在SODB最后一位补1,不按字节对齐补0,若是补齐0,不知道在哪里结束,因此补1,若是不够8位则按位补0
- EBSP:(Encapsulate Byte Sequence Payload):生成编码后的数据流以后,咱们还要在每一个帧以前加一个起始位,须要开发者人为添加。起始位通常是十六进制的0001。可是在整个编码后的数据里,可能会出来连续的2个0x00。那这样就与起始位产生了冲突.那怎么处理了? H264规范里说明若是处理2个连续的0x00,就额外增长一个0x03 。这样就能预防压缩后的数据与起始位产生冲突
- NALU: (NAL Header(1B)+EBSP).NALU就是在EBSP的基础上加1B的网络头.
NALU解析
-
NALU头结构:NALU类型(5bit)、重要性指示位(2bit)、禁止位(1bit):第1位为禁位,默认固定为0,若是接收到的为1,那么就须要丢弃该单元;第2-3位表示重要性,00表示最不重要,11表示最重要,咱们能够在解码来不及的状况下舍弃一些不重要的单元;第4-8位用来表示NALU的类型网络
-
NALU类型:1~12由H.264使用,24~31由H.264之外的应用使用:类型图以下: ide
-
切片与宏块的关系:每一个切片包括切片头和切片数据,每一个切片数据包括了不少宏块。每一个宏块包括了宏块类型、宏块预测、残差效果: 编码
-
切片头:包含了一组片的信息,好比片的数量,顺序等等3d
H264码流分层结构图