一、 功能介绍

1.1 核心功能

H265硬件加速编码器是一个基于NVIDIA硬件编码器的C++封装类,主要功能包括:

  • 实时H265编码:将YUV420格式视频数据实时编码为H265格式
  • 硬件加速:利用NVIDIA GPU硬件编码器,提供高性能编码
  • 动态参数调整:支持运行时调整编码参数
  • 灵活输出:通过回调机制输出编码数据,支持多种应用场景

1.2 主要特性

1.2.1 编码参数控制
  • 分辨率设置:支持任意分辨率编码
  • 帧率控制:可配置编码帧率
  • 码率控制:支持VBR(动态码率)模式
  • IDR帧控制:可配置IDR帧间隔和强制插入
1.2.2 动态调整能力
// 运行时调整编码参数
encoder.setBitrate(4000000);           // 调整码率到4Mbps
encoder.setIdrInterval(30);            // 调整IDR帧间隔
encoder.forceIdrFrame();               // 强制插入IDR帧
1.2.3 输出灵活性
  • 回调机制:通过回调函数输出编码数据
  • 多种应用:支持文件存储、网络传输、内存处理等
  • 帧信息:提供关键帧标识和帧统计信息

二、原理解释

2.1 整体架构

┌─────────────────┐    YUV数据    ┌──────────────────┐    H265数据    ┌─────────────────┐
│   输入数据源     │ ────────────> │  H265编码器      │ ────────────> │   输出处理器    │
│ (文件/摄像头/等) │               │                  │               │ (文件/网络/等)  │
└─────────────────┘               └──────────────────┘               └─────────────────┘
                                         │
                                         ▼
                                ┌──────────────────┐
                                │  NVIDIA硬件编码器 │
                                └──────────────────┘

2.2 编码流程原理

2.2.1 初始化阶段
  1. 创建编码器实例:通过NVIDIA SDK创建硬件编码器
  2. 配置参数:设置分辨率、帧率、码率等编码参数
  3. 分配缓冲区:为输入输出数据分配GPU内存缓冲区
  4. 启动线程:启动编码数据获取线程
2.2.2 编码阶段
  1. 数据输入:应用程序提供YUV420格式的原始帧数据
  2. 数据准备:将YUV数据复制到GPU缓冲区并进行格式转换
  3. 硬件编码:NVIDIA硬件编码器执行H265编码
  4. 数据输出:通过回调函数返回编码后的H265数据
2.2.3 资源管理
  • RAII原则:构造函数分配资源,析构函数自动清理
  • 缓冲区管理:循环使用编码缓冲区,减少内存分配
  • 错误恢复:完善的错误检测和资源释放机制

2.3 关键技术点

2.3.1 硬件加速原理
// 利用NVIDIA NVENC硬件编码器
video_encoder_ = NvVideoEncoder::createVideoEncoder("enc0");
  • 直接访问GPU上的专用编码硬件单元
  • 绕过CPU编码,大幅提升编码性能
  • 支持并行处理多个编码任务
2.3.2 零拷贝数据传输
// 使用DMA缓冲区,避免CPU-GPU间数据拷贝
video_encoder_->output_plane.setupPlane(V4L2_MEMORY_MMAP, BUFFER_COUNT, true, false);
2.3.3 异步处理模型
// 异步回调处理编码完成的数据
video_encoder_->capture_plane.setDQThreadCallback(capturePlaneDqCallback);
video_encoder_->capture_plane.startDQThread(this);

三、流程图

3.1 整体编码流程图

开始
创建H265Encoder实例
设置编码参数
设置数据回调函数
初始化编码器
初始化成功?
进入编码循环
错误处理
获取YUV帧数据
提交帧给编码器
编码器处理
硬件编码
编码完成回调
通过回调输出数据
继续编码?
刷新编码器
清理资源
结束

3.2 详细编码流程图