H.264编码格式

H.264编码的基本信息和数据格式

H.264概述

H.264是由ITU-T和ISO/IEC MPEG共同开发的一种视频编码技术,H.264被收录到了MPEG4中的第10部分,所以H.264又叫MPEG4 Part 10或MPEG4 AVC,所谓的AVC就是Advanced Video Coding。H.264/MPEG-4 AVC wiki

视频

视频码率 视频码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。百度百科
视频帧率 用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简:FPS)或“赫兹”(Hz)。此词多用于影视制作和电子游戏。百度百科
视频编码 所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式百度百科
视频分辨率 分辨率是用于度量图像内数据量多少的一个参数,通常表示成ppi。百度百科
  • 常见的视频容器格式:MP4、AVI、FLV、TS/M3U8、MKV等
  • 常见的视频编码格式:H.264(目前最流行的)、H.265(新型编码格式,用于替代H.264)、VP9(google推的技术)、AV1(VP9的继任者,H.265的竞争者)

音频

音频采样率 音频采样率是指录音设备在单位时间内对模拟信号采样的多少,采样频率越高,机械波的波形就越真实越自然。百度百科
音频采样位数 也叫采样大小,采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。采样位数
音频比特率 比特率是指单位时间内传送的比特(bit)数。单位为bps(bit per second)。比特率越高,表示单位时间传送的数据就越多,占据的内存也就越大,音质也就越好。
音频压缩 音频压缩技术指的是对原始数字音频信号流(PCM编码)运用适当的数字信号处理技术,在不损失有用信息量,或所引入损失可忽略的条件下,降低(压缩)其码率,也称为压缩编码。百度百科
音频编码模式 1. VBR(Variable Bitrate)动态比特率;2. ABR(Average Bitrate)平均比特率;3.CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。

采样位数(采样大小):

采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。我们首先要知道:电脑中的声音文件是用数字0和1来表示的。所以在电脑上录音的本质就是把模拟声音信号转换成数字信号。反之,在播放时则是把数字信号还原成模拟声音信号输出。采集卡的位是指采集卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采集卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。8位代表2的8次方–256,16位则代表2的16次方–64K。比较一下,一段相同的音乐信息,16位声卡能把它分为64K个精度单位进行处理,而8位声卡只能处理256个精度单位, 造成了较大的信号损失,最终的采样效果自然是无法相提并论的。

通常市面上是这样说,16bit/24bit/32bit。数值越高声音越好。

  • 常见音频格式:WAV、AIFF、AMR、MP3、Ogg…
  • 常见音频编码格式:PCM(脉冲编码调制Pulse Code Modulation)、AAC-LC(AAC-Low Complexity)、AAC-HE(AAC-High Efficiency)

H.264有包括:图像上的运动补偿、基于上下文的变长编码、使用网络抽象层(NAL)适用多种网络等等新特性,使得H.264比起以前的视频编解码技术,在性能上、网络亲和性上都有了长足的提升。

视频拉流

视频解码

VCL和NAL

H.264在编码过程中的三种不同形式的数据:

  • SODB(String of Data Bits)数据比特串:最原始的编码数据,即VCL数据,没有任何附加数据。
  • RBSP(Raw Byte Sequence Payload)原始字节序列载荷:在SODB的后面填加了结尾比特(RBSP trailing bits),一个bit“1”,若干bit “0”,以便字节对齐(SODB+RBSP trailing bits=RBSP)
  • EBSP(EncapsulationByte Sequence Packets)扩展字节序列载荷:在RBSP基础上填加了仿校验字节(0x03)。主要是由于NALU以0x00000001为开始,为了防止数据干扰,H.264规定防止竞争码的处理,如果编码器遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉,也称为脱壳操作。

H.264的防止竞争码处理

0x000000 ———-> 0x00000300

0x000001 ———-> 0x00000301

0x000002 ———-> 0x00000302

0x000003 ———-> 0x00000303

H.264基本流(elementary stream,ES)分为VCL、NAL两层:

  • VCL : Video Coding Layer,视频编码层,对视频采用空间和时间等冗余算法进行编码压缩,输出编码后的裸数据bit流(SODB)。

  • NAL : Network Abstraction Layer,网络抽象层,对编码数据打包和传送,用于网络传输。NAL将SODB打包成RBSP(字节流)然后加上NAL头,组成一个NAL unit。

引入NAL并区分与VCL,主要有两方面优点:

  1. 使信号处理和网络传输分离,VCL和NAL可以在不同的处理平台上实现;
  2. VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。

NALU

NALU由NALU Header + NALU Payload组成。

『NALU Header』只占1个字节:

forbidden_zero_bit nal_ref_idc nal_unit_type
1bit 2bit 5bit
  • forbidden_zero_bit : 正常为0,当网络传输发生错误时,可将其设置为1,以便接收方丢掉该单元。校验位

  • nal_ref_idc : 表示NALU的重要性,取值范围0-3,数值越大越重要。当前的NAL为参考帧(type=1)、序列集参数集SPS(type=7)、图像集参数集PPS(type=8)时,nal_ref_idc必须大于0

  • nal_unit_type : NALU的类型,标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5及12的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。

    nal_unit_type NAL类型 nal_reference_bit
    0 未使用 0
    1 非IDR图像中不采用数据划分的slice(SLICE) 此片属于参考帧,则不等于0,不属于参考帧,则等与0
    2 非IDR图像中A类数据划分的slice(SLICE_DPA) 同上
    3 非IDR图像中B类数据划分的slice(SLICE_DPB) 同上
    4 非IDR图像中C类数据划分的slice(SLICE_DPC) 同上
    5 IDR图像的slice(SLICE_IDR) 5
    6 补充增强信息(SEI) 0
    7 序列参数集(SPS) 非0
    8 图像参数集(PPS) 非0
    9 分隔符 0
    10 序列结束符 0
    11 流结束符 0
    12 填充数据 0
    13-23 保留 0
    24-31 未规定  

SPS 和 PPS决定了最大视频分辨率、帧率等以及还有一系列视频播放当中的参数。

『NALU Body』去掉竞争码后,就得到了RBSP。

RBSP = SODB + RBSP 尾部。

SEI解析可以参考:https://github.com/RussXia/flv-parser

什么是I帧、P帧、B帧

  • i帧 :i frame,即内部画面 intra picture,通常是GOP的第一个帧(即IDR),所以I帧也叫关键帧
  • P帧:前向搜索帧/前向预测帧,以I帧预测P帧;解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
  • B帧:双向搜索帧/双向内插帧,也就是B帧记录的是本帧与前后帧的差别。要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。

一般来说,I 帧的压缩率是7(跟JPG差不多),P 帧是20,B 帧可以达到50。