英偉達硬件加速解碼器在 FFMPEG 中的使用


私有驅動

nvenc 本身是依賴於 nvidia 底層的私有驅動的,所以想要使用編碼器首先需要安裝 nvidia 的私有驅動。在 NVIDIA VIDEO CODEC SDK 的介紹中說明,最新版本的 nvenc sdk 5.0 在 Linux 需要 346.22 以上的驅動,在windwos 下則需要 347.07 以上的驅動

The latest NVENC SDK version available is 5.0, which requires NVIDIA GPUdriver 347.09 or above for Windows and 346.22 or above for linux.

目前 Ubuntu 15.04 上的驅動滿足這個要求,Windows 平台可以直接到官網上下載最新的驅動安裝。(個人不建議去官網下載最新的 Linux 驅動,因為我試了很多次都沒有安裝成功,最終會導致無法進入系統)。

在 Ubuntu 15.04 下使用下面的命令安裝最新的驅動。

sudo apt-get install nvidia-346 \
                     nvidia-346-vum \
                     nvidia-modprobe \
                     nvidia-opencl-icd-346 \
                     nvidia-prime \
                     nvidia-settings

注意 nvidia-modprobe 必須要安裝,因為私有驅動使用的內核模塊,需要安裝這個包在系統啟動的時候加載這些內核模塊。安裝完成之后可能無法進入系統,這個應該是 nvidia 中的一個 BUG,你可以重啟之后選擇 grub 中的 ubuntu 高級 選項 中低版本的內核進入系統之后重啟再選擇高版本的內核進入系統。這一點非常的詭異,目前沒有找到原因。

啟動系統之后使用 lsmod | grep nvidia 應該會得到類似下面的結果:

nvidia_uvm             69632  0
nvidia               8380416  36 nvidia_uvm
drm                   348160  7 i915,drm_kms_helper,nvidia

直接通過 sudo modprobe nvidia_uvm 好像也無法成功的加載需要的模塊。

另外安裝驅動安裝完成之后會在 /dev 下面創建幾個和 nvidia 相關的設備,通過ls /dev/nvidia* 應該會得到類型以下的結果:

/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-uvm

編譯 FFMPEG

要想在 FFMPEG 中使用 nvenc 編碼器,你需要在編譯選項中加入 enable-nvenc選項。這個選項依賴於 nvEncodeAPI.h 頭文件,這個頭文件並沒有包含在私有驅動中,你需要到 NVIDIA VIDEO CODEC SDK 中下載 SDK,解壓后在Samples/common/inc 目錄下有這個頭文件,把它拷貝到可以鏈接到的目錄中去。

之后編譯就可以順利的通過,得到包含 nvenc 編碼器的庫。

使用 nvenc

FFMPEG 中直接使用 av_find_encoder_by_name("nvenc") 就可以找到這個這個編碼器並使用它。nvenc.c 的 pix_fmts_nvenc 變量定義來看,這個編碼器應該是支持 YUV420PYUV444P 和 NV12 三種格式的,但是測試的過程中發現YUV420P 沒辦法使用,所以應該吧 AVCodecContext 的 pix_fmt 設置成NV12


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM