跳转至内容

硬件视频加速

来自 ArchWiki
(从 视频加速 重定向而来)


硬件视频加速使得显卡能够解码/编码视频,从而减轻 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 VideoVulkan 图形 API 的一个扩展,旨在支持硬件加速视频编码和解码。

有关驱动程序和应用程序支持的全面概述,请参阅 #对比表格

安装

Intel

VA-API

Intel 图形开源驱动程序支持 VA-API

注意 Skylake 或更高版本还需要 linux-firmware-intel

另请参阅 VAAPI 支持的硬件和功能

Vulkan Video

ANV 开源 vulkan 驱动程序通过 vulkan-intel 提供 Vulkan Video 支持。

注意 启用 Vulkan Video 需要额外的配置,请参阅 #配置 Vulkan Video

Intel 视频处理库 (Intel VPL)

对于 Intel VPL,请 安装 基础库 libvpl,以及以下至少一个运行时实现

NVIDIA

Nouveau 开源驱动程序支持 VA-API

  • GeForce 8 系列及更新的 GPU 直至 GeForce GTX 750 由 mesa 支持。
  • 需要 nouveau-fwAUR 固件包,目前从 NVIDIA 二进制驱动程序中提取。

NVIDIA 专有驱动程序支持(通过 nvidia-utils

AMD/ATI

AMD 和 ATI 开源驱动程序通过 mesa 支持 VA-API

  • Radeon HD 2000 及更新 GPU 上的 VA-API。

RADV 开源 vulkan 驱动程序通过 vulkan-radeon 提供 Vulkan Video 支持。

本文或本章节已过时。

原因: AMD 媒体框架的最新版本不再需要开源驱动程序的专有附加组件,但 AUR 包未得到更新,也没有上传依赖于开源 AMDGPU 驱动程序的新 amf 包。(在 Talk:Hardware video acceleration 中讨论)
  • HEVC 编码在早于 Navi 的 GPU 上可能不可用。

转译层

  • libvdpau-va-gl — 带有 OpenGL/VAAPI 后端的 VDPAU 驱动程序。仅限 H.264。
https://github.com/i-rinat/libvdpau-va-gl || libvdpau-va-gl
  • nvidia-vaapi-driver — 一个基于 CUDA NVDEC 的 VA-API 后端。
https://github.com/elFarto/nvidia-vaapi-driver/ || libva-nvidia-driver
注意 虽然 libva-nvidia-driver 实现启用了硬件视频解码,但 NVIDIA 电源管理的当前限制意味着,在默认设置下,它实际上比 CPU 视频解码消耗更多电力。可以使用 NVIDIA 驱动程序版本 580.105.08 或更高版本,导出环境变量 CUDA_DISABLE_PERF_BOOST=1 来进行解决。

验证

您的系统可能开箱即用,无需任何配置。因此,最好从本节开始,看看是否确实如此。

提示
  • 使用 mpv --hwdec=auto video_filename 命令查看日志,了解更多详情,请参阅 hwdecmpv 及其命令行支持非常适合测试硬件加速。
  • 播放视频时,使用 nvtop 检查顶部行的“DEC”(解码器)使用情况,适用于 AMD、Intel 和 NVIDIA。
  • 对于 Intel GPU,使用 intel-gpu-tools 并以 root 身份运行 intel_gpu_top 来监控视频播放期间的 GPU 活动。视频条高于 0% 表示 GPU 视频解码器/编码器正在使用。(如果使用了新的 Xe 驱动程序intel_gpu_top 会报错,因此要检查,请运行 gputopvcs 字段(视频命令流式传输器)高于 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

配置

本文或本章节的准确性存在争议。

原因: 非常以 Xorg 为中心:如何判断哪个值是“猜测”的值在 Wayland 上?如果读者被期望遵循上一节,这个步骤是否还有必要?(在 Talk:Hardware video acceleration 中讨论)

尽管视频驱动程序应自动启用 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 的默认值。

注意 如果您使用 GDM,请改用 root 身份运行 journalctl -b --grep='vdpau | dri driver'

但这并不代表配置。即使您覆盖了这些值,上面列出的值也不会改变。

配置 VA-API

您可以通过使用 LIBVA_DRIVER_NAME 环境变量来覆盖 VA-API 的驱动程序

  • 您可以在 /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

本文或本章节已过时。

原因: mesa 25.3.0 移除了对开源驱动程序的支持。关于开源驱动程序的说明需要调整为仅讨论 libvdpau-va-gl 或直接移除。(在 Talk:Hardware video acceleration 中讨论)

您可以通过使用 VDPAU_DRIVER 环境变量来覆盖 VDPAU 的驱动程序。

正确的驱动程序名称取决于您的设置

  • 对于 Intel 图形,您 需要将其设置为 va_gl
  • 对于开源 AMD 驱动程序,设置为 radeonsi
  • 对于开源 Nouveau 驱动程序,设置为 nouveau
  • 对于 NVIDIA 专有版本,设置为 nvidia
  • 您可以在 /usr/lib/vdpau/ 中找到已安装的驱动程序。它们用作 /usr/lib/vdpau/libvdpau_${VDPAU_DRIVER}.so
  • 出于兼容性原因,某些驱动程序会安装多次,使用不同的名称。通过运行 sha1sum /usr/lib/vdpau/* 可以查看哪些。
  • 对于混合设置(同时拥有 NVIDIA 和 AMD),可能需要设置 DRI_PRIME 环境变量。有关更多信息,请参阅 PRIME

配置 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
警告

请注意,一些较旧的 GPU 型号在 Mesa 中没有 Vulkan Video 支持。在这些 GPU 上强制启用 Vulkan Video 支持可能导致某些应用程序(例如 mpv)崩溃。

配置应用程序

多媒体框架

视频播放器

网页浏览器

多媒体录制/流媒体

故障排除

未能打开 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 及更高/更新版本
  1. MPEG-4 Part 2 默认禁用,因为 VAAPI 的限制。设置 环境变量 VAAPI_MPEG4_ENABLED=true 来尝试使用它。
  2. 混合 VP8 编码器和 VP9 解码器由 intel-hybrid-codec-driver-gitAUR 支持。
  3. 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
  1. GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB)。
  2. 除 GeForce GTX 970 和 GTX 980。
  3. NVIDIA 实现仅限于 8bit 流 [11] [12]
  4. 从驱动版本 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 及更新版本
  1. 不包括 GM108 (不支持)
  2. 不包括 GM108 和 GP108 (不支持)
  3. 不包括 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#视频