硬件視頻加速
硬件視頻加速讓顯卡進行視頻的解碼和編碼,以減少CPU的負載並節省電力。
Linux 中有多種方式可以實現視頻加速:
- 視頻加速API (Video Acceleration API, 縮寫為VA-API) 是一套 Intel 提供的視頻硬件編解碼的開源庫和標準。
- Unix視頻解碼及演示 API (Video Decode and Presentation API for Unix,縮寫為VDPAU) (VDPAU) 是一套 Nvidia 提供的把部分視頻解碼和後期處理工作轉移到顯卡的開源庫和 API。
- Advanced Media Framework (AMF) 是 AMD 開發的 GPU 開源框架,可以用 AMDGPU PRO 技術棧實現最優的處理。
- NVDEC/NVENC NVIDIA 的 費米、開普勒、Maxwell 和 Pascal 系列顯卡所使用的專有 API。
大致的總覽對比和應用支持,參見頁面下發的比較表格。
安裝[編輯 | 編輯原始碼]
Intel[編輯 | 編輯原始碼]
Intel graphics 開源驅動支持 VA-API:
- Broadwell (~2014) 及之後的 HD Graphics 系列(例如英特爾 Arc 系列顯卡),請使用 intel-media-driver包 。
- GMA 4500 (2008) 到 Coffee Lake (2017) 的 GPU, 請使用 libva-intel-driver包 。
- GMA 4500 H.264 解碼由 libva-intel-driver-g45-h264AUR 提供支持, 參見 Intel 圖形處理器#GMA 4500上的硬件加速 H.264 解碼.
- Haswell Refresh 到 Skylake 的 VP9 解碼,以及 Broadwell 到 Skylake 的混合 VP8 編碼,請使用 intel-hybrid-codec-driver-gitAUR.
- Skylake 及之後的硬件還需要 linux-firmware包.
參閱 VAAPI 支持的硬件和功能。
NVIDIA[編輯 | 編輯原始碼]
Nouveau 開源驅動支持 VA-API 和 VDPAU:
- GeForce 8 到 GeForce GTX 750 的硬件,請使用 libva-mesa-driver包 和 mesa-vdpau包
- 還需要 nouveau-fwAUR 固件包(目前是從NVIDIA二進制驅動解壓出來的)
NVIDIA 專有驅動通過 nvidia-utils包 支持以下硬件:
AMD/ATI[編輯 | 編輯原始碼]
AMDGPU 和 ATI 開源驅動支持 VA-API 和 VDPAU:
- Radeon HD 2000 和更新的 GPU 的 VA-API 由 libva-mesa-driver包 支持
- Radeon R600 和更新的 GPU 的 VDPAU 由 mesa-vdpau包 支持
AMDGPU PRO 專有驅動是基於 AMDGPU 驅動的,所以支持 VA-API、VDPAU 和 AMF。
- Fiji 和更新的 GPUs 通過 amf-amdgpu-proAUR 支持 AMF。
- You may need to force your application to use AMDGPU PRO Vulkan Driver.
- HEVC encoding may not be available on GPUs older than Navi.
翻譯層[編輯 | 編輯原始碼]
- libva-vdpau-driver — VDPAU 作後端的 VA-API.
- https://cgit.freedesktop.org/vaapi/vdpau-driver || libva-vdpau-driver包, libva-vdpau-driver-vp9-gitAUR
- libvdpau-va-gl — OpenGL/VAAPI 做後端的 VDPAU 驅動,僅支持 H.264.
- nvidia-vaapi-driver — CUDA NVDEC 作為後端的 VA-API.
- Series 525 of the NVIDIA driver introduced a regression, breaking VA-API. nvidia-vaapi-driver#126 You may downgrade the drivers to version 520 or use the experimental direct-backend in the meantime.
- The code for libva-vdpau-driver包 has not been touched for years. It causes crash when running VLC or OBS with recent versions of the NVIDIA driver. [2] If you need a translation layer for NVIDIA drivers, use libva-nvidia-driver包 instead.
驗證[編輯 | 編輯原始碼]
你的系統可能可以開箱即用而無需任何其他配置就能完美工作。因此你最好通過如下方法查看是否如此。
- mpv with its command-line support is great for testing hardware acceleration. Look at the log of
mpv --hwdec=auto video_filename
and see hwdec for more details. - For Intel GPU, use intel-gpu-tools包 and run
intel_gpu_top
as root to monitor the GPU activity during video playback for example. The video bar being above 0% indicates GPU video decoder/encoder usage. - Use nvtop包 to check "DEC" (decoder) usage on the top lines while playing a video, for AMD, Intel and NVIDIA.
- For AMD GPU, use radeontop包 to monitor GPU activity. Unlike intel-gpu-tools包, there is currently no way to see decode/encode usage on radeontop包 [3].
- For any GPU, you can compare CPU usage with a tool like htop包. Especially for higher resolution videos (4k+), CPU usage when VA-API is enabled and working should be dramatically lower on laptops and other relatively low-power devices.
檢驗 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
VAEntrypointVLD
指的是你的顯卡能夠解碼這個格式,VAEntrypointEncSlice
指的是你的顯卡可以編碼這個格式。
上面的例子裡,i965
驅動正在運行,所以你可以看見這一行:
libva info: Trying to open /usr/lib/dri/i965_drv_video.so
如果運行 vainfo
的時候出現了下面的錯誤提示:
libva info: va_openDriver() returns -1 vaInitialize failed with error code -1 (unknown libva error),exit
你要重新配置正確的驅動,詳見Hardware video acceleration#Configuring VA-API.
Verifying VDPAU[編輯 | 編輯原始碼]
Install vdpauinfo包 to verify if the VDPAU driver is loaded correctly and retrieve a full report of the configuration:
$ vdpauinfo
display: :0 screen: 0 API version: 1 Information string: G3DVL VDPAU Driver Shared Library version 1.0 Video surface: name width height types ------------------------------------------- 420 16384 16384 NV12 YV12 422 16384 16384 UYVY YUYV 444 16384 16384 Y8U8V8A8 V8U8Y8A8 Decoder capabilities: name level macbs width height ---------------------------------------------------- MPEG1 --- not supported --- MPEG2_SIMPLE 3 9216 2048 1152 MPEG2_MAIN 3 9216 2048 1152 H264_BASELINE 41 9216 2048 1152 H264_MAIN 41 9216 2048 1152 H264_HIGH 41 9216 2048 1152 VC1_SIMPLE 1 9216 2048 1152 VC1_MAIN 2 9216 2048 1152 VC1_ADVANCED 4 9216 2048 1152 ...
配置[編輯 | 編輯原始碼]
Although the video driver should automatically enable hardware video acceleration support for both VA-API and VDPAU, it may be needed to configure VA-API/VDPAU manually. Only continue to this section if you went through #Verification.
The default driver names, used if there is no other configuration present, are guessed by the system. However, they are often hacked together and may not work. The guessed value will be printed in the Xorg log file, which is ~/.local/share/xorg/Xorg.0.log
if rootless, or /var/log/Xorg.0.log
if Xorg is running as root. To search the log file for the values of interest:
$ grep -iE 'vdpau | dri driver' xorg_log_file
(II) RADEON(0): [DRI2] DRI driver: radeonsi (II) RADEON(0): [DRI2] VDPAU driver: radeonsi
In this case radeonsi
is the default for both VA-API and VDPAU.
journalctl -b --grep='vdpau | dri driver'
as root instead.This does not represent the configuration however. The values above will not change even if you override them.
Configuring VA-API[編輯 | 編輯原始碼]
You can override the driver for VA-API by using the LIBVA_DRIVER_NAME
environment variable:
- Intel graphics:
- For libva-intel-driver包 use
i965
. - For intel-media-driver包 use
iHD
.
- For libva-intel-driver包 use
- NVIDIA:
- AMD:
- For AMDGPU driver use
radeonsi
.
- For AMDGPU driver use
- You can find the installed drivers in
/usr/lib/dri/
. They are used as/usr/lib/dri/${LIBVA_DRIVER_NAME}_drv_video.so
. - Some drivers are installed several times under different names for compatibility reasons. You can see which by running
sha1sum /usr/lib/dri/* | sort
. LIBVA_DRIVERS_PATH
can be used to overrule the VA-API drivers location.- Since version 12.0.1 libva-mesa-driver包 provides
radeonsi
instead ofgallium
.
Configuring VDPAU[編輯 | 編輯原始碼]
You can override the driver for VDPAU by using the VDPAU_DRIVER
environment variable.
The correct driver name depends on your setup:
- For Intel graphics you need to set it to
va_gl
. - For the open source AMD driver set it to the proper driver version depending on your GPU, see #Verification.
- For the open source Nouveau driver set it to
nouveau
. - For NVIDIA's proprietary version set it to
nvidia
.
- You can find the installed drivers in
/usr/lib/vdpau/
. They are used as/usr/lib/vdpau/libvdpau_${VDPAU_DRIVER}.so
. - Some drivers are installed several times under different names for compatibility reasons. You can see which by running
sha1sum /usr/lib/vdpau/*
. - For hybrid setups (both NVIDIA and AMD), it may be necessary to set the
DRI_PRIME
environment variable. For more information see PRIME.
Configuring applications[編輯 | 編輯原始碼]
Multimedia frameworks:
Video players:
- Kodi#Hardware video acceleration
- MPlayer#Hardware video acceleration
- mpv#Hardware video acceleration
- VLC media player#Hardware video acceleration
Web browsers:
Multimedia recording/streaming:
Troubleshooting[編輯 | 編輯原始碼]
Failed to open VDPAU backend[編輯 | 編輯原始碼]
You need to set VDPAU_DRIVER
variable to point to correct driver. See #Configuring VDPAU.
VAAPI init failed[編輯 | 編輯原始碼]
An error along the lines of libva: /usr/lib/dri/i965_drv_video.so init failed
is encountered. This can happen because of improper detection of Wayland. One solution is to unset $DISPLAY
so that mpv, MPlayer, VLC, etc. do not assume it is X11. Another mpv-specific solution is to add the parameter --gpu-context=wayland
.
This error can also occur if you installed the wrong VA-API driver for your hardware.
Video decoding corruption or distortion with AMDGPU driver[編輯 | 編輯原始碼]
When experiencing video decoding corruption or distortion with AMDGPU driver, set allow_rgb10_configs=false
as environment variable or driconf
. [4]
Comparison tables[編輯 | 編輯原始碼]
VA-API drivers[編輯 | 編輯原始碼]
Codec | libva-intel-driver包 [5] | intel-media-driver包 [6] | libva-mesa-driver包 [7] [8] | libva-vdpau-driver包 (VDPAU adapter) |
libva-nvidia-driver包 (NVDEC adapter) |
---|---|---|---|---|---|
Decoding | |||||
MPEG-2 | GMA 4500 and newer | Broadwell and newer | Radeon HD 6000 and newer GeForce 8 and newer1 |
See #VDPAU drivers | See #NVIDIA driver only |
H.263/MPEG-4 Visual4 | 否 | 否 | Radeon HD 6000 and newer | ||
VC-1 | Sandy Bridge and newer | Broadwell and newer | Radeon HD 2000 and newer GeForce 9300 and newer1 | ||
H.264/MPEG-4 AVC | GMA 45002, Ironlake and newer | Radeon HD 2000 and newer GeForce 8 and newer1 | |||
H.265/HEVC 8bit | Cherryview/Braswell and newer | Skylake and newer | Radeon R9 Fury and newer | ||
H.265/HEVC 10bit | Broxton and newer | Broxton/Apollo Lake and newer | Radeon 400 and newer | ||
VP8 | Broadwell and newer | Broadwell and newer | 否 | 否 | |
VP9 8bit | Broxton and newer Hybrid: Haswell refresh to Skylake3 |
Broxton/Apollo Lake and newer | Raven Ridge + Radeon RX 5000 and newer | See #VDPAU drivers5 | |
VP9 10bit & 12bit | Kaby Lake and newer | Kaby Lake and newer | 否 | ||
AV1 8bit & 10bit | 否 | Tiger Lake and newer | Radeon RX 6600 and higher/newer | ||
Encoding | |||||
MPEG-2 | Ivy Bridge and newer | Broadwell and newer except Broxton/Apollo Lake |
否 | – | 否6 |
H.264/MPEG-4 AVC | Sandy Bridge and newer | Broadwell and newer | Radeon HD 7000 and newer | ||
H.265/HEVC 8bit | Skylake and newer | Skylake and newer | Radeon 400 and newer | ||
H.265/HEVC 10bit | Kaby Lake and newer | Kaby Lake and newer | Raven Ridge + Radeon RX 5000 and newer | ||
VP8 | Cherryview/Braswell and newer Hybrid: Haswell to Skylake3 |
否 | |||
VP9 8bit | Kaby Lake and newer | Icelake and newer | |||
VP9 10bit & 12bit | 否 | ||||
AV1 8bit & 10bit | Alchemist and newer | Radeon RX 7900 and higher/newer |
- 1 Up until GeForce GTX 750.
- 2 Supported by libva-intel-driver-g45-h264AUR instead.
- 3 Hybrid VP8 encoder and VP9 decoder supported by intel-hybrid-codec-driver-gitAUR.
- 4 MPEG-4 Part 2 is disabled by default due to VAAPI limitations. Set the environment variable
VAAPI_MPEG4_ENABLED=true
to try to use it anyway. - 5 Experimental VP9 support provided by libva-vdpau-driver-vp9-gitAUR instead.
- 6 NVIDIA CUDA adapter codec support is in active development and susceptible to change [9].
VDPAU drivers[編輯 | 編輯原始碼]
Codec | Color depth |
mesa-vdpau包 [10] [11] | nvidia-utils包 | libvdpau-va-gl包 (VA-API adapter) |
---|---|---|---|---|
Decoding | ||||
MPEG-2 | 8bit | Radeon R600 and newer GeForce 8 and newer1 |
GeForce 8 and newer | 否 |
H.263/MPEG-4 Visual | 8bit | Radeon HD 6000 and newer GeForce 200 and newer1 |
GeForce 200 and newer | |
VC-1 | 8bit | Radeon HD 2000 and newer GeForce 9300 and newer1 |
GeForce 8 and newer2 | |
H.264/MPEG-4 AVC | 8bit | Radeon HD 2000 and newer GeForce 8 and newer1 |
GeForce 8 and newer | See #VA-API drivers |
H.265/HEVC | 8bit | Radeon R9 Fury and newer | GeForce 900 and newer3 | 否 |
10bit | Radeon 400 and newer | 否4 | ||
VP9 | 8bit | Raven Ridge + Radeon RX 5000 and newer | GeForce 900 and newer3 | |
10bit/12bit | 否4 | |||
AV1 | 8bit | Radeon RX 6600 and higher/newer | GeForce 30 and newer5 | |
10bit | 否4 |
- 1 Up until GeForce GTX 750.
- 2 Except GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB).
- 3 Except GeForce GTX 970 and GTX 980.
- 4 NVIDIA implementation is limited to 8bit streams [12] [13].
- 5 Starting with driver version 510.[14]
NVIDIA driver only[編輯 | 編輯原始碼]
Codec | nvidia-utils包 [15] | |
---|---|---|
NVDEC | NVENC | |
MPEG-2 | Fermi and newer1 | 否 |
VC-1 | ||
H.264/MPEG-4 AVC | Kepler and newer2 | |
H.265/HEVC 8bit | Maxwell (GM206) and newer | Maxwell (2nd Gen) and newer |
H.265/HEVC 10bit | Pascal and newer | |
VP8 | Maxwell (2nd Gen) and newer | 否 |
VP9 8bit | Maxwell (GM206) and newer | |
VP9 10bit & 12bit | Pascal and newer | |
AV1 8bit & 10bit | Ampere and newer3 | Ada Lovelace and newer |
- 1 Except GM108 (not supported)
- 2 Except GM108 and GP108 (not supported)
- 3 Except A100 (not supported)
Application support[編輯 | 編輯原始碼]
Application | Decoding | Encoding | Documentation | |||
---|---|---|---|---|---|---|
VA-API | VDPAU | NVDEC | VA-API | NVENC | ||
FFmpeg | 是 | 是 | 是 | 是 | 是 | FFmpeg#Hardware video acceleration |
GStreamer | 是 | 否 | 是 | 是 | 是 | GStreamer#Hardware video acceleration |
Kodi | 是 | 是 | 否 | – | – | Kodi#Hardware video acceleration |
mpv | 是 | 是 | 是 | – | – | mpv#Hardware video acceleration |
VLC media player | 是 | 是 | 否 | – | – | VLC media player#Hardware video acceleration |
MPlayer | 是1 | 是 | 否 | – | – | MPlayer#Hardware video acceleration |
Flash | 否2 | 是2 | 否 | – | – | Browser plugins#Adobe Flash Player |
Chromium | 是 | 否 | 否 | 是 | 否 | Chromium#Hardware video acceleration |
Firefox | 是 | 否 | 否 | 否 | 否 | Firefox#Hardware video acceleration |
GNOME/Web | GStreamer | ? | ? | GNOME/Web#Video |
- 1 VA-API support provided by mplayer-vaapiAUR instead.
- 2 VDPAU is supported only by NPAPI plugin. PPAPI plugin to NPAPI browser experimental adapter is available that provides partial VA-API and VDPAU acceleration.