基於NvVideoEncoder的H265視頻編碼器

  • 一、 功能介紹
  • 1.1 核心功能
  • 1.2 主要特性
  • 1.2.1 編碼參數控制
  • 1.2.2 動態調整能力
  • 1.2.3 輸出靈活性
  • 二、原理解釋
  • 2.1 整體架構
  • 2.2 編碼流程原理
  • 2.2.1 初始化階段
  • 2.2.2 編碼階段
  • 2.2.3 資源管理
  • 2.3 關鍵技術點
  • 2.3.1 硬件加速原理
  • 2.3.2 零拷貝數據傳輸
  • 2.3.3 異步處理模型
  • 三、流程圖
  • 3.1 整體編碼流程圖
  • 3.2 詳細編碼流程圖
  • 3.3 回調機制流程圖
  • 3.4 動態參數調整流程圖
  • 四、使用場景
  • 4.1 實時視頻錄製
  • 4.2 實時流媒體
  • 4.3 視頻處理流水線
  • 4.4 自適應碼率流媒體
  • 五、性能特點
  • 5.1 優勢
  • 5.2 限制
  • 六、完整代碼
  • 七、編譯及運行
  • 7.1、編譯命令
  • 7.2、運行

一、 功能介紹

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 詳細編碼流程圖