硬件视频加速
硬件视频加速 使视频卡能够解码/编码视频,从而减轻 CPU 负担并节省电量。
在 Linux 上有几种方法可以实现这一点
- 视频加速 API (VA-API) 是一个规范和开源库,用于提供硬件加速的视频编码和解码,由 Intel 开发。
- Unix 视频解码和呈现 API (VDPAU) 是一个开源库和 API,用于将视频解码过程和视频后处理的部分卸载到 GPU 视频硬件,由 NVIDIA 开发。
- 高级媒体框架 SDK (AMF) 是一个开源框架,允许“最优”访问 AMD GPU,以便使用 AMDGPU PRO 堆栈进行多媒体处理,由 AMD 开发。
- NVDEC/NVENC - NVIDIA 的专有 API,用于硬件视频加速,供 Fermi 及更高版本的 NVIDIA GPU 使用。
有关驱动程序和应用程序支持的全面概述,请参阅 #对比表格。
安装
英特尔
Intel 显卡 开源驱动程序支持 VA-API
- 从 Broadwell (2014 年) 及更新型号(例如 Intel Arc)开始的 HD Graphics 系列受 intel-media-driver 支持。
- GMA 4500 (2008) 到 Coffee Lake (2017) 受 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 支持的硬件和功能。
英伟达
Nouveau 开源驱动程序同时支持 VA-API 和 VDPAU
- GeForce 8 系列和更新的 GPU,直到 GeForce GTX 750,都受 mesa 支持。
- 需要 nouveau-fwAUR 固件包,目前从 NVIDIA 二进制驱动程序中提取。
NVIDIA 专有驱动程序通过 nvidia-utils 提供支持
- VDPAU 在 GeForce 8 系列 和更新的 GPU 上;
- NVDEC 在 Fermi 和更新的 GPU 上 [1];
- NVENC 在 Kepler 和更新的 GPU 上。
AMD/ATI
AMD 和 ATI 开源驱动程序通过 mesa 同时支持 VA-API 和 VDPAU
- VA-API 在 Radeon HD 2000 和更新的 GPU 上。
- VDPAU 在 Radeon R600 和更新的 GPU 上。
AMDGPU PRO 专有驱动程序构建于 AMDGPU 驱动程序之上,除了 AMF 外,还支持 VA-API 和 VDPAU。
- AMF 在 Fiji 和更新的 GPU 上受 amf-amdgpu-proAUR 支持。
- 您可能需要强制您的应用程序使用 AMDGPU PRO Vulkan 驱动程序。
- HEVC 编码可能在早于 Navi 的 GPU 上不可用。
转译层
- libvdpau-va-gl — 带有 OpenGL/VAAPI 后端的 VDPAU 驱动程序。仅限 H.264。
- nvidia-vaapi-driver — 基于 CUDA NVDEC 的 VA-API 后端。
验证
您的系统可能无需任何配置即可完美运行。因此,最好从本节开始,看看是否是这种情况。
- 带有命令行支持的 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 的设置,该命令由 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 ...
配置
尽管视频驱动程序应自动为 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 的默认值。
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,请使用
- 英伟达
- 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
。
配置应用程序
多媒体框架
视频播放器
网页浏览器
多媒体录制/流媒体
故障排除
未能打开 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 及更高型号/更新型号 |
- 直到 GeForce GTX 750。
- 由 libva-intel-driver-g45-h264AUR 支持。
- 混合 VP8 编码器和 VP9 解码器由 intel-hybrid-codec-driver-gitAUR 支持。
- 由于 VAAPI 限制,MPEG-4 Part 2 默认禁用。设置环境变量
VAAPI_MPEG4_ENABLED=true
以尝试使用它。 - 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 |
- 直到 GeForce GTX 750。
- Except GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB)。
- Except GeForce GTX 970 和 GTX 980。
- NVIDIA 实现仅限于 8 位流 [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 | VA-API | NVENC | ||
FFmpeg | 是 | 是 | 是 | 是 | 是 | FFmpeg#硬件视频加速 |
GStreamer | 是 | 否 | 是 | 是 | 是 | GStreamer#硬件视频加速 |
Kodi | 是 | 是 | 否 | – | – | Kodi#硬件视频加速 |
mpv | 是 | 是 | 是 | – | – | mpv#硬件视频加速 |
VLC 媒体播放器 | 是 | 是 | 否 | – | – | VLC 媒体播放器#硬件视频加速 |
MPlayer | 否 | 是 | 否 | – | – | MPlayer#硬件视频加速 |
Flash | 否1 | 是1 | 否 | – | – | 浏览器插件#Adobe Flash Player |
Chromium | 是 | 否 | 否 | 是 | 否 | Chromium#硬件视频加速 |
Firefox | 是 | 否 | 否 | 否 | 否 | Firefox#硬件视频加速 |
GNOME/Web | GStreamer | ? | ? | GNOME/Web#视频 |
- VDPAU 仅受 NPAPI 插件支持。 PPAPI 插件到 NPAPI 浏览器实验性适配器可用,它提供部分 VA-API 和 VDPAU 加速。