返回
深入探讨 H264 编码——从基础到代码实现
IOS
2024-01-14 08:13:19
1. H264 编码基础
H264 是一种基于块编码的视频压缩标准,与之前的视频编码标准相比,H264 在保持相同视频质量的情况下,可以大幅降低比特率。H264 的主要优势包括:
- 高压缩率: H264 能够将视频数据压缩至很小的比特率,而不会显著降低视频质量。
- 良好的抗噪性: H264 具有较强的抗噪能力,即使在信道噪声较大的情况下,也能保持良好的视频质量。
- 支持多种分辨率: H264 支持多种视频分辨率,从标清到高清,甚至更高分辨率。
- 广泛的应用: H264 是一种广泛使用的视频编码标准,应用于各种领域,包括广播电视、流媒体、视频会议、视频监控等。
2. H264 编码结构
H264 编码结构分为序列参数集 (SPS)、图像参数集 (PPS) 和视频数据分片 (NALU) 三部分。
- 序列参数集 (SPS): SPS 包含有关整个视频序列的编码参数,如视频分辨率、帧率、编码级别等。
- 图像参数集 (PPS): PPS 包含有关单个图像的编码参数,如编码模式、量化参数等。
- 视频数据分片 (NALU): NALU 是 H264 视频数据的基本单位,包含编码后的视频数据。
3. H264 编码流程
H264 编码流程主要分为以下几个步骤:
- 预处理: 对原始视频数据进行预处理,包括色彩空间转换、去隔行、缩放等。
- 块划分: 将视频帧划分为宏块,宏块通常为 16x16 像素。
- 变换: 对每个宏块进行正交变换,将空间域的数据转换为频域的数据。
- 量化: 对变换后的数据进行量化,以减少数据量。
- 熵编码: 对量化后的数据进行熵编码,进一步减少数据量。
- 码流输出: 将熵编码后的数据打包成 NALU,输出到码流中。
4. AVFoundation 框架中的 H264 编码
AVFoundation 框架提供了 H264 编码器,开发者可以使用该编码器将视频数据编码成 H264 码流。
// 创建 AVAssetWriter 对象
AVAssetWriter *writer = [[AVAssetWriter alloc] initWithURL:outputURL fileType:AVFileTypeMPEG4];
// 创建 AVAssetWriterInput 对象
AVAssetWriterInput *input = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
// 将 AVAssetWriterInput 对象添加到 AVAssetWriter 对象中
[writer addInput:input];
// 创建 AVAssetWriterInputPixelBufferAdaptor 对象
AVAssetWriterInputPixelBufferAdaptor *adaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:input sourcePixelBufferAttributes:nil];
// 开始写入
[writer startWriting];
// 写入视频数据
while (true) {
// 获取视频帧
CVPixelBufferRef pixelBuffer = [self getVideoFrame];
// 将视频帧写入 AVAssetWriterInputPixelBufferAdaptor 对象中
[adaptor appendPixelBuffer:pixelBuffer withPresentationTime:presentationTime];
// 更新 presentationTime
presentationTime += frameDuration;
}
// 结束写入
[writer finishWriting];
5. 结束语
H264 编码是一种广泛使用的视频压缩标准,具有高压缩率、良好的抗噪性、支持多种分辨率等优点。AVFoundation 框架提供了 H264 编码器,开发者可以使用该编码器将视频数据编码成 H264 码流。