Linux系統配置Opencv+cuda+ffmpeg開發環境,-217:Gpu API call unknown error code問題排解

远桥發表於2024-07-07

Opencv是當前比較熱門的影像處理開源演算法庫,但是隨著深度學習在影像儲存裡領域的大放異彩,基於python的影像處理和深度學習演算法大有超越opencv的趨勢。opencv在最近的版本更新中,重點都放在了人工智慧演算法方面,本文介紹linux環境下配置支援GPU/cuda的ffmpeg和opencv開發環境,並將其中遇到的問題記錄下來,方便查詢。

1. 基礎環境

作業系統:目前在Ubuntu20.04,24.04,Kylin OS V10上都進行國配置。nvidia版本555, cuda版本12.5,ffmpeg版本7.01,opencv版本4.10.0(含opencv_contrib).

2. nvidia相關安裝和配置

從nvidia官網下載cuda12.5安裝包,其中自帶555版本的顯示卡驅動。直接執行安裝包,可以自動安裝顯示卡驅動和cuda。這裡要注意,有的系統(如kylin os)直接安裝顯示卡驅動會失敗,需要先解除安裝以前的舊版本驅動。對於沒有舊nvidia驅動的系統安裝依然失敗,那就需要手動將系統自帶驅動禁用,按照最傳統的方法安裝該驅動和粗大。同時選擇不安裝驅動的就需要注意該版本粗大相容的顯示卡驅動版本號,例如該版本相容525以上版本的驅動,如果舊的驅動大於525就可以不安裝驅動,只安裝cuda。

cuda安裝完成後需要按照提示,在系統環境變數PATH和LD_LIBRARY_PATH中新增cuda的可執行程式目錄和庫目錄。同時建議新增CUDA_PATH環境變數。

3. ffmpeg編譯和安裝

按照官方Using_FFmpeg_with_NVIDIA_GPU_Hardware_Acceleration.pdf檔案配置ffmpeg。如果不看文件的就直接搜一個nv-codec-headers的檔案,並進行make install。經過測試ffmpeg7.10編譯有問題,最新的nvidia video codec SDK中新定義的變數並沒有在ffmpeg7.10中進行更新,直接編譯會有找不到定義的變數。也有可能是我自己下載的錯誤的nvcodec SDK(其實不需要),如果像我一樣下載並將庫和標頭檔案複製到系統目錄下,會造成後面opencv莫名奇妙的問題。然後按照上面提到的官方檔案進行configure配置,檢查配置結果中是否含有h264_cuvid、hevc_cuvid解碼器,和h264_nvenc、hevc_nvenc編碼器,h264_nvdec、hevc_nvdec硬體解碼,以及ffplay。其實我個人主要用到的是h264_cuvid進行解碼和ffplay進行播放測試影片。為了能夠編譯ffplay需要系統安裝或編譯SDL2庫。同時,SDL2庫編譯的時候需要安裝一個alsa音訊處理模組,否則編譯SDL2和ffmpeg都不會有問題,但是執行的時候會報錯誤。

4. opencv編譯和安裝

將opencv_contrib檔案中的內容複製到opencv庫中,也可以透過cmake配置的方式編譯opencv_contrib,但是我喜歡直接複製合併。注意,對於不想編譯opencv_contrib,又需要使用GPU/cuda的需要編譯opencv_cudev庫及其他幾個cuda演算法模組。點選configure。由於國內環境,編譯第三方庫的時候會下載一些演算法模型檔案,經常需要耗費大量時間又難以下載,所以這裡建議直接遮蔽WITH_IPP\WITH_ADE\BUILD_opencv_face\BUILD_opencv_wechat_qrcode\BUILD_opencv_xfeature2d。有的編譯webp的時候會出現編譯器錯誤,這裡也可以將其遮蔽掉。需要開啟WITH_CUDA,再次進行configure。檢查cuda模組是否找到。這裡有個大問題,就是CUDA_nvcuvid_LIBRARY和CUDA_nvidia-encode_LIBRARY兩個庫是找不到的。如果這個時候你上網搜尋,會讓你下載Video_Codec_SDK,並複製標頭檔案和庫到系統目錄或cuda目錄下,這樣雖然能夠編譯透過,但是後面英語會出問題,因為這個SDK是對於那些沒有安裝nvidia驅動的環境提供的,所以因為我們已經安裝了驅動,驅動自帶有這兩個庫檔案, 位於/usr/lib/x86_64-linux-gun目錄下。但是沒有標頭檔案。我的做法是將SDK的標頭檔案複製到cuda/include目錄下,並在cuda/lib64下面建立這兩個編解碼庫的軟連線(個人感覺這不是一個合適的解決辦法,但是暫時沒有找到其他方式)。再次執行configure,make,make install。

5. -217:Gpu API call Unkown error code錯誤排解

如上所述,如果直接使用SDK中的庫,會出現無法識別的錯誤。刪除SDK的編解碼庫,將驅動自帶的庫複製到cuda下或,建立軟連線可以正常編譯和執行。

相關文章