硬件视频加速
硬件视频加速使得显卡能够解码/编码视频,从而减轻 CPU 负担并节省电力。
在 Linux 上实现此目的有几种方法
- 视频加速 API (VA-API) 是一个规范和开源库,由 Intel 开发,用于提供硬件加速视频编码和解码。
- Unix 视频解码与显示 API (VDPAU) 是一个开源库和 API,用于将视频解码过程和视频后处理的部分卸载到 GPU 视频硬件,由 NVIDIA 开发。
- 高级媒体框架 SDK (AMF) 是一个开源框架,它允许“最佳”地访问 AMD GPU 进行多媒体处理,由 AMD 开发。
- NVDEC/NVENC - NVIDIA 专有的硬件视频加速 API,从 Fermi 及更早的 NVIDIA GPU 开始使用。
- Vulkan Video 是 Vulkan 图形 API 的一个扩展,旨在支持硬件加速视频编码和解码。
有关驱动程序和应用程序支持的全面概述,请参阅 #对比表格。
安装
Intel
VA-API
Intel 图形开源驱动程序支持 VA-API
- 从 Broadwell (2014) 及更新的 HD Graphics 系列(例如 Intel Arc)由 intel-media-driver 支持。
- GMA 4500 (2008) 到 Coffee Lake (2017) 由 libva-intel-driver 支持。
- Haswell Refresh 到 Skylake 的 VP9 解码以及 Broadwell 到 Skylake 的混合 VP8 编码由 intel-hybrid-codec-driver-gitAUR 支持。
另请参阅 VAAPI 支持的硬件和功能。
Vulkan Video
ANV 开源 vulkan 驱动程序通过 vulkan-intel 提供 Vulkan Video 支持。
Intel 视频处理库 (Intel VPL)
对于 Intel VPL,请 安装 基础库 libvpl,以及以下至少一个运行时实现
- vpl-gpu-rt:提供对 Tiger Lake 及更新 GPU 的支持
- intel-media-sdk (已弃用):提供对较旧 Intel GPU 的支持
NVIDIA
Nouveau 开源驱动程序支持 VA-API
- GeForce 8 系列及更新的 GPU 直至 GeForce GTX 750 由 mesa 支持。
- 需要 nouveau-fwAUR 固件包,目前从 NVIDIA 二进制驱动程序中提取。
NVIDIA 专有驱动程序支持(通过 nvidia-utils)
- VDPAU 在 GeForce 8 系列及更新的 GPU 上;
- NVDEC 在 Fermi 及更新的 GPU 上 [1];
- NVENC 在 Kepler 及更新的 GPU 上;
- Vulkan Video 在 Pascal 及更新的 GPU 上 [2]。
AMD/ATI
AMD 和 ATI 开源驱动程序通过 mesa 支持 VA-API
- Radeon HD 2000 及更新 GPU 上的 VA-API。
RADV 开源 vulkan 驱动程序通过 vulkan-radeon 提供 Vulkan Video 支持。
- AMF 在 Fiji 及更新 GPU 上,由 amf-amdgpu-proAUR 支持。
转译层
- libvdpau-va-gl — 带有 OpenGL/VAAPI 后端的 VDPAU 驱动程序。仅限 H.264。
- nvidia-vaapi-driver — 一个基于 CUDA NVDEC 的 VA-API 后端。
CUDA_DISABLE_PERF_BOOST=1 来进行解决。验证
您的系统可能开箱即用,无需任何配置。因此,最好从本节开始,看看是否确实如此。
- 使用
mpv --hwdec=auto video_filename命令查看日志,了解更多详情,请参阅 hwdec。mpv 及其命令行支持非常适合测试硬件加速。 - 播放视频时,使用 nvtop 检查顶部行的“DEC”(解码器)使用情况,适用于 AMD、Intel 和 NVIDIA。
- 对于 Intel GPU,使用 intel-gpu-tools 并以 root 身份运行
intel_gpu_top来监控视频播放期间的 GPU 活动。视频条高于 0% 表示 GPU 视频解码器/编码器正在使用。(如果使用了新的 Xe 驱动程序,intel_gpu_top会报错,因此要检查,请运行gputop,vcs 字段(视频命令流式传输器)高于 0% 表示 GPU 视频解码器/编码器正在使用。) - 对于 AMD GPU,使用 radeontop 监控 GPU 活动。与 intel-gpu-tools 不同,目前没有办法在 radeontop 上看到解码/编码使用情况 [3]。
- 对于任何 GPU,您都可以使用 htop 等工具来比较 CPU 使用率。特别是对于更高分辨率的视频(4k+),在启用了 VA-API 且正常工作的情况下,笔记本电脑和其他相对低功耗设备的 CPU 使用率应该会显著降低。
验证 VA-API
通过运行 vainfo 来验证 VA-API 的设置,该命令由 libva-utils 提供
$ 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 驱动程序正在使用,如这一行所示
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.7.3
如果在运行 vainfo 时显示以下错误
libva info: va_openDriver() returns -1 vaInitialize failed with error code -1 (unknown libva error),exit
您需要配置正确的驱动程序,请参阅 #配置 VA-API。
验证 VDPAU
安装 vdpauinfo 来验证 VDPAU 驱动程序是否已正确加载并获取完整的配置报告
$ 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 ...
验证 Vulkan Video
安装 vulkan-tools 并使用 vulkaninfo 来验证视频处理扩展是否可用
$ vulkaninfo | grep VK_KHR_video_
VK_KHR_video_decode_av1 : extension revision 1 VK_KHR_video_decode_h264 : extension revision 9 VK_KHR_video_decode_h265 : extension revision 8 VK_KHR_video_decode_queue : extension revision 8 VK_KHR_video_encode_h264 : extension revision 14 VK_KHR_video_encode_h265 : extension revision 14 VK_KHR_video_encode_queue : extension revision 12 VK_KHR_video_maintenance1 : extension revision 1 VK_KHR_video_queue : extension revision 8
配置
尽管视频驱动程序应自动启用 VA-API 和 VDPAU 的硬件视频加速支持,但可能仍需要手动配置 VA-API/VDPAU。只有在您完成了 #验证 后才继续本节。
默认驱动程序名称(在没有其他配置存在时使用)由系统猜测。然而,它们通常是拼凑而成的,可能无法正常工作。猜测的值会打印在 Xorg 日志文件中,如果是无 root 用户,则为 ~/.local/share/xorg/Xorg.0.log,如果是 root 用户运行 Xorg,则为 /var/log/Xorg.0.log。要搜索日志文件中的相关值
$ grep -iE 'vdpau | dri driver' xorg_log_file
(II) RADEON(0): [DRI2] DRI driver: radeonsi (II) RADEON(0): [DRI2] VDPAU driver: radeonsi
在这种情况下,radeonsi 是 VA-API 和 VDPAU 的默认值。
journalctl -b --grep='vdpau | dri driver'。但这并不代表配置。即使您覆盖了这些值,上面列出的值也不会改变。
配置 VA-API
您可以通过使用 LIBVA_DRIVER_NAME 环境变量来覆盖 VA-API 的驱动程序
- Intel显卡:
- 对于 libva-intel-driver,使用
i965。 - 对于 intel-media-driver,使用
iHD。
- 对于 libva-intel-driver,使用
- NVIDIA
- AMD
- 对于 AMDGPU 驱动程序,使用
radeonsi。
- 对于 AMDGPU 驱动程序,使用
- 您可以在
/usr/lib/dri/中找到已安装的驱动程序。它们用作/usr/lib/dri/${LIBVA_DRIVER_NAME}_drv_video.so。 - 出于兼容性原因,某些驱动程序会安装多次,使用不同的名称。通过运行
sha1sum /usr/lib/dri/* | sort可以查看哪些。 LIBVA_DRIVERS_PATH可用于覆盖 VA-API 驱动程序的路径。- 自 12.0.1 版本起,Mesa 提供
radeonsi而非gallium。
配置 VDPAU
您可以通过使用 VDPAU_DRIVER 环境变量来覆盖 VDPAU 的驱动程序。
正确的驱动程序名称取决于您的设置
- 对于 Intel 图形,您 需要将其设置为
va_gl。 - 对于开源 AMD 驱动程序,设置为
radeonsi。 - 对于开源 Nouveau 驱动程序,设置为
nouveau。 - 对于 NVIDIA 专有版本,设置为
nvidia。
配置 Vulkan Video
- Intel 图形:vulkan-intel 中的 Vulkan Video 支持可以通过
ANV_DEBUG=video-decode,video-encode环境变量来启用。 - AMD:从 Mesa 25 开始,vulkan-radeon 中的 Vulkan Video 支持默认在 VCN 2、3 和 4+ 上启用。要在旧卡上强制启用支持,请将
RADV_PERFTEST环境变量设置为video_decode,video_encode。
配置应用程序
多媒体框架
视频播放器
网页浏览器
多媒体录制/流媒体
故障排除
未能打开 VDPAU 后端
您需要设置 VDPAU_DRIVER 变量来指向正确的驱动程序。请参阅 #配置 VDPAU。
VAAPI 初始化失败
遇到类似 libva: /usr/lib/dri/i965_drv_video.so init failed 的错误。这可能是由于 Wayland 检测不当所致。一种解决方案是取消设置 $DISPLAY,这样 mpv、MPlayer、VLC 等就不会假定它是 X11。另一个 mpv 特定的解决方案是添加参数 --gpu-context=wayland。
如果为硬件安装了错误的 VA-API 驱动程序,也可能出现此错误。
使用 AMDGPU 驱动时的视频解码损坏或失真
当使用 AMDGPU 驱动程序遇到视频解码损坏或失真时,将 allow_rgb10_configs=false 设置为 环境变量。[4]
使用 iHD 时 vainfo 失败
如果您遇到以下错误
$ vainfo
Trying display: wayland Trying display: x11 error: can't connect to X server! Trying display: drm libva error: dlopen of /usr/lib64/dri/iHD_drv_video.so failed: /usr/lib64/dri/iHD_drv_video.so: undefined symbol: _ZN6GmmLib16GmmClientContext9GmmGetAILEv vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel i965 driver for Intel(R) Coffee Lake - 2.4.1 vainfo: Supported profile and entrypoints [...]
尝试安装 intel-media-driver-legacyAUR 而非非传统版本,它与 intel-compute-runtime-legacyAUR 配合使用。[5]
对比表格
VA-API 驱动
| 编解码器 | libva-intel-driver [6] | intel-media-driver [7] | mesa [8] [9] | libva-nvidia-driver (NVDEC 适配器) |
|---|---|---|---|---|
| 解码 | ||||
| MPEG-2 | GMA 4500 到 Ice Lake | Broadwell 及更新版本 | Radeon HD 6000 - Radeon RX 6000 GeForce 8 到 GTX 750 |
请参阅 #仅 NVIDIA 驱动 |
| H.263/MPEG-4 Visual1 | 否 | 否 | Radeon HD 6000 - Radeon RX 6000 | |
| VC-1 | Sandy Bridge 到 Ice Lake | Broadwell 及更新版本 | Radeon HD 2000 - Radeon RX 6000 GeForce 9300 到 GTX 750 | |
| H.264/MPEG-4 AVC | Ironlake 到 Ice Lake | Radeon HD 2000 及更新版本 GeForce 8 到 GTX 750 | ||
| H.265/HEVC 8bit | Cherryview/Braswell 到 Ice Lake | Skylake 及更新版本 | Radeon R9 Fury 及更新版本 | |
| H.265/HEVC 10bit | Broxton 到 Ice Lake | Broxton/Apollo Lake 及更新版本 | Radeon 400 及更新版本 | |
| VP8 | Broadwell 到 Ice Lake | Broadwell 及更新版本 | 否 | |
| VP9 8bit | Broxton 到 Ice Lake 混合:Haswell refresh 到 Skylake2 |
Broxton/Apollo Lake 及更新版本 | Raven Ridge + Radeon RX 5000 及更新版本 | |
| VP9 10bit & 12bit | Kaby Lake 到 Ice Lake | Kaby Lake 及更新版本 | ||
| AV1 8bit & 10bit | 否 | Tiger Lake 及更新版本 | Radeon RX 6600 及更高/更新版本 | |
| 编码 | ||||
| MPEG-2 | Ivy Bridge 到 Ice Lake | Broadwell 及更新版本 不包括 Broxton/Apollo Lake |
否 | 否3 |
| H.264/MPEG-4 AVC | Sandy Bridge 到 Ice Lake | Broadwell 及更新版本 | Radeon HD 7000 及更新版本 | |
| H.265/HEVC 8bit | Skylake 到 Ice Lake | Skylake 及更新版本 | Radeon 400 及更新版本 | |
| H.265/HEVC 10bit | Kaby Lake 到 Ice Lake | Kaby Lake 及更新版本 | Raven Ridge + Radeon RX 5000 及更新版本 | |
| VP8 | Cherryview/Braswell 到 Ice Lake 混合:Haswell 到 Skylake2 |
否 | ||
| VP9 8bit | Kaby Lake 到 Ice Lake | Ice Lake 及更新版本 | ||
| VP9 10bit & 12bit | 否 | |||
| AV1 8bit & 10bit | Alchemist 及更新版本 | Radeon RX 7900 及更高/更新版本 | ||
- MPEG-4 Part 2 默认禁用,因为 VAAPI 的限制。设置 环境变量
VAAPI_MPEG4_ENABLED=true来尝试使用它。 - 混合 VP8 编码器和 VP9 解码器由 intel-hybrid-codec-driver-gitAUR 支持。
- NVIDIA CUDA 适配器编解码器支持正处于积极开发中,易于更改 [10]。
VDPAU 驱动
自 mesa 25.3.0 起,VDPAU 支持已从开源驱动程序中移除。
| 编解码器 | 颜色 位深 |
nvidia-utils | libvdpau-va-gl (VA-API 适配器) |
|---|---|---|---|
| 解码 | |||
| MPEG-2 | 8bit | GeForce 8 及更新版本 | 否 |
| H.263/MPEG-4 Visual | 8bit | GeForce 200 及更新版本 | |
| VC-1 | 8bit | GeForce 8 及更新版本1 | |
| H.264/MPEG-4 AVC | 8bit | GeForce 8 及更新版本 | 请参阅 #VA-API 驱动 |
| H.265/HEVC | 8bit | GeForce 900 及更新版本2 | 否 |
| 10bit | 否3 | ||
| VP9 | 8bit | GeForce 900 及更新版本2 | |
| 10bit/12bit | 否3 | ||
| AV1 | 8bit | GeForce 30 及更新版本4 | |
| 10bit | 否3 | ||
- 除 GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB)。
- 除 GeForce GTX 970 和 GTX 980。
- NVIDIA 实现仅限于 8bit 流 [11] [12]。
- 从驱动版本 510 开始 [13]
仅 NVIDIA 驱动
| 编解码器 | nvidia-utils [14] | |
|---|---|---|
| NVDEC | NVENC | |
| MPEG-2 | Fermi 及更新版本1 | 否 |
| VC-1 | ||
| H.264/MPEG-4 AVC | Kepler 及更新版本2 | |
| H.265/HEVC 8bit | Maxwell (GM206) 及更新版本 | Maxwell (第二代) 及更新版本 |
| H.265/HEVC 10bit | Pascal 及更新版本 | |
| VP8 | Maxwell (第二代) 及更新版本 | 否 |
| VP9 8bit | Maxwell (GM206) 及更新版本 | |
| VP9 10bit & 12bit | Pascal 及更新版本 | |
| AV1 8bit & 10bit | Ampere 及更新版本3 | Ada Lovelace 及更新版本 |
- 不包括 GM108 (不支持)
- 不包括 GM108 和 GP108 (不支持)
- 不包括 A100 (不支持)
应用程序支持
| 应用程序 | 解码 | 编码 | 文档 | |||||
|---|---|---|---|---|---|---|---|---|
| VA-API | VDPAU | NVDEC | Vulkan | VA-API | NVENC | Vulkan | ||
| FFmpeg | 是 | 是 | 是 | 是 | 是 | 是 | 是 | FFmpeg#硬件视频加速 |
| GStreamer | 是 | 否 | 是 | 是 | 是 | 是 | 是 | GStreamer#硬件视频加速 |
| Kodi | 是 | 是 | 否 | 否 | – | – | – | Kodi#硬件视频加速 |
| mpv | 是 | 是 | 是 | 是 | – | – | – | mpv#硬件视频加速 |
| VLC 媒体播放器 | 是 | 是 | 否 | 否 | – | – | – | VLC 媒体播放器#硬件视频加速 |
| MPlayer | 否 | 是 | 否 | 否 | – | – | – | MPlayer#硬件视频加速 |
| Chromium | 是 | 否 | 否 | 否 | 是 | 否 | 否 | Chromium#硬件视频加速 |
| Firefox | 是 | 否 | 否 | 否 | 否 | 否 | 否 | Firefox#硬件视频加速 |
| GNOME/Web | GStreamer | ? | ? | ? | GNOME/Web#视频 | |||