硬件視頻加速(Hardware video acceleration)
通過讓顯卡編解碼視頻,從而減輕cpu負擔并且還能節省電源。
當視頻內容存儲在硬盤、dvd、攝像機、手機或廣播媒體上時,通常會被壓縮并編碼成特定的格式。當你想要播放、上傳或復制內容到你的手機時,必須先對其進行解碼,然后再以一種新的格式重新編碼,這是一個耗費資源和時間的過程。硬件視頻加速技術通過讓顯示卡來快速解碼,使處理器能夠完成其他任務,提高系統響應能力。
在linux上的幾種實現:
Video Acceleration API (VAAPI)英特爾開發的規范和開源庫,提供硬件加速視頻的編/解碼。
Video Decode and Presentation API for Unix (VDPAU)是一套NVIDIA開發的,用于將部分視頻解碼和渲染分擔給GPU來處理的開源庫和API。
NVDECODE/NVENCODENVIDIA Fermi, Kepler, Maxwell and Pascal系列顯卡專有的硬件加速API
intel 硬件加速技術
intel 的開源媒體棧
MSDK : https://github.com/Intel-Media-SDK/MediaSDK
Libva : https://github.com/intel/libva
i965 driver : ?https://github.com/intel/intel-vaapi-driver
iHD driver : ?https://github.com/intel/media-driver
VA-API
開源驅動:
AMD: 位于官方軟件倉庫的libva-vdpau-driver和mesa兩者為 Radeon 9500 或更新的GPU提供支持。
Intel: 位于官方軟件倉庫的libva-intel-driver軟件包為 GMA 4500 系列或者更新的GPU提供支持。
NVIDIA: 位于官方軟件倉庫的libva-vdpau-driver和mesa兩者為 GeForce 8 系列和更新的GPU提供支持。位于AUR的 nouveau-fwAUR 軟件包包含從NVIDIA閉源驅動中提取出的必要的固件文件。
閉源驅動:
AMD: 位于AUR的libva-xvba-driverAUR[broken link: archived in aur-mirror]軟件包為 Radeon HD 4000 系列或更新的GPU提供支持。在 Radeon HD 5000 系列或者更新的GPU上請使用 catalyst-utilsAUR 驅動;在 Radeon HD 4000 系列上使用 catalyst-total-hd234kAUR 作為驅動程序。
NVIDIA: 位于官方軟件倉庫的libva-vdpau-driver軟件包和nvidia-utils驅動為 GeForce 8 系列或更新的GPU提供支持。
intel 依賴libva-intel-driver
AMD 依賴libva-mesa-driver)
安裝
以前整理過ubuntu下的簡潔安裝記錄:
linux 下 intel vaapi安裝
主要是安裝media-driver及其依賴庫。
檢驗 VA-API
運行 libva-utils 包提供的 vainfo工具 來檢查 VA-API 的設置
$ vainfo
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.3)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.7.3
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileH264MultiviewHigh : VAEntrypointVLD
VAProfileH264MultiviewHigh : VAEntrypointEncSlice
VAProfileH264StereoHigh : VAEntrypointVLD
VAProfileH264StereoHigh : VAEntrypointEncSlice
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
樣例
ffmpeg vaapi h264加速樣例,其他ffmpeg wiki還有很多。
$ ffmpeg -threads 1 -i file.ext -vaapi_device /dev/dri/renderD128 -vcodec h264_vaapi -vf format='nv12|vaapi,hwupload' output.mp4
代碼例 曾經寫過的vaapi樣例: 解碼->overlay->編碼
vaapi-test.go
Intel Quick Sync(QSV)
除了VAAPI之外,intel還有一項自己平臺專屬的硬件加速技術QSV(quick-sync-video)。
Quick Sync Video 使用Intel圖形技術專用媒體處理能力來快速編解碼。
ffmpeg wiki有一頁qsv的介紹,但是推薦使用VA-API(iHD / i965) 驅動代替libmfx.
API支持情況
QSV支持訪問多種不同的媒體庫API:
DXVA2 / D3D11VA : 標準windows api,由Intel圖形驅動程序實現,以支持視頻解碼。
linux libmfx:這是intel的一個庫,可以作為Intel Media SDK的一部分安裝,并且支持一些編碼和解碼類型。
Windows libmfx: 英特爾的圖形驅動程序提供,它支持所有的編碼和解碼的類型。
Media Foundation:通過英特爾圖形驅動程序,支持一部分編解碼類型,沒有繼承進ffmpeg。
VAAPI i965驅動:這是一個幾乎免費的libva/VAAPI驅動程序。大多數Linux發行版都打包了它。
VAAPI iHD驅動:Linux上的libmfx后期使用了的一個修改過的libva和VAAPI驅動程序;這也可以由用戶直接使用。
vaapi/mfx比較
vaapi/i965
1)在大多數Linux發行版中都是作為標準打包的。
2)可運行在所有可用的硬件上,包括一些較老和較便宜的設備。
3)支持大多數編解碼器。
4)通用的API,也可以使用基于Mesa的AMD / Nvidia硬件。
5)可與標準api (EGL/OpenGL, OpenCL)交互。
libmfx /iHD
1)在某些情況下,可能會提供更好的編碼質量(如look_ahead)。
2)在某些情況下(如MFE,特別是在Iris圖形上)可能會提供更高的編碼吞吐量。
3)linux和windows皆通用的API。
4)可與Intel實現的OpenCL實現交互。
安裝
linux下
可以安裝基于vaapi開源的MediaSDK
windows下
官方有驅動下載
:https://software.intel.com/media-sdk
樣例
h264解碼
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -f null -
總結:
代碼例: qsv 解碼->overlay->編碼
qsv-test.go