1.Summary

  首先了解H264之前,我们得先来了解几个重要的指标

  • bit rate:比特率也叫码率,用来表示编解码器产生的数据速率,其单位为Mbits/s,Kbits/s,bits/s。1Mbits/s =10^6 bits/s
  • frame rate:帧率,其表示一秒有多少帧,直播中常用的帧率有15fps 、30fps
  • resolution size:分辨率,其内存大小取决于采用哪种color schema。比如YUV422的1080P,则一帧图片的内存占用 1920x1080x2x8/1024/1024 = 31.64Mbit

下面是直播常用的配置表

Level Fps Video Bitrate(Kbps)
VIDEO_QUALITY_LOW1 12 150
VIDEO_QUALITY_LOW2 15 264
VIDEO_QUALITY_LOW3 15 350
VIDEO_QUALITY_MEDIUM1 30 512
VIDEO_QUALITY_MEDIUM2 30 800
VIDEO_QUALITY_MEDIUM3 30 1000
VIDEO_QUALITY_HIGH1 30 1200
VIDEO_QUALITY_HIGH2 30 1500
VIDEO_QUALITY_HIGH3 30 2000
Level Resolution(16:9) Resolution(4:3)
VIDEO_ENCODING_HEIGHT_240 424 x 240 320 x 240
VIDEO_ENCODING_HEIGHT_480 848 x 480 640 x 480
VIDEO_ENCODING_HEIGHT_544 960 x 544 720 x 544
VIDEO_ENCODING_HEIGHT_720 1280 x 720 960 x 720
VIDEO_ENCODING_HEIGHT_1088 1920 x 1088 1440 x 1088

2.Introduction

  H264分为分为网络抽象层和视频编码层

  • Network Abstraction Layer(NAL)
  • Video Coding Layer(VCL)

NAL

  NAL发送的packet叫做NALU,NALU有两种类型。

  • Annex B(主要用于live或者stream,比如ts): 由于NALU并没有指明的size,所以通过start code(0x00 00 00 01 or 0x00 00 01)来分割各个相邻的NALU
  • AVCC: 在NALU前面加入包体的size,来分割各个NALU,size max 为255字节

  Annex B像Http中的分块传输,发送的包并没有标明大小,对于超大型文件就可以采用分块传输,而ACVV像Http中的固定内容长度传输,发送的包会被指明大小,发送的json文件,xml文件都是使用这种方式。在视频中的一帧会被切割(slice)成许多NALU。

由于Annex B用于直播流所以我们主要讲Annex B这种类型的NALU,来看看其packet。

                     4bytes          1bytes                
  +-+-+-+-+-+-+    +-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |NALU/Packet| =  | start code | Packet header |       Packet data       |
  +-+-+-+-+-+-+    +-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  
   0 1 2 3 4 5 6 7
  +-+-+-+-+-+-+-+-+
  |F|NRI|   Type  |          
  +-+-+-+-+-+-+-+-+
  F:   占1bit,forbidden_zero_bit,h.264规定必须取0,禁止位,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
  NRI: 占2bit,nal_ref_idc,取值0~3,指示这个nalu的重要性,I帧、sps、pps通常取3,P帧通常取2,B帧通常取0,nal重要性指示,标志该NAL单元的重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。
  Type:占5bit, nal_unit_type:0=未使用 1=非IDR图像片,IDR指关键帧
                             2=片分区A 3=片分区B
                             4=片分区C 5=IDR图像片,即关键帧
                             6=补充增强信息单元(SEI) 7=SPS序列参数集
                             8=PPS图像参数集 9=分解符
                             10=序列结束 11=码流结束
                             12=填充
                             13~23=保留 24~31=未使用

一个Annex B类型的NALU包起始start code(0x00 00 00 01 or 0x00 00 01),其包header的前三位表示表示VLC中I帧,B帧,P帧中的某一类型,包header的后五位表示某包体的类型,比如某包体为sps(sps类型的包固定大小为14字节 profile/level、timing)、pps(pps类型的包固定为4字节 熵编码、数字化)、IDR、AUD(一帧的开始)
下面提供了一张包头类型表

0      Unspecified                                                    non-VCL
1      Coded slice of a non-IDR picture                               VCL
2      Coded slice data partition A                                   VCL
3      Coded slice data partition B                                   VCL
4      Coded slice data partition C                                   VCL
5      Coded slice of an IDR picture                                  VCL
6      Supplemental enhancement information (SEI)                     non-VCL
7      Sequence parameter set                                         non-VCL
8      Picture parameter set                                          non-VCL
9      Access unit delimiter                                          non-VCL
10     End of sequence                                                non-VCL
11     End of stream                                                  non-VCL
12     Filler data                                                    non-VCL
13     Sequence parameter set extension                               non-VCL
14     Prefix NAL unit                                                non-VCL
15     Subset sequence parameter set                                  non-VCL
16     Depth parameter set                                            non-VCL
17..18 Reserved                                                       non-VCL
19     Coded slice of an auxiliary coded picture without partitioning non-VCL
20     Coded slice extension                                          non-VCL
21     Coded slice extension for depth view components                non-VCL
22..23 Reserved                                                       non-VCL
24..31 Unspecified                                                    non-VCL

VCL

  NALU payload中数据为raw byte sequence payloads,short as RBSPs,VCL数据存放在NALU payload中。
  视频本质上是由多种GOPs组成,一组GOP由一张 I 帧和数张 B / P帧,I帧是一张图中完整的数据,B帧和P帧都算是补充帧,区别在于采用的技术不同

帧类型:

  • I帧:帧内编码帧,也叫关键帧,记录当前帧
  • P帧:帧间预测编码帧,记录当前帧 和前一帧的差别
  • B帧:双向预测编码帧,记录当前帧 和 前一帧以及后一帧的差别

3.Reference

Annex B vs. AVCC

H.264/AVC Video Coding Standard

如果您觉得写得还不错或者对您有所启发,那就赶紧动动您的小指头,点击下面的红色按钮,狠狠地打赏一番吧。