返回

解码新方式:剖析H264结构与码流解析

IOS

H.264:视频编码领域的基石

概览

在视频编码领域,H.264技术犹如一颗璀璨的明珠,以其卓越的压缩性能和广泛的应用场景而闻名。要深入理解H.264,就必须剖析其内部结构和码流的奥妙。本文将带你踏上一段H.264的探索之旅,从宏块、片、帧等基本概念出发,一步步揭开H.264视频流的组成和传输方式。

H.264结构:视频图像的层层解码

H.264将视频图像编码后的数据称之为一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由16x16的YUV数据组成。宏块作为H.264编码的基本单位,承载着图像的局部信息。

场与帧:幕后的英雄

视频的一场或者一帧都可以用来产生一个编码图像。在电视中,每个电视帧都是通过扫描两场图像而形成的,称为隔行扫描。而电影中,每一帧都是独立的,称为逐行扫描。H.264支持隔行扫描和逐行扫描两种方式。

图像类型:关键帧、P帧、B帧

H.264视频流中的图像主要分为关键帧(I帧)、预测帧(P帧)和双向预测帧(B帧)三种。关键帧是独立完整的图像,可以单独解码。P帧是基于前一帧进行预测编码的图像,而B帧则是基于前一帧和后一帧进行预测编码的图像。

编码方式:宏块内预测和宏块间预测

H.264视频编码采用宏块内预测和宏块间预测两种方式。宏块内预测是指利用本宏块内的像素来预测该宏块中的像素值,而宏块间预测是指利用相邻宏块的像素值来预测该宏块中的像素值。

码流组织:SPS、PPS、NALU

H.264码流由序列参数集(SPS)、图像参数集(PPS)和网络抽象层单元(NALU)组成。SPS包含了视频序列的基本信息,PPS包含了图像的基本信息,NALU是视频数据的基本单位。

序列参数集 (SPS)

| 字段       |                                                 |
| ----------- | ---------------------------------------------------- |
| profile_idc | H.264配置文件                                       |
| level_idc   | H.264级别                                           |
| seq_parameter_set_id | SPS的ID                                          |
| chroma_format_idc | 颜色采样格式                                    |
| bit_depth_luma_minus8 | luma位深减8                                     |
| bit_depth_chroma_minus8 | chroma位深减8                               |
| log2_max_frame_num_minus4 | 最大帧号减4的log2值                      |
| pic_order_cnt_type | 图像顺序计数类型                                |
| log2_max_pic_order_cnt_lsb_minus4 | 最大图像顺序计数减4的log2值    |
| max_num_ref_frames | 最大参考帧数                                  |
| gaps_in_frame_num_value_allowed_flag | 帧号允许出现间隙                |
| frame_mbs_only_flag | 视频流中仅包含帧,没有场                         |
| direct_8x8_inference_flag | 8x8预测                                       |
| frame_cropping_flag | 是否进行帧裁剪                                 |
| frame_crop_left_offset | 帧裁剪左偏移                                |
| frame_crop_right_offset | 帧裁剪右偏移                                |
| frame_crop_top_offset | 帧裁剪上偏移                                 |
| frame_crop_bottom_offset | 帧裁剪下偏移                               |

图像参数集 (PPS)

| 字段       |                                                 |
| ----------- | ---------------------------------------------------- |
| pic_parameter_set_id | PPS的ID                                          |
| seq_parameter_set_id | SPS的ID                                          |
| entropy_coding_mode_flag | 熵编码模式                                |
| pic_order_present_flag | 图像顺序计数信息                           |
| num_slice_groups_minus1 | 片组数减1                                     |
| slice_group_map_type | 片组映射类型                                |
| num_ref_idx_l0_default_active_minus1 | L0的默认激活参考索引数减1   |
| num_ref_idx_l1_default_active_minus1 | L1的默认激活参考索引数减1   |
| weighted_pred_flag | 加权预测                                        |
| weighted_bipred_idc | 双向加权预测                                    |
| pic_init_qp_minus26 | 初始化量化参数减26                            |
| pic_init_qs_minus26 | 初始化QP值精度减26                          |
| chroma_qp_index_offset | 色度量化参数索引偏移                       |
| deblocking_filter_control_present_flag | 去块滤波器控制信息是否存在    |
| constrained_intra_pred_flag | 约束帧内预测                              |
| redundant_pic_cnt_present_flag | 冗余图像计数信息                      |
| transform_8x8_mode_flag | 8x8变换模式                                 |
| pic_scaling_matrix_present_flag | 图像缩放矩阵信息是否存在          |
| second_chroma_offset | 第二色度偏移                                |

网络抽象层单元 (NALU)

NALU是H.264码流的基本单位,每个NALU包含一个NALU头部和一个NALU有效载荷。NALU头部包含NALU类型、分配的比特流等信息,NALU有效载荷包含编码后的视频数据。

传输流程:从编码到解码

H.264视频流的传输过程主要分为编码、封装和传输三个步骤。编码是指将原始视频数据编码成H.264码流,封装是指将H.264码流封装成适合网络传输的格式,传输是指将封装后的H.264码流通过网络传输到接收端。

编码

H.264编码器将原始视频数据分割成宏块,并对每个宏块进行预测和编码。预测过程利用相邻宏块或本宏块内的像素值来预测当前宏块中的像素值,编码过程则将预测误差编码成比特流。

封装

H.264码流在传输前需要进行封装,常见的封装格式包括MP4、MOV、FLV等。封装过程将H.264码流与其他信息(如音频数据、元数据等)组合在一起,形成一个完整的媒体文件。

传输

封装后的H.264媒体文件通过网络传输到接收端。网络传输过程中可能存在丢包、延迟等问题,需要采用适当的传输协议(如RTP、TCP)来保证视频流的可靠传输。

H.264应用场景:视频会议、流媒体、监控等

H.264视频编码标准广泛应用于视频会议、流媒体、监控等领域。

视频会议

在视频会议中,H.264可以有效地压缩视频数据,降低带宽需求,从而实现流畅的视频通信。

流媒体

在流媒体中,H.264可以提供高画质的视频内容,同时降低对网络带宽的需求,从而实现更广泛的流媒体服务。

监控

在监控中,H.264可以有效地压缩监控视频数据,降低存储和传输成本,从而实现更经济高效的监控系统。

结语:H.264的无限可能

H.264视频编码标准作为视频编码领域的一座里程碑,凭借其强大的压缩性能和广泛的应用场景,在音视频学习中占据着重要地位。随着视频技术的发展,H.264不断演进,新的编码标准不断涌现,但H.264作为经典的视频编码标准,将在很长一段时间内继续发挥其重要作用。

常见问题解答

1. H.264和H.265有什么区别?

H.264和H.265是两个不同的视频编码标准,H.265在压缩性能和图像质量方面比H.264有明显提升,但H.264仍然是目前应用最广泛的视频编码标准。

2. H.264码流中不同的帧类型有什么作用?

关键帧(I帧)是独立完整的图像,可以单独解码。P帧和B帧是预测帧,利用相邻帧的信息进行预测编码,可以进一步提高压缩比。

**3. H.2