版權聲明:本文為博主翻譯文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/Tosonw/article/details/90178195
原文鏈接:https://trac.ffmpeg.org/wiki/HWAccelIntro
一、FFmpeg:HWAccelIntro
原文(英文):https://trac.ffmpeg.org/wiki/HWAccelIntro
許多平臺提供對專用硬件的訪問,以執行一系列與視頻相關的任務。使用這樣的硬件允許諸如解碼,編碼或過濾之類的一些操作更快地完成或使用更少的其他資源(特別是CPU),但是可能給出不同或較差的結果,或者施加僅在使用軟件時不存在的附加限制。在類似PC的平臺上,視頻硬件通常集成到GPU(來自AMD,Intel或NVIDIA),而在移動SoC類型平臺上,它通常是獨立的IP核(許多不同的供應商)。
硬件解碼器將為軟件解碼器生成等效輸出,但可以使用更少的功率和CPU來實現。功能支持各不相同 - 對于具有許多不同配置文件的更復雜的編解碼器,硬件解碼器很少實現所有這些(例如,硬件解碼器往往不會在H.264的8位深度處實現YUV 4:2:0以外的任何內容)。許多硬件解碼器的一個共同特點是能夠在適合其他組件使用的硬件表面中生成輸出(使用獨立顯卡,這意味著卡片內存中的表面而非系統內存中的表面) - 這通常對回放很有用因為在渲染輸出之前不需要進一步復制,并且在某些情況下它也可以與支持硬件表面輸入的編碼器一起使用,以避免在轉碼情況下進行任何復制。
硬件編碼器通常生成的輸出質量明顯低于x264等軟件編碼器,但通常速度更快,CPU資源也不多。(也就是說,它們需要更高的比特率來使輸出具有相同的感知質量,或者它們以相同的比特率以較低的感知質量進行輸出。)
具有解碼和/或編碼能力的系統還可以提供對其他相關過濾特征的訪問。縮放和逐行掃描等常見的事情,其他后處理可能取決于系統。在硬件表面可用的情況下,這些過濾器通常會作用于它們而不是系統存儲器中的普通幀。
有許多不同的標準化狀態的API可供使用。FFmpeg提供對其中許多的訪問,并提供不同的支持。
1.平臺API可用性
2.FFmpeg API實現狀態
與ffmpeg命令行工具一起使用
內部hwaccel解碼器通過-hwaccel選項啟用。軟件解碼器正常啟動,但如果它檢測到可在硬件中解碼的流,則它將嘗試將所有重要處理委托給該硬件。如果流在硬件中不可解碼(例如,它是不受支持的編解碼器或配置文件),則它仍將自動在軟件中解碼。如果硬件需要特定設備才能運行(或需要區分多個設備,例如是否有多個圖形卡可用),則可以使用-hwaccel_device選擇一個。
通過使用-codec:v選項設置特定解碼器來使用外部包裝解碼器。通常它們被命名為codec_api(例如:h264_cuvid)。這些解碼器需要事先知道編解碼器,如果不支持流,則不支持任何軟件回退。
編碼器包裝器由-codec:v選擇。編碼器通常有很多選項 - 有關詳細信息,請查看特定編碼器的文檔。
硬件過濾器可以像任何其他過濾器一樣用在過濾器圖形中。但請注意,它們可能不支持與軟件過濾器相同的任何格式 - 在這種情況下,可能需要使用hwupload和hwdownload過濾器實例在硬件表面和普通內存之間移動幀數據。
3.VDPAU
https://http.download.nvidia.com/XFree86/vdpau/doxygen/html/index.html
視頻解碼和演示API為Unix。由NVIDIA開發的Unix / Linux系統。要啟用此功能,您通常需要分發中的 libvdpau開發包和兼容的圖形卡。
注意,VDPAU不能用于解碼內存中的幀,壓縮幀由libavcodec發送到VDPAU支持的GPU設備,然后可以使用VDPAU API訪問解碼圖像。這不是由FFmpeg的自動完成的,但必須在應用程序級別(檢查例如做ffmpeg_vdpau.c通過使用文件ffmpeg.c)。此外,請注意,使用此API無法將解碼后的幀移回RAM,例如,如果您需要再次對解碼幀進行編碼(例如,在服務器上進行轉碼時)。
目前通過libavcodec中的VDPAU支持幾個解碼器,特別是H.264,MPEG-1/2/4和VC-1。
4.VAAPI
https://trac.ffmpeg.org/wiki/Hardware/VAAPI
視頻加速API(VAAPI)是一種非專有且免版稅的開源軟件庫(“libva”)和API規范,最初由Intel開發,但可與其他設備結合使用。
它可用于訪問Intel GPU中的Quick Sync硬件和AMD GPU中的UVD / VCE硬件。見VAAPI。
5.DXVA2
https://msdn.microsoft.com/en-us/library/windows/desktop/cc307941(v=vs.85).aspx
直接-X視頻加速API,由微軟開發的(支持Windows和Xbox360)。
目前支持幾種解碼器,特別是H.264,MPEG-2,VC-1和WMV 3。
DXVA2硬件加速僅適用于Windows。為了構建支持DXVA2的FFmpeg,您需要安裝dxva2api.h頭文件。對于MinGW的,這可以通過進行下載由VLC保持頭和(在例如在包括補丁安裝它的/ usr /包括/)。
對于MinGW64,默認提供dxva2api.h。安裝mingw-w64的一種方法是通過pacman存儲庫,可以使用以下兩個命令之一安裝,具體取決于體系結構:
pacman -S mingw-w64-i686-gcc pacman -S mingw-w64-x86_64-gcc12
要啟用DXVA2,請使用–enable-dxva2 ffmpeg配置開關。
要測試解碼,請使用以下命令:
ffmpeg -hwaccel dxva2 -threads 1 -i INPUT -f null - -benchmark1
6.VideoToolbox
https://developer.apple.com/documentation/videotoolbox
VideoToolbox,只支持在MacOS。H.264解碼在FFmpeg / libavcodec中可用。
7.NVENC / NVDEC
NVENC和NVDEC是NVIDIA的硬件加速編碼和解碼API。他們曾經被稱為CUVID。它們可用于Windows和Linux上的編碼和解碼。
NVENC
NVENC可用于H.264和HEVC編碼。FFmpeg通過h264_nvenc和hevc_nvenc編碼器支持NVENC 。要在FFmpeg中啟用它,您需要:
一個支持GPU
支持您的操作系統的驅動程序
在NVIDIA編解碼器SDK
ffmpeg使用–enable-nvenc配置(如果在配置時檢測到驅動程序,則為默認值)
注意: FFmpeg對NVIDIA的CUDA / NVENC /
NVDEC相關庫使用自己稍微修改過的運行時加載程序。如果你從一個錯誤配置抱怨缺少ffnvcodec,這個項目是你所需要的。它有一個帶有安裝目標的工作Makefile:make
install PREFIX = / usr。FFmpeg將查找名為ffnvcodec.pc的
pkg-config文件。確保它在PKG_CONFIG_PATH中。
這意味著在編譯ffmpeg之前運行以下內容應該足夠了:
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git cd nv-codec-headers sudo make sudo make install1234
編譯后,您可以使用NVENC。
用法示例:
ffmpeg -i input -c:v h264_nvenc -profile high444p -pixel_format yuv444p -preset default output.mp41
您可以使用ffmpeg -h encoder = h264_nvenc或ffmpeg -h encoder = hevc_nvenc查看可用的預設,其他選項和編碼器信息。
注意:如果您發現無NVENC功能設備錯誤,請確保您使用支持的像素格式進行編碼。請參閱上面顯示的編碼器信息。
NVDEC / CUVID
NVDEC為H.264,HEVC,MJPEG,MPEG-1/2/4,VP8 / VP9,VC-1提供解碼器。編解碼器支持硬件變化(見GPU兼容性表)。
請注意,FFmpeg提供NVDEC和CUVID hwaccel。它們在幀中如何解碼和轉發在內存中有所不同。
全套編解碼器僅在Pascal硬件上可用,它增加了VP9和10位支持。關于NVENC缺少ffnvcodec的說明也適用于NVDEC。
使用NVDEC進行樣本解碼:
ffmpeg -hwaccel nvdec input output1
使用CUVID進行樣本解碼:
./ffmpeg-git -hwaccel cuvid -c:v h264_cuvid -i input output1
CUVID和NVENC的全硬件轉碼:
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -c:v h264_nvenc -preset slow output1
如果編譯了ffmpeg并支持libnpp,則可以使用它將基于GPU的縮放器插入到鏈中:
ffmpeg -hwaccel_device 0 -hwaccel cuvid -i input -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow output.mkv1
該-hwaccel_device選項可用于指定要通過的ffmpeg的hwaccel的使用的GPU。
8.libmfx
libmfx是英特爾的專有庫,用于在Linux和Windows上使用Quick Sync硬件。在Windows上,除了可通過DXVA2 / D3D11VA訪問的功能外,它是使用更高級功能的主要方式,特別是編碼。在Linux上,它具有非常有限的功能集并且難以使用,但對于某些需要最大吞吐量的用例可能會有所幫助。
9.OpenCL
原文(英文):https://www.khronos.org/opencl/
OpenCL的可用于多個濾波器。要構建,需要OpenCL 1.2或更高版本的頭文件以及要鏈接到的ICD或ICD加載器 -
建議(但不要求)與ICD加載器鏈接,以便可以在運行時選擇實現,而不是建立時間。在運行時,需要一個OpenCL 1.2驅動程序 -
大多數GPU制造商將提供一個作為其標準驅動程序的一部分。CPU實現也可以使用,但可能比直接在ffmpeg中使用本機過濾器慢。
OpenCL可以與其他GPU API互操作,以避免GPU和CPU內存之間的冗余副本。支持的方法是:
DXVA2:僅適用于所有平臺的NV12表面。
D3D11:僅限Intel上的NV12紋理。
VAAPI:所有表面類型。
ARM Mali:所有表面類型,通過DRM對象共享。
libmfx:僅通過VAAPI或DXVA2的NV12表面。
10.AMD UVD / VCE
AMD UVD可用于通過Linux上的Mesa中的VDPAU和VAAPI進行解碼。VCE也通過VAAPI對編碼有一些初步支持,但應該被認為是實驗性的。
在Windows上,UVD可通過標準DXVA2 / D3D11VA API訪問,而VCE則通過AMF支持。
11.外部資源
multimedia.cx:如何玩硬件加速視頻在Mac:https://multimedia.cx/eggs/mac-hwaccel-video/
libav用戶:硬件加速解碼:https://lists.ffmpeg.org/pipermail/libav-user/2013-September/005463.html
堆棧溢出:如何使用硬件加速與ffmpeg的:https://stackoverflow.com/questions/23289157/how-to-use-hardware-acceleration-with-ffmpeg
二、硬件:VAAPI
原文(英文):https://trac.ffmpeg.org/wiki/Hardware/VAAPI
1.平臺支持
Intel / i965
請參閱QuickSync:https://trac.ffmpeg.org/wiki/Hardware/QuickSync
AMD / Mesa
Mesa VAAPI驅動程序使用所有最新AMD顯卡和APU中的UVD(統一視頻解碼器)和VCE(視頻編碼引擎)硬件。
所有GCN GPU(自Southern Islands以來)都支持H.264,MPEG-2,MPEG-4第2部分和VC-1解碼。GCN 3(火山島)和H.265 10位與GCN 4(北極群島)一起增加了H.265支持??赡苤С忠部赡懿恢С州^舊的GPU。
默認情況下,由于VAAPI限制,MPEG-4第2部分被禁用(主要的英特爾驅動程序從未實現它,所以它沒有得到太多測試)。將環境變量VAAPI_MPEG4_ENABLED設置為1,無論如何都要嘗試使用它。
H.264編碼正在使用GCN GPU,但仍然不完整。Mesa還沒有其他編解碼器支持編碼。
由于GPU內存中的數據布局,Mesa中的編碼和隔行掃描支持是不兼容的。默認情況下,幀被分隔為字段,并且支持隔行掃描視頻,但不支持編碼。將環境變量VAAPI_DISABLE_INTERLACE設置為1以便能夠使用編碼器(但沒有任何隔行視頻支持)。
2.設備選擇
需要將libva驅動程序連接到DRM設備才能工作。這可以直接連接,也可以通過正在運行的X服務器連接。在使用Standlone時,通常最好使用DRM渲染節點(/ dev / dri / render *) - 如果您確實想要處理X內的表面(例如,使用DRI2),則僅使用X連接。
在ffmpeg中,可以使用-init_hw_device選項創建命名的全局設備:
ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD1281
通過解碼hwaccel,可以使用-hwaccel_device選項為每個輸入流提供先前初始化的設備:
ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device foo -i ...1
如果只使用一個流,-hwaccel_device也可以直接接受設備路徑:
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i ...1
如果過濾器需要設備(例如,hwupload過濾器),則可以使用-filter_hw_device選項指定過濾器圖中使用的設備:
ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -i ... -filter_hw_device foo -filter_complex ...hwupload... ...1
如果您在同一臺計算機上有多個可用設備(例如,Intel集成GPU和AMD獨立顯卡),則可以同時使用它們來解碼不同的流:
ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device vaapi=amd:/dev/dri/renderD129 -hwaccel vaapi -hwaccel_device intel -i ... -hwaccel vaapi -hwaccel_device amd -i ...1
(參見< http://www.ffmpeg.org/ffmpeg.html#toc-Advanced-Video-options >有關這些選項的更多細節)。
最后,在帶有過濾器的單設備情況下,-vaapi_device選項可能更方便。
ffmpeg -vaapi_device /dev/dri/renderD1281
行為等同于:
ffmpeg -init_hw_device vaapi=vaapi0:/dev/dri/renderD128 -filter_hw_device vaapi01
3.Surface Formats
VAAPI使用的硬件編解碼器無法訪問任意內存中的幀數據。因此,在使用之前,需要將所有幀數據上載到連接到適當設備的硬件表面。ffmpeg中的所有VAAPI硬件表面都由vaapi pixfmt 表示(但內部布局在此處不可見)。
hwaccel解碼器通常以相關的硬件格式輸出幀,但默認情況下,ffmpeg實用程序將輸出幀下載到普通內存,然后再將它們傳遞給下一個組件。這使得解碼器可以在沒有任何其他選項的情況下更快地進行解碼:
ffmpeg -hwaccel vaapi ... -i input.mp4 -c:v libx264 ... output.mp41
對于其他輸出,選項-hwaccel_output_format可用于指定要使用的格式。這可以是軟件格式(格式可用,取決于驅動程序),也可以是vaapi硬件格式,表示不應下載表面。
例如,要僅解碼并對結果不執行任何操作:
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi ... -i input.mp4 -f null -1
這可以僅用于測試解碼器的速度/ CPU使用(下載操作通常會增加大量額外開銷)。
當解碼器輸出位于硬件表面時,幀將以該形式提供給后續濾波器或編碼器。該scale_vaapi和deinterlace_vaapi過濾器作用于VAAPI格式的畫面縮放和respecitvely隔行他們。也有一些通用的過濾器- hwdownload,hwupload和hwmap -支持所有硬件格式,包括VAAPI(參見< http://www.ffmpeg.org/ffmpeg-filters.html#hwdownload >)。
例如,采用隔行輸入,解碼,去隔行,縮放到720p,下載到普通內存并使用libx264進行編碼:
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi ... -i interlaced_input.mp4 -vf 'deinterlace_vaapi,scale_vaapi=w=1280:h=720,hwdownload,format=nv12' -c:v libx264 ... progressive_output.mp41
4.編碼
編碼器僅接受輸入作為VAAPI表面。如果輸入在普通存儲器中,則需要在將幀提供給編碼器之前上載 - 在ffmpeg實用程序中,可以使用hwupload過濾器。它將上傳到與軟件框架布局相同的表面,因此可能需要在之前添加格式過濾器以使輸入格式正確(硬件通常需要nv12布局,但大多數軟件功能使用yuv420p)布局)。所述hwupload濾波器還需要一個設備上傳到,需要創建過濾器圖形之前被定義。
因此,要為某些輸入使用默認解碼器,然后將幀上傳到VAAPI并使用H.264和默認設置進行編碼:
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf 'format=nv12,hwupload' -c:v h264_vaapi output.mp41
如果已知輸入是硬件可解碼的,那么我們可以使用hwaccel:
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128 -i input.mp4 -c:v h264_vaapi output.mp41
最后,當輸入可能是或不是硬件可解碼時,我們可以這樣做:
ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i input.mp4 -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v h264_vaapi output.mp41
這是因為解碼器將輸出vaapi表面(如果hwaccel可用)或軟件幀(如果不可用)。在第一種情況下,它匹配vaapi格式,而hwupload什么都不做(它通過硬件幀不變)。在第二種情況下,它匹配nv12格式并將輸入轉換為該格式,然后上載。但是,根據選擇的路徑,性能可能會有很大的變化。
支持的編碼器是:
編碼 | API |
---|---|
H.262 / MPEG-2第2部分 | mpeg2_vaapi |
H.264 / MPEG-4第10部分(AVC) | h264_vaapi |
H.265 / MPEG-H第2部分(HEVC) | hevc_vaapi |
MJPEG / JPEG | mjpeg_vaapi |
VP8 | vp8_vaapi |
VP9 | vp9_vaapi |
對于編解碼器選項的說明,請參見< http://www.ffmpeg.org/ffmpeg-codecs.html#VAAPI-encoders >。
5.從libx264映射選項
目前不支持類似CRF的模式。唯一的恒定質量模式是CQP(恒定量化參數),其對場景內容沒有適應性。但是,它允許不同幀類型的不同質量設置,通過在未引用的B幀上花費更少的比特來改善壓縮 - 參見(i | b)_q(因子|偏移)選項。CQP模式不能與最大比特率或緩沖區大小組合。
支持CBR和VBR模式,但它們的輸出因驅動器和設備而異(默認為VBR,設置-maxrate等于-b:v用于CBR)。HRD緩沖選項(rc_max_rate,rc_buffer_size)是有效的,并且編碼器將在適當時生成buffering_period和pic_timing SEI。
沒有完全類似的-preset選項。該-compression_level選項控制在編碼器本地速度/質量權衡(即,努力花費在試圖從當地選擇喜歡的運動估計和模式選擇最佳效果的量),用一個模糊的每個設備的規模。參數是一個小整數,從1到某個極限取決于設備(不超過7) - 更高的值更快/更低的流質量。另外,某些硬件(Intel gen9)支持具有更多限制功能的低功耗模式??梢酝ㄟ^-low_power選項訪問它。
根本不支持雙通道編碼和前瞻 - 只能進行本地速率控制。VBR模式應該在接近總體比特率目標方面做得相當不錯,但如果復雜性變化,質量將在流中發生顯著變化。
三、硬件/QuickSync
原文(英文):https://trac.ffmpeg.org/wiki/Hardware/QuickSync
警告:請勿在不確定需要的情況下安裝Intel Media SDK,尤其是在Linux上。在許多情況下,你不需要它,嘗試使用它可能會破壞其他東西。
“Intel Quick Sync Video”是許多英特爾GPU內部可用的一組硬件功能的營銷名稱。
1.硬件支持
2.API支持
可以通過許多不同的API訪問硬件:
DXVA2 / D3D11VA
這些是標準的Windows API,由英特爾圖形驅動程序實現,以支持視頻解碼。libmfx on Linux
這是英特爾的一個庫,可以作為Intel Media SDK的一部分安裝,并支持編碼和解碼案例的子集。libmfx on Windows
這是一個隨英特爾圖形驅動程序提供的庫,支持所有編碼和解碼案例。Media Foundation
另一個Windows API,通過英特爾圖形驅動程序支持一些編碼和解碼案例。ffmpeg不支持。VAAPI with i965 driver
這是libva / VAAPI 結構的主要免費驅動程序。大多數Linux發行版打包它。VAAPI with iHD driver
Linux上libmfx的后端使用修改后的libva和VAAPI驅動程序; 這也可以由用戶直接使用。
3.Linux
您可以從二進制安裝媒體服務器工作室https://software.intel.com/en-us/intel-media-server-studio/。 但是,Media Server Studio僅支持有限的HW平臺和Linux發行版。 整個開源媒體堆棧提供了更廣泛的硬件平臺和支持的Linux發行版。
Intel open source media stack
項目名: 支持的Gen Graphics | Open Source Repo |
---|---|
MSDK: gen9 + | https://github.com/Intel-Media-SDK/MediaSDK |
Libva: GEN5 + | https://github.com/intel/libva |
i965驅動程序: gen5~gen9.5 | https://github.com/intel/intel-vaapi-driver |
iHD驅動程序: gen9 + | https://github.com/intel/media-driver |
VAAPI VS libmfx
如果可能,強烈建議將VAAPI與i965驅動程序一起使用。如果您的用例特別需要其特定功能集,則僅使用libmfx。
VAAPI / i965
在大多數Linux發行版中標準打包。
運行所有可用的硬件,包括舊的和更便宜的設備。
更廣泛的編解碼器支持。
適用于可能也使用AMD / Nvidia硬件和Mesa的應用程序的通用API。
可與標準API(EGL / OpenGL,OpenCL)互操作。libmfx / iHD
在某些情況下可能會提供更好的編碼質量(?)。
在某些情況下可能會提供更高的編碼吞吐量(特別是在Iris圖形上)。
適用于也可在Windows上運行的應用程序的通用API。
可與英特爾OpenCL實施互操作。
4.Windows
Windows版本MSDK可以從得到 https://software.intel.com/media-sdk
5.運行
VAAPI
請參閱硬件/ VAAPI:https://trac.ffmpeg.org/wiki/Hardware/VAAPI
libmfx
該庫具有大量可供選擇的選項,可能的有效值取決于版本和硬件。libavcodec嘗試將常見選項明智地映射到libmfx選項,但映射是粗略的并且有漏洞,尤其是圍繞速率控制。
使用無效組合可能會激發消息:“QSV運行時不支持選定的速率控制模式。請選擇其他模式?!?通常這條消息是準確的,但它也可以指其他問題,如缺乏可用的設備。
6.在Linux上安裝Media SDK
請注意,內核修補程序和修改過的系統庫都是必需的。建議不要將它安裝在任何也用于其他目的的機器上,因為它不使用正常的分配機制,并且可能意外地被其他軟件包破壞/破壞。
建造機器:
建立和安裝打包調度:< https://github.com/lu-zero/mfx_dispatch >。(也可以按照安裝手冊中的說明從Media SDK安裝中提取必要的文件 - 不建議這樣做,只需使用包。)
使用–enable-libmfx構建ffmpeg。目標機器:
確保目標計算機具有受支持的CPU。當前版本僅在昂貴的CPU(“Xeon”/“Core i”品牌)上支持gen8 / gen9圖形。更便宜的CPU(“Pentium”/“Celeron”/“Atom”品牌)上的相同圖形核心被明確禁用,可能是出于商業原因。
得到一個干凈的版本支持的內核版本(目前4.4:< https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.tar.xz >),并應用所提供的補丁。構建和安裝。
構建并安裝提供的libva和libdrm樹。
運行Media SDK安裝腳本以安裝專有組件。
重啟。
————————————————
版權聲明:本文為CSDN博主「Tosonw」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Tosonw/article/details/90178195
評論
查看更多