基於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 初始化階段
- 創建編碼器實例:通過NVIDIA SDK創建硬件編碼器
- 配置參數:設置分辨率、幀率、碼率等編碼參數
- 分配緩衝區:為輸入輸出數據分配GPU內存緩衝區
- 啓動線程:啓動編碼數據獲取線程
2.2.2 編碼階段
- 數據輸入:應用程序提供YUV420格式的原始幀數據
- 數據準備:將YUV數據複製到GPU緩衝區並進行格式轉換
- 硬件編碼:NVIDIA硬件編碼器執行H265編碼
- 數據輸出:通過回調函數返回編碼後的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幀數據
提交幀給編碼器
編碼器處理
硬件編碼
編碼完成回調
通過回調輸出數據
繼續編碼?
刷新編碼器
清理資源
結束