本篇博客記錄NVENC硬編碼的預研過程git
github: https://github.com/MarkRepo/NvencEncodergithub
步驟以下:api
(1)環境搭建緩存
(2)demo編譯,測試,ARGB編碼性能
(3)研究demo源碼,閱讀API文檔測試
(4)封裝so共享庫,聯調測試多路編碼性能編碼
(5)研究內存,顯存拷貝方案,嘗試解決CPU,GPU消耗太高等性能問題spa
1. 環境搭建設計
(1)編譯環境,預研中這個環境不是我親手搭建的,須要CUDAToolKit, NVENC SDK指針
(2)運行環境,須要Nvidia獨立顯卡,另外還要注意NVENC SDK的版本對顯卡驅動版本有要求,具體在SDK的文檔中會有說明。
2. demo測試
demo中提供了Makefile,只需拷貝到編譯環境,編譯官方SDK中的demo,測試yuv編碼h264, 用VLC正確播放出來。嘗試編碼RGB,一開始因爲缺少對YUV和RGB的理解,致使走了很多彎路,嘗試了挺久才試出來。後來預研了QSVE以後才發現NVENC的編碼接口更簡單,須要注意的是YUV,RGB等輸入數據在緩存中要行對齊。
3.研究源碼,封裝so共享庫
在可以正確編碼rgb數據以後,設計能與SPICE服務端通訊的接口,提供SO供其調用,這一步主要是研究demo源碼中各個API如何調用,查看API文檔的詳細解說。(後面會把相關代碼、文檔放到github上管理)。
4.內存到顯存拷貝方案。(各類方案的使用方法,不在這裏細講,參見github上的源碼和相關文檔)
(1)使用NVENC API分配的input buffer, 將顯存指針映射成cpu指針,而後調用memcpy拷貝
(2)使用cuda的api分配的顯存,而後將顯存註冊到NVENC,調用cuda api將內存拷貝到顯存
(3)使用zero-copy, 調用cuda api分配鎖頁內存,映射到顯存,而後註冊到NVENC,往主機鎖頁內存寫數據,當調用NVENC的編碼接口時,gpu調用DMA進行數據拷貝。
三種方案總結:
NVENC顯存: 佔用cpu最高,主要是memcpy佔用
GPU顯存: 佔用cpu也很高,主要CUDA api的內存拷貝
zero-copy 不佔用cpu, 可是拷貝效率也不高,實際運用中體驗效果不如前面兩種方案。