這篇文檔介紹如何在 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
變量定義來看,這個編碼器應該是支持 YUV420P
, YUV444P
和 NV12
三種格式的,但是測試的過程中發現YUV420P
沒辦法使用,所以應該吧 AVCodecContext
的 pix_fmt
設置成NV12
。