硬解,使用非CPU進(jìn)行編碼,如顯卡GPU、專用的DSP、FPGA、ASIC芯片等。目前的主流GPU加速平臺(tái):INTEL、AMD、NVIDIA。
一、軟編碼和硬編碼比較
軟編碼:實(shí)現(xiàn)直接、簡(jiǎn)單,參數(shù)調(diào)整方便,升級(jí)易,但CPU負(fù)載重,性能較硬編碼低,低碼率下質(zhì)量通常比硬編碼要好一點(diǎn)。
硬編碼:性能高,低碼率下通常質(zhì)量低于軟編碼器,但部分產(chǎn)品在GPU硬件平臺(tái)移植了優(yōu)秀的軟編碼算法(如X264)的,質(zhì)量基本等同于軟編碼。
二、目前主流的GPU平臺(tái)開(kāi)發(fā)框架
CUVID:NVIDIA的封閉編程框架,通過(guò)框架可以調(diào)用GPU計(jì)算資源,N卡專用。
AMD APP:AMD為自己的GPU提出的一套通用并行編程框架,標(biāo)準(zhǔn)開(kāi)放,通過(guò)在CPU、GPU同時(shí)支持OpenCL框架,進(jìn)行計(jì)算力融合。
OpenCL:開(kāi)放計(jì)算語(yǔ)言,為異構(gòu)平臺(tái)編寫(xiě)程序的該框架,異構(gòu)平臺(tái)可包含CPU、GPU以及其他計(jì)算處理器,目標(biāo)是使相同的運(yùn)算能支持不同平臺(tái)硬件加速。
Inel QuickSync:集成于Intel顯卡中的專用視頻編解碼模塊,核顯專用。
CUDA只能夠在NVIDIA的GPU硬件上運(yùn)行。但是,OpenCL的目標(biāo)是面向任何一種并行處理器,OpenCL是第一種真正的開(kāi)放自由版權(quán)編程標(biāo)準(zhǔn),適用于異構(gòu)系統(tǒng)上的通用計(jì)算。而異構(gòu)平臺(tái)可由CPU、GPU、DSP、FPGA或其他類型的處理器搭建。
DXVA:DXVA是DirectX Video Acceleration的簡(jiǎn)稱,中文譯為視頻硬件加速。DXVA是微軟公司專門定制的視頻加速規(guī)范,它共有兩個(gè)版本,分別是DXVA 1.0和DXVA 2.0,幾乎所有的顯卡都具備硬件加速能力。
三、流程區(qū)別
硬解軟編: read(ffmpeg) -》 decoder(NVIDIA) -》 | Queue -》 encoder(ffmpeg)
軟解軟編: ?read(ffmpeg) -》 decoder(ffmpeg) -》encoder(ffmpeg)
解碼與編碼之間維護(hù)一個(gè)隊(duì)列,隊(duì)列長(zhǎng)度定為20(因?yàn)榻獯a速度快于編碼速度,數(shù)據(jù)被覆蓋,丟幀)
四、NVIDIA CUVID,Intel QuickSync和DXVA2,其中DXVA2又分為DXVA2 (copy-back)和DXVA2 (native),那么這幾種解碼方式有什么區(qū)別?
NVIDIA CUVID是NVIDIA專用硬體解碼介面,可以開(kāi)啟硬體去交錯(cuò)處理。
Intel QuickSync:Intel內(nèi)顯專用硬體解碼介面,CPU使用率比其余硬解模式稍高5~10%左右,可以開(kāi)啟硬體去交錯(cuò)處理。
DXVA2 (copy-back):為微軟開(kāi)發(fā)的硬體加速介面,AMD,NVIDIA,Intel顯示卡均可使用,會(huì)將解碼完成的資訊回傳給記憶體,由于多個(gè)回傳動(dòng)作,故效能會(huì)比native略差,不過(guò)優(yōu)勢(shì)為可以在解碼器與渲染器中間添加濾鏡。
DXVA2 (native):為微軟開(kāi)發(fā)的硬體加速介面,同樣AMD,NVIDIA,Intel顯示卡均可使用,會(huì)將解碼完成的資訊將不會(huì)傳給記憶體,直接渲染,故效能比copy-back佳,缺點(diǎn)為限制較多。
所以解碼方式推薦:DXVA2 (native) > DXVA2 (copy-back) > NVIDIA CUVID 或 Intel QuickSync。
五、NVIDIA硬件編解碼方案
1、使用 SDK 中的編解碼接口
英偉達(dá)關(guān)于視頻的編解碼提供了兩個(gè)相關(guān)的 SDK
NVENC --負(fù)責(zé)硬件編碼
NVCUVID --負(fù)責(zé)硬件解碼
NVENC是一個(gè)單獨(dú)的 SDK,集成在最新的顯卡驅(qū)動(dòng)上面,安裝最新的驅(qū)動(dòng)之后可以找到相關(guān)的庫(kù)文件。在 Ubuntu 14.04 中,可以在/usr/lib/nvidia-352/目錄下面找到相關(guān)的庫(kù)文件。
NVCUVID是CUDA的組件,包含在最新的CUDA Toolkit中。不過(guò)在顯卡的類庫(kù)中可以找到libnvcuvid.so這個(gè)庫(kù)文件。在之前版本的顯卡驅(qū)動(dòng)中其他還包含一個(gè)稱之為NVCUVENC的硬件編碼器和NVCUVID相對(duì)應(yīng),不過(guò)目前這個(gè)組件已經(jīng)被NVENC替代了。
2、使用編碼器對(duì)于 OpenCL 和 SDK 的封裝
這種方式是個(gè)人認(rèn)為最理想的方式,F(xiàn)FMPEG 目前存在一個(gè)編碼器nvenc是對(duì)于英偉達(dá)的NVENC的封裝,通過(guò)使用它可以和 FFMPEG 無(wú)縫的整合起來(lái)。此外它也包含對(duì)于Intel QSV的封裝。AMD 的相關(guān)接口目前沒(méi)有找到相關(guān)的資料。
不過(guò) FFMPEG 只存在NVENC的接口,不存在NVCUVID的封裝。如果需要實(shí)現(xiàn)相關(guān)的解碼器可能需要自己實(shí)現(xiàn) FFMPEG 接口。
libx264有對(duì)于 OpenCL 的封裝,不過(guò)我在 windows 中嘗試這個(gè)功能的時(shí)候并沒(méi)有成功。
另外還存在一個(gè)開(kāi)源的格式轉(zhuǎn)換器HandBrake,它包含對(duì)于Intel QuickSync的封裝,以及使用OpenCL進(jìn)行圖象的拉伸處理和使用x264的opencl封裝。這個(gè)項(xiàng)目缺點(diǎn)在于文檔不是很豐富,研究起來(lái)有一定的難度。
要想在 FFMPEG 中使用nvenc編碼器,你需要在編譯選項(xiàng)中加入enable-nvenc選項(xiàng)(老版本,新版本是自動(dòng)檢測(cè),顯示提供disable-nvenc的選項(xiàng))。
這個(gè)選項(xiàng)依賴于nvEncodeAPI.h頭文件,這個(gè)頭文件并沒(méi)有包含在私有驅(qū)動(dòng)中,你需要到NVIDIA VIDEO CODEC SDK中下載 SDK,解壓后在Samples/common/inc目錄下有這個(gè)頭文件,把它拷貝到可以鏈接到的目錄中去。之后編譯就可以順利的通過(guò),得到包含nvenc編碼器的庫(kù)。
六、ffmpeg硬解碼繪制視頻,cpu依然占用高。
cpu占用高主要是因?yàn)閍v_hwframe_transfer_data(sw_frame, frame, 0)占用了cpu,不要用這個(gè)函數(shù),應(yīng)該用d3d+dxva2 或者cuda+opengl硬渲染。
OpenCL主要用于通用的并行計(jì)算,它基于預(yù)定義的數(shù)據(jù)結(jié)構(gòu)和代碼,可以讓GPU處理各種通用的計(jì)算任務(wù),例如視頻處理、金融建模、科學(xué)計(jì)算和影像處理等,充分利用現(xiàn)代GPU的并行可擴(kuò)展性。OpenCL可以在多個(gè)硬件平臺(tái)上運(yùn)行,包括CPU、GPU和FPGA,并且與OpenGL、Direct3D和其他API無(wú)關(guān),因此可以與不同的圖形API進(jìn)行交互。
而OpenGL專注于計(jì)算機(jī)圖形處理和渲染,它提供了一個(gè)強(qiáng)大的渲染管道,具有著廣泛的支持和廣泛的用途。在游戲和虛擬現(xiàn)實(shí)應(yīng)用程序中,OpenGL被用作實(shí)時(shí)圖形渲染的標(biāo)準(zhǔn)API。但是,OpenGL無(wú)法執(zhí)行通用的計(jì)算任務(wù),這要求我們使用其他API,例如OpenCL或CUDA。
七、常用命令
1、如何用ffmpeg命令列舉支持的硬件解碼器:
ffmpeg -hwaccels
2、ffmpeg硬解命令:
ffmpeg -hwaccel cuvid -hwaccel_device 0 -c:v hevc_cuvid -y -i d:\input.mp4 -c:v h264_nvenc d:\output.mp4
或者
ffmpeg -hwaccel cuda -hwaccel_device 0 -c:v hevc_cuvid -y -i d:\input.mp4 -c:v h264_nvenc d:\output.mp4
ffmpeg 轉(zhuǎn)碼過(guò)程中輸出的 frame ,fps,q,size, bitrate ,speed 的意義。
frame表示視頻當(dāng)前第幾幀;fps表示一秒編碼了多少個(gè)視頻幀;q表示編碼質(zhì)量;size表示寫(xiě)入文件的數(shù)據(jù)大??;bitrate表示比特率(單位是 kbits/s ?1000位/秒);time表示當(dāng)前處理文件位置時(shí)長(zhǎng);speed表示編碼速度(多少秒視頻幀/多少秒ffmpeg處理時(shí)間)。
根據(jù)speed可以計(jì)算出ffmpeg耗時(shí),一個(gè)視頻文件ffmpeg處理完成時(shí)間為:視頻時(shí)長(zhǎng)秒/speed。
ffmpeg version 4.4-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 ? ? ?56. 70.100 / 56. 70.100
? libavcodec ? ? 58.134.100 / 58.134.100
? libavformat ? ?58. 76.100 / 58. 76.100
? libavdevice ? ?58. 13.100 / 58. 13.100
? libavfilter ? ? 7.110.100 / ?7.110.100
? libswscale ? ? ?5. ?9.100 / ?5. ?9.100
? libswresample ? 3. ?9.100 / ?3. ?9.100
? libpostproc ? ?55. ?9.100 / 55. ?9.100
Input #0, mpeg, from 'd:\input.mp4':
? Duration: 03:37:39.62, start: 37915.032111, bitrate: 354 kb/s
? Stream #0:0[0x1e0]: Video: hevc (Main), yuvj420p(pc, bt709), 960x576, 50 fps, 25 tbr, 90k tbn, 50 tbc
? Stream #0:1[0x1c0]: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
Stream mapping:
? Stream #0:0 -> #0:0 (hevc (hevc_cuvid) -> h264 (h264_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'd:\ch01_202203302130002-hw3.mp4':
? Metadata:
? ? encoder ? ? ? ? : Lavf58.76.100
? Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), nv12(pc, bt709, progressive), 960x576 [SAR 1:1 DAR 5:3], q=2-31, 4000 kb/s, 25 fps, 12800 tbn
? ? Metadata:
? ? ? encoder ? ? ? ? : Lavc58.134.100 h264_nvenc
? ? Side data:
? ? ? cpb: bitrate max/min/avg: 0/0/4000000 buffer size: 8000000 vbv_delay: N/A
frame=200781 fps=728 q=9.0 size= 3945472kB time=02:13:51.12 bitrate=4024.5kbits/s dup=0 drop=5 speed=29.1x
3、顯示英偉達(dá)顯卡nvidia-smi命令
3.1顯示GPU當(dāng)前的狀態(tài):
nvidia-smi
參數(shù)詳解:
**GPU:**本機(jī)中的GPU編號(hào)(有多塊顯卡的時(shí)候,從0開(kāi)始編號(hào))
**Fan:**風(fēng)扇轉(zhuǎn)速(0%-100%),N/A表示沒(méi)有風(fēng)扇,這個(gè)速度是計(jì)算機(jī)期望的風(fēng)扇轉(zhuǎn)速,實(shí)際情況下如果風(fēng)扇堵轉(zhuǎn),可能打不到顯示的轉(zhuǎn)速。
**Name:**GPU類型,圖上GPU的類型是:GeForce MX250/RTX 2080Ti
**Temp:**GPU的溫度(GPU溫度過(guò)高會(huì)導(dǎo)致GPU的頻率下降)
**Perf:**GPU的性能狀態(tài),從P0(最大性能)到P12(最小性能)
**Persistence-M:**持續(xù)模式的狀態(tài),持續(xù)模式雖然耗能大,但是在新的GPU應(yīng)用啟動(dòng)時(shí)花費(fèi)的時(shí)間更少。
**Pwr:Usager/Cap:**能耗表示,Usage:用了多少,Cap總共多少
**Bus-Id:**GPU總線相關(guān)顯示,domain:bus:device.function
**Disp.A:**Display Active ,表示GPU的顯示是否初始化
**Memory-Usage:**顯存使用率
**Volatile GPU-Util:**GPU使用率
**Uncorr. ECC:**關(guān)于ECC的東西,是否開(kāi)啟錯(cuò)誤檢查和糾正技術(shù),0/disabled,1/enabled
**Compute M:**計(jì)算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
**Processes:**顯示每個(gè)進(jìn)程占用的顯存使用率、進(jìn)程號(hào)、占用的哪個(gè)GPU
**type:**進(jìn)程類型。C 表示計(jì)算進(jìn)程,G 表示圖形進(jìn)程,C+G 表示都有。
3.2隔幾秒刷新一下顯存狀態(tài):
nvidia-smi -l 秒數(shù)
3.3將監(jiān)控結(jié)果寫(xiě)入文件,并且指定寫(xiě)入文件的監(jiān)控字段:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-695866.html
nvidia-smi -l 1 --format=csv --filename=report.csv --query-gpu=timestamp,name,index,utilization.gpu,memory.total,memory.used,power.draw
參考資料:
https://tool.4xseo.com/a/169.html
https://www.cnblogs.com/huty/p/8517141.html
https://blog.csdn.net/qq_40594137/article/details/124959608
https://deepinout.com/opencl/opencl-tutorials/22_difference_between_opencl_and_opengl.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695866.html
到了這里,關(guān)于H265視頻硬解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!