硬件视频加速

来自 ArchWiki

此文章或章节需要扩充。

原因: 添加 Vulkan Video。(在Talk:Hardware video acceleration中讨论)

硬件视频加速 使显卡能够解码/编码视频,从而减轻 CPU 负担并节省功耗。

在 Linux 上有几种方法可以实现这一点

  • 视频加速 API (VA-API) 是由 Intel 开发的规范和开源库,用于提供硬件加速的视频编码和解码。
  • Unix 视频解码和呈现 API (VDPAU) 是一个开源库和 API,用于将视频解码过程和视频后处理的部分工作交给 GPU 视频硬件来完成,由 NVIDIA 开发。
  • 高级媒体框架 SDK (AMF) 是一个开源框架,允许使用 AMDGPU PRO 堆栈“最佳”访问 AMD GPU 进行多媒体处理,由 AMD 开发。
  • NVDEC/NVENC - NVIDIA 用于硬件视频加速的专有 API,从 Fermi 及更高版本的 NVIDIA GPU 开始使用。

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

安装

Intel

Intel 显卡 开源驱动程序支持 VA-API

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

NVIDIA

Nouveau 开源驱动程序同时支持 VA-API 和 VDPAU

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

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

AMD/ATI

AMDATI 开源驱动程序通过 mesa 同时支持 VA-API 和 VDPAU

  • VA-API 在 Radeon HD 2000 和更新的 GPU 上。
  • VDPAU 在 Radeon R600 和更新的 GPU 上。

AMDGPU PRO 专有驱动程序构建于 AMDGPU 驱动程序之上,除了 AMF 外,还支持 VA-API 和 VDPAU。

注意
  • 您可能需要强制您的应用程序使用 AMDGPU PRO Vulkan 驱动程序。
  • 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
注意: NVIDIA 驱动程序的 525 及更高版本引入了回归错误,破坏了 VA-API。请使用direct-backend

验证

您的系统可能无需任何配置即可完美运行。因此,最好从本节开始,看看情况是否如此。

提示
  • 具有命令行支持的 mpv 非常适合测试硬件加速。查看 mpv --hwdec=auto video_filename 的日志,并参阅 hwdec 了解更多详情。
  • 使用 nvtop 在播放视频时检查顶部行的 “DEC”(解码器)使用率,适用于 AMD、Intel 和 NVIDIA。
  • 对于 Intel GPU,使用 intel-gpu-tools 并以 root 身份运行 intel_gpu_top 以监控视频播放期间的 GPU 活动。视频栏高于 0% 表示 GPU 视频解码器/编码器的使用率。
  • 对于 AMD GPU,使用 radeontop 监控 GPU 活动。与 intel-gpu-tools 不同,目前无法在 radeontop 上查看解码/编码使用率 [2]
  • 对于任何 GPU,您都可以使用像 htop 这样的工具比较 CPU 使用率。特别是对于更高分辨率的视频(4k+),当 VA-API 启用并工作时,笔记本电脑和其他相对低功耗设备上的 CPU 使用率应该会显著降低。

验证 VA-API

通过运行 vainfo 验证 VA-API 的设置,vainfolibva-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
...

配置

虽然视频驱动程序应自动为 VA-API 和 VDPAU 启用硬件视频加速支持,但可能需要手动配置 VA-API/VDPAU。如果您已经完成了 #验证,请继续本节。

默认驱动程序名称(如果不存在其他配置)由系统猜测。但是,它们通常是临时拼凑的,可能无法工作。猜测的值将打印在 Xorg 日志文件中,如果无根运行,则为 ~/.local/share/xorg/Xorg.0.log,如果 Xorg 以 root 身份运行,则为 /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 驱动程序的位置。
  • 自 Mesa 12.0.1 版本起,Mesa 提供 radeonsi 而不是 gallium

配置 VDPAU

您可以使用 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

配置应用程序

多媒体框架

视频播放器

Web 浏览器

多媒体录制/流媒体

故障排除

无法打开 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 设置为环境变量[3]

对比表格

VA-API 驱动

编解码器 libva-intel-driver [4] intel-media-driver [5] mesa [6] [7] libva-nvidia-driver
(NVDEC 适配器)
解码
MPEG-2 GMA 4500 及更新 Broadwell 及更新 Radeon HD 6000 及更新
GeForce 8 及更新1
请参阅 #仅 NVIDIA 驱动
H.263/MPEG-4 Visual4 Radeon HD 6000 及更新
VC-1 Sandy Bridge 及更新 Broadwell 及更新 Radeon HD 2000 及更新
GeForce 9300 及更新1
H.264/MPEG-4 AVC GMA 45002、Ironlake 及更新 Radeon HD 2000 及更新
GeForce 8 及更新1
H.265/HEVC 8bit Cherryview/Braswell 及更新 Skylake 及更新 Radeon R9 Fury 及更新
H.265/HEVC 10bit Broxton 及更新 Broxton/Apollo Lake 及更新 Radeon 400 及更新
VP8 Broadwell 及更新 Broadwell 及更新
VP9 8bit Broxton 及更新
混合:Haswell refresh 到 Skylake3
Broxton/Apollo Lake 及更新 Raven Ridge + Radeon RX 5000 及更新
VP9 10bit & 12bit Kaby Lake 及更新 Kaby Lake 及更新
AV1 8bit & 10bit Tiger Lake 及更新 Radeon RX 6600 及更高版本/更新版本
编码
MPEG-2 Ivy Bridge 及更新 Broadwell 及更新
Broxton/Apollo Lake 除外
5
H.264/MPEG-4 AVC Sandy Bridge 及更新 Broadwell 及更新 Radeon HD 7000 及更新
H.265/HEVC 8bit Skylake 及更新 Skylake 及更新 Radeon 400 及更新
H.265/HEVC 10bit Kaby Lake 及更新 Kaby Lake 及更新 Raven Ridge + Radeon RX 5000 及更新
VP8 Cherryview/Braswell 及更新
混合:Haswell 到 Skylake3
VP9 8bit Kaby Lake 及更新 Ice Lake 及更新
VP9 10bit & 12bit
AV1 8bit & 10bit Alchemist 及更新 Radeon RX 7900 及更高版本/更新版本
  1. 直到 GeForce GTX 750。
  2. libva-intel-driver-g45-h264AUR 代替支持。
  3. 混合 VP8 编码器和 VP9 解码器由 intel-hybrid-codec-driver-gitAUR 支持。
  4. 由于 VAAPI 限制,默认情况下禁用 MPEG-4 Part 2。设置环境变量 VAAPI_MPEG4_ENABLED=true 以尝试使用它。
  5. NVIDIA CUDA 适配器编解码器支持正在积极开发中,可能会发生变化 [8]

VDPAU 驱动

编解码器 颜色
深度
mesa [9] [10] nvidia-utils libvdpau-va-gl
(VA-API 适配器)
解码
MPEG-2 8bit Radeon R600 及更新
GeForce 8 及更新1
GeForce 8 及更新
H.263/MPEG-4 Visual 8bit Radeon HD 6000 及更新
GeForce 200 及更新1
GeForce 200 及更新
VC-1 8bit Radeon HD 2000 及更新
GeForce 9300 及更新1
GeForce 8 及更新2
H.264/MPEG-4 AVC 8bit Radeon HD 2000 及更新
GeForce 8 及更新1
GeForce 8 及更新 请参阅 #VA-API 驱动
H.265/HEVC 8bit Radeon R9 Fury 及更新 GeForce 900 及更新3
10bit Radeon 400 及更新 4
VP9 8bit Raven Ridge + Radeon RX 5000 及更新 GeForce 900 及更新3
10bit/12bit 4
AV1 8bit Radeon RX 6600 及更高版本/更新版本 GeForce 30 及更新5
10bit 4
  1. 直到 GeForce GTX 750。
  2. 除了 GeForce 8800 Ultra、8800 GTX、8800 GTS (320/640 MB)。
  3. 除了 GeForce GTX 970 和 GTX 980。
  4. NVIDIA 实现仅限于 8bit 流 [11] [12]
  5. 从驱动程序版本 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 (2nd Gen) 及更新
H.265/HEVC 10bit Pascal 及更新
VP8 Maxwell (2nd Gen) 及更新
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 VA-API NVENC
FFmpeg FFmpeg#硬件视频加速
GStreamer GStreamer#硬件视频加速
Kodi Kodi#硬件视频加速
mpv mpv#硬件视频加速
VLC 媒体播放器 VLC 媒体播放器#硬件视频加速
MPlayer MPlayer#硬件视频加速
Flash 1 1 Browser plugins#Adobe Flash Player
Chromium Chromium#硬件视频加速
Firefox Firefox#硬件视频加速
GNOME/Web GStreamer ? ? GNOME/Web#视频
  1. VDPAU 仅受 NPAPI 插件支持。PPAPI 插件到 NPAPI 浏览器实验性适配器可用,它提供部分 VA-API 和 VDPAU 加速。