FFmpeg 使用顯卡加速轉(zhuǎn)碼
原文鏈接: https://juejin.cn/post/7034411980316213256
前言
視頻轉(zhuǎn)碼時如果遇見視頻比較大、時長很長的時候,轉(zhuǎn)碼壓制需要等待很久且及占用cpu,所以就在想有沒有什么辦法可以加速轉(zhuǎn)碼進度呢 ,故本篇文章記錄FFMPEG如何調(diào)用顯卡對轉(zhuǎn)換編碼格式或者壓制進行加速。
軟硬編解碼的區(qū)分:
軟編碼:使用CPU進行編碼
硬編碼:使用非CPU進行編碼,如顯卡GPU、專用的DSP、FPGA、ASIC芯片等
軟硬編解碼的區(qū)別:
軟編碼:實現(xiàn)直接、簡單,參數(shù)調(diào)整方便,升級易,但CPU負載重,性能較硬編碼低,低碼率下質(zhì)量通常比硬編碼要好一點。
硬編碼:性能高,低碼率下通常質(zhì)量低于軟編碼器,但部分產(chǎn)品在GPU硬件平臺移植了優(yōu)秀的軟編碼算法(如X264)的,質(zhì)量基本等同于軟編碼。
簡單來說硬解碼就是 內(nèi)存 - codec 電路 - 內(nèi)存/顯示 的過程所以速度會比軟件編解碼快
基礎(chǔ)環(huán)境
FFMPEG BUILDS 4.4.1
FFmpeg Builds?https://www.gyan.dev/ffmpeg/builds/
GeForce GTX 1060(NVIDIA)
顯卡支持列表
windows 10
環(huán)境搭建
安裝FFMPEG
https://ffmpeg.org/download.html
根據(jù)系統(tǒng)選擇適合的版本進行下載

選擇版本進行下載,本人下載的是 ffmpeg-release-essentials.zip

環(huán)境配置
壓縮ffmpeg-release-essentials.zip到指定目錄,進入bin目錄,里面有三個文件
ffmpeg.exe ffplay.exe ffprobe.exe
其中我們經(jīng)常使用到的就是 ffmpeg.exe,此時在目錄中可以執(zhí)行 ffmpeg version
PS D:\Software\ffmpeg\bin> ffmpeg -version
ffmpeg version 2021-05-05-git-7c451b609c-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 57. 0.100 / 57. 0.100
libavcodec 59. 0.100 / 59. 0.100
libavformat 59. 0.101 / 59. 0.101
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.101 / 8. 0.101
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100出現(xiàn)以上信息證明安裝成功,如果不想每次都進入目錄或使用絕對路徑,可以配置環(huán)境變量。

安裝 CUDA 驅(qū)動
CUDA是一個驅(qū)動程序,可以讓GPU進行相關(guān)運算,因為我們開發(fā)應(yīng)用程序一般不直接操控GPU,而是通過驅(qū)動來操作。
首先確定自己的電腦是否支持CUDA
Video Encode and Decode GPU Support Matrix
下載?https://developer.nvidia.com/cuda-downloads
選擇系統(tǒng)類型下載

硬件加速方式
通過命令 ffmpeg -hwaccels 可以查詢系統(tǒng)支持的硬件加速器。
ffmpeg -hwaccels
----------------------------------------------
cuda
dxva2
qsv
d3d11va
opencl
vulkan
PS:以上輸出代表系統(tǒng)所支持的硬件加速方式,后續(xù)會用到
硬編碼后綴解釋
qsv:intel顯卡的快速視頻同步技術(shù)(quick sync video)nvenc:nvidia顯卡的硬件視頻編碼器(nvidia hardware video encoder)cuvid:nvdec的舊稱,只有解碼端。cuda:同上amf:amd顯卡的amf硬件編碼器(amd hardware encoder)
基本上所有的Intel 電腦都支持qsv方式。
編解碼器支持
ffmpeg -codecs
查詢編碼器
ffmpeg -codecs
后面可以跟 sls命令查詢所需的編碼,例如:ffmpeg -codecs | sls nvenc
ffmpeg -codecs | sls nvenc
---------------------------------------------------------------
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders:
libx264 libx264 libx264rgb h264_amf h264_nvenc h264_qsv )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoder
s: libx265 hevc_amf hevc_nvenc hevc_qsv )
查詢系統(tǒng)支持的編解碼格式,需要用到 ffmpeg -decoders 和 ffmpeg -encoders 兩個命令。
查詢編解碼器選項
查詢編碼器hevc_nvenc的選項
ffmpeg -h encoder=hevc_nvenc
查詢解碼器 h264_qsv 的詳細信息
ffmpeg -h decoder=h264_qsv
ffmpeg -decoders
下面以h264作為測試
ffmpeg -decoders | sls h264
------------------------------------------------------
VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)PS:
h264_qsv,h264_cuvid,h264:就是支持的解碼方式
sls:作用相當(dāng)于linux中的grep
h264_qsv:英特爾硬解碼
h264_cuvid:英偉達硬解碼
ffmpeg -encoders
同解碼格式查詢
ffmpeg -encoders | sls h264
--------------------------------------------------------
V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V..... libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
V....D h264_amf AMD AMF H.264 Encoder (codec h264)
V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h26)
sls:作用相當(dāng)于linux中的grep
如以上有類似輸出則證明是支持硬解碼或者硬編碼的。
硬件加速命令
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -s 1920x1080 output.mp4
常用命令參數(shù)解釋
-hwaccel cuvid:使用cuvid進行硬件加速-c:v h264_cuvid:使用h264_cuvid進行解碼-c:v h264_nvenc:使用h264_nvenc進行編碼(nvidia硬件加速x265)-b:v 2000k:比特率,值越大約清晰。-s 1920x1080:分辨率-b:v 3500K:視頻平均比特率為 3500K-bufsize 6000K:緩存區(qū)大小 6000K,建議設(shè)定為 當(dāng)前碼率幀率5,也許這里的2pass是針對緩沖區(qū)的,緩存未來5s-maxrate 5000K:最大碼率為 5000K,每幀的最高碼率不超過這個數(shù)值-preset slow:預(yù)設(shè)方案是 slow,slow已經(jīng)是最好的選項了-pix_fmt p010le:輸出的像素格式是 p010le 也就10bit,只有新的硬件支持,例如:970m不支持,1070可以支持
總結(jié)
以上就是本人使用ffmpeg硬件加速轉(zhuǎn)碼的整體過程,如有疑問或者意見歡迎大家討論。
