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

這篇文檔介紹如何在 ffmpeg 中使用 nvenc 硬件編碼器。

私有驅動

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

發佈了121 篇原創文章 · 獲贊 51 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章