返回

深入探讨 H264 编码——从基础到代码实现

IOS

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 编码流程主要分为以下几个步骤:

  1. 预处理: 对原始视频数据进行预处理,包括色彩空间转换、去隔行、缩放等。
  2. 块划分: 将视频帧划分为宏块,宏块通常为 16x16 像素。
  3. 变换: 对每个宏块进行正交变换,将空间域的数据转换为频域的数据。
  4. 量化: 对变换后的数据进行量化,以减少数据量。
  5. 熵编码: 对量化后的数据进行熵编码,进一步减少数据量。
  6. 码流输出: 将熵编码后的数据打包成 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 码流。