1.目標
<1>顯卡性能參數;
<2>方案可行性;
2.平台信息
2.1.查看當前顯卡信息
命令:
lspci |grep VGA
信息:
01:00.0 VGA compatible controller: NVIDIA Corporation GK106 [GeForce GTX 645 OEM] (rev a1)
解析:
GK106,是一個由英偉達公司制造的適配器圖形處理和加速核心芯片。
從NVIDIA支持的矩陣表中查找出GK106支持格式分別為:
NVDEC解碼:MPEG-2 VC-1 H.264(AVCHD)
NVENC編碼:H.264 (AVCHD) YUV 4:2:0
3.NVIDIA
3.1.NVIDIA參考資料
3.2.NVIDIA性能參數
從NVIDIA的video encode performance中查找到Quadro K4000:支持同時編碼16路1920 X 1080 H.264 (AVCHD) YUV 4:2:0,支持高性能和高質量,以及低延時模式;
注意:目前所有的NVIDIA都不支持 4:2:2編碼
支持的編碼格式總集:
H.264 (AVCHD) YUV 4:2:0
H.264 (AVCHD) YUV 4:4:4
H.264 (AVCHD) Lossless
H.265 (HEVC) YUV 4:2:0
H.265 (HEVC) YUV 4:4:4
H.265 (HEVC) Lossless
H.265 (HEVC) 8k
支持的解碼格式總集:
MPEG-2
VC-1
H.264(AVCHD)
H.265(HEVC)
VP8
VP9
3.3.NVIDIA顯卡驅動
驅動網站打開較慢,因此把我的驅動上傳到個人雲盤NVIDIA驅動,里面有產品支持列表
3.3.1.刪除舊驅動
sudo apt-get purge nvidia*
3.3.2.禁用自帶nouveau nvidia驅動
gedit /etc/modprobe.d/blacklist-nouveau.conf
並在文件blacklist-nouveau.conf中添加以下內容:
blacklist nouveau
options nouveau modeset=0
更新:
update-initramfs -u
修改后需要重啟系統。確認下Nouveau是否已經被禁用,使用命令:
lsmod | grep nouveau
3.3.3.安裝驅動
重啟系統,使用Ctrl+Alt+F1進入tty1控制台:
service lightdm stop
./NVIDIA-Linux-x86_64-375.26.run
service lightdm start
3.3.4.其他
./NVIDIA-Linux-x86_64-375.26.run --update 安裝時先下載最新驅動包
./NVIDIA-Linux-x86_64-375.26.run --uninstall 卸載驅動
4.ffmpeg
4.1.ffmpeg對NVIDIA GPU的支持
- 支持h.264和hevc硬件加速編碼; 支持h.264, hevc, VP9, VP8, MPEG2和MPEG4的硬件加速解碼;
- 可設置跟視頻編碼質量相關的參數,如:preset, rate等;
- 可使用FFmpeg中的filters進行端對端1:n編碼或1:n轉碼視頻硬件加速通道;
- 能添加自己編寫的高性能CUDA filters;
- 同時支持Windows和Linux support;
此外, NVIDIA 也為GPU的視頻處理任務提供的插件功能.
GPU Resize:將一個輸入轉換為多個分辨率並行輸出;
GPU Zero-copy:使能GPU-accelerated插件就可以避免在處理視頻時,系統和GPU內存間的數據拷貝;
4.2.ffmpeg對NVIDIA GPU的支持步驟
- 下載FFmpeg源碼 (https://git.FFmpeg.org/FFmpeg.git) 下載NVIDIA的最新Video Codec SDK 將NVIDIA的頭文件復制到ffmpeg的編譯環境中;
- 下載安裝NVIDIA驅動(apt install nvidia-375)
- 添加如下的configure命令(nv_sdk應包含cuda的庫和頭文件) :
./configure \
--enable-nonfree \ --disable-shared \ --enable-nvenc \ --enable-cuda \ --enable-cuvid \ --enable-libnpp \ --extra-cflags=-Ilocal/include \ --extra-cflags=-I../nv_sdk \
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
注意:實際使用的是以下配置:
#! /bin/bash
bash configure \
--enable-shared \ --disable-static \ --disable-yasm \ --disable-doc \ --enable-gpl \ --enable-pthreads \ --disable-w32threads \ --disable-os2threads \ --enable-debug \ --enable-nvenc \ --enable-cuda \ --enable-cuvid \ --extra-cflags="-Invidia_sdk -I/usr/local/cuda-8.0/include" \ --extra-ldflags="-Lnvidia_sdk -L/usr/local/cuda-8.0/lib64" \ --enable-nonfree \ --enable-libfreetype \ --enable-libfribidi \ --enable-libfontconfig \ --enable-libnpp \ --enable-gpl
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
4.3. 查看nvidia硬件加速編解碼器:
ffmpeg -codecs | grep cuvid
信息如下:
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi )
ffmpeg -codecs | grep nvenc
信息如下:
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi )
DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_cuvid ) (encoders: mjpeg mjpeg_vaapi )
DEV.L. mpeg1video MPEG-1 video (decoders: mpeg1video mpeg1_cuvid )
DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_cuvid )
DEV.L. mpeg4 MPEG-4 part 2 (decoders: mpeg4 mpeg4_cuvid )
D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_cuvid )
D.V.L. vp8 On2 VP8 (decoders: vp8 vp8_cuvid )
D.V.L. vp9 Google VP9 (decoders: vp9 vp9_cuvid )
5.結論
- 最后成功進行了硬件加速轉碼,由於顯卡是GeForce系列,因此只能驗證一路:
- 從結果來看,使用硬件加速確實釋放了CPU資源,編碼速度也有明顯提高,但質量相比X264有稍微的不足;
- 拋開編解碼質量和速度的嚴格要求,nvidia需要圖形專業級別的顯卡支持,方能做出產品;
6.后記
在20170125時,再一次投入nvidia的開發
7.工具
vmstat -w -n 1
nvidia-bug-report.sh
nvidia-cuda-mps-server
nvidia-detector
nvidia-modprobe
nvidia-settings 可圖形查看顯卡使用情況
nvidia-uninstall
nvidia-cuda-mps-control
nvidia-debugdump
nvidia-installer
nvidia-smi
nvidia-xconfig
8.問題list
8.1.cannot load libcuda.so.1
原因:該問題是由於我升級了nvidia(ubuntu版本)的驅動(由375.39升級到375.51)引起的
解決:卸載驅動,下載官方驅動375.39重新安裝
8.2.解碼阻塞
現象:
1.源丟包時,解碼函數總是被阻塞,使用新的接口解決;
8.3.結果
采用M2000,最終極限並發能達到48路左右,但實際采用32路