一、H.264简介
H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT)提出的高度压缩数字视频编解码器标准,这个标准通常被称为H.264/AVC。它是继MPEG-4之后的新一代数字视频压缩格式,具有更高的编码效率,注重对移动和IP网络的适应,并且提供了丰富的错误处理工具以控制或消除丢包和误码。
H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)。
- VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,编码的VCL数据会先被映射或封装进NAL单元中。
- 每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)和一组对应于视频编码的NAL头信息。RBSP由VCL层输出的SODB(SODB, String Of Data Bits)字节对齐处理后封装而成。
二、SPS, PPS详解
2.1 SPS
SPS即Sequence Paramater Set,又称序列参数集。SPS中保存了一组编码视频序列的全局参数。所谓编码视频序列(Coded video sequence),即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。
在做视频播放器时,为了让后续的解码过程可以使用SPS中包含的参数,必须对其中的数据进行解析。
使用H264Visa工具打开.264文件,观察SPS:
SPS包含信息如下:
(1) profile_idc 标识当前H.264码流的profile
H.264中定义了三种常用的档次profile:
- 基准档次:baseline profile;
- 主要档次:main profile;
- 扩展档次:extended profile;
根据profile_idc的值可以确定码流符合哪一种档次。判断规律为:
- profile_idc = 66对应基准档次;
- profile_idc = 77对应主要档次;
- profile_idc = 88对应扩展档次;
profile_idc = 66,码流档次为baseline profile。
(2) constraint_setn_flag 标识制约条件
- 等于1时表示必须遵从附录 A.2.n 所指明的所有制约条件;
- 等于 0 时表示不必遵从所有条件;
当前码流中,constraint_setn_flag均等于0,说明不必遵从所有制约条件。
(3) level_idc 标识当前码流的Level
编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数。码流所遵从的level由level_idc指定,level = level_idc/10.
当前码流中,level_idc = 40,可得码流级别level=4.
(4) seq_parameter_set_id 表示当前的序列参数集的id
seq_parameter_set_id用于识别图像参数集所指的序列参数集,图像参数集PPS可以引用其代表的序列参数集SPS中的参数。该值应在0-31的范围