Hardware video acceleration (简体中文)
硬件视频加速 让显卡进行视频的解码和编码,以减少CPU的负载并节省电力。
Linux 中有多种方式可以实现视频加速:
- 视频加速API (Video Acceleration API, 缩写为VA-API) 是一套 Intel 提供的视频硬件编解码的开源库和标准。
- Unix视频解码及演示 API (Video Decode and Presentation API for Unix,缩写为VDPAU) (VDPAU) 是一套 Nvidia 提供的把部分视频解码和后期处理工作转移到显卡的开源库和 API。
- NVDECODE/NVENCODE NVIDIA 的 费米、开普勒、Maxwell 和 Pascal 系列显卡所使用的专有 API。
对于2007年以前的显卡,参见XvMC。大致的总览对比和应用支持,参见#支持的格式和#支持的软件。
安装
Intel
Intel graphics 开源驱动支持 VA-API:
- HD Graphics 系列自从 Broadwell (~2015) 开始由 intel-media-driver 提供支持
- GMA 4500 系列 和更新的 GPU 直到 Coffee Lake 由 libva-intel-driver 提供支持
- GMA 4500 H.264 解码由 libva-intel-driver-g45-h264AUR 提供支持, 参见 Intel#Hardware accelerated H.264 decoding on GMA 4500.
- Broadwell 到 Skylake 的 VP9 解码和 Haswell 到 Skylake 的混合 VP8 编码由 intel-hybrid-codec-driverAUR提供支持。 VP9 decoding on Haswell crashes.
NVIDIA
Nouveau 开源驱动支持 VA-API 和 VDPAU:
- GeForce 8 系列和更新的 GPU 直到 GeForce GTX 750 由 libva-mesa-driver 和 mesa-vdpau 提供支持
- Requires nouveau-fwAUR 固件包(直接从NVIDIA二进制驱动解压出来的)
NVIDIA 专有驱动通过 nvidia-utils 支持以下:
- GeForce 8 系列和更新的 GPU 的 VDPAU;
- Fermi 和更新的 GPU 的 NVDECODE [1];
- Kepler 和更新的 GPU 的 NVENCODE
ATI/AMD
ATI 和 AMDGPU 开源驱动支持 VA-API 和 VDPAU:
- Radeon HD 2000 和更新的 GPU 的 VA-API 由 libva-mesa-driver 支持
- Radeon R300 和更新的 GPU 的 VDPAU 由 mesa-vdpau 支持
AMDGPU PRO 专有驱动是基于 AMDGPU 驱动的,所以支持 VA-API 和 VDPAU。
翻译层
如果设备驱动不支持 VA-API,可以通过以下方式来曲线救国:
- libva-vdpau-driver – VDPAU 作后端的 VA-API.
- libva-vdpau-driver-chromiumAUR – VDPAU 作后端的 VA-API,为 Chromium 做了适配
如果设备驱动不支持 VDPAU,可以这样曲线救国:
- libvdpau-va-gl – VA-API 作后端的 VDPAU,仅提供 H.264 支持.
Verification
Your system may work perfectly out-of-the-box without needing any configuration. Therefore it is a good idea to start with this section to see that it is the case.
检验 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 ..
支持的硬件
VA-API
开源驱动:
- AMD: 位于官方软件仓库的libva-vdpau-driver和mesa两者为 Radeon 9500 或更新的GPU提供支持。
- Intel: 位于官方软件仓库的libva-intel-driver软件包为 GMA 4500 系列或者更新的GPU提供支持。
- NVIDIA: 位于官方软件仓库的libva-vdpau-driver和mesa两者为 GeForce 8 系列和更新的GPU提供支持。位于AUR的 nouveau-fwAUR 软件包包含从NVIDIA闭源驱动中提取出的必要的固件文件。
闭源驱动:
- NVIDIA: 位于官方软件仓库的libva-vdpau-driver软件包和 nvidia-utils 驱动为 GeForce 8 系列或更新的GPU提供支持。
VDPAU
开源驱动:
- AMD: 位于官方软件仓库的 mesa-vdpau 软件包为 Radeon 9500 或更新的GPU提供支持。
- Intel: 位于官方软件仓库的libvdpau-va-gl和libva-intel-driver这两个软件包为 GMA 4500 系列或者更新的GPU提供支持。
- NVIDIA: 位于官方软件仓库的 mesa-vdpau 软件包为 GeForce 8 系列和更新的GPU提供支持。位于AUR的 nouveau-fwAUR 软件包包含从NVIDIA闭源驱动中提取出的必要的固件 。
闭源驱动:
- NVIDIA: 位于官方软件仓库的nvidia-utils软件包为 GeForce 400 系列或更新的GPU提供支持。
- GeForce 8/9 和 GeForce 100-300 系列由 nvidia-340xx-utilsAUR 软件包支持。
支持表
VA-API驱动
Codec | libva-intel-driver [2] | intel-media-driver [3] | libva-mesa-driver [4] [5] |
libva-vdpau-driver (VDPAU adapter) |
libva-nvidia-driverAUR (NVDECODE adapter) |
---|---|---|---|---|---|
Decoding | |||||
MPEG-2 | GMA 4500 及更新 | Broadwell 及更新 | Radeon HD 6000 及更新 GeForce 8 及更新1 |
See #VDPAU drivers | See #NVIDIA driver only |
H.263/MPEG-4 Visual4 | No | No | Radeon HD 6000 及更新 | No6 | |
VC-1 | Sandy Bridge 及更新 | Broadwell 及更新 | Radeon HD 2000 及更新 GeForce 9300 及更新1 |
See #NVIDIA driver only | |
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 及更新 | No6 | |
VP8 | Broadwell 及更新 | Broadwell 及更新 | No | No | See #NVIDIA driver only |
VP9 8bit | Broxton and newer Hybrid: Haswell refresh to Skylake3 |
Broxton/Apollo Lake 及更新 | Raven Ridge 及更新 | See #VDPAU drivers5 | |
VP9 10bit | Kaby Lake 及更新 | Kaby Lake 及更新 | No | No6 | |
AV1 8-bit & 10-bit | No | Tiger Lake 及更新 | Radeon RX 6000 及更新 | ||
Encoding | |||||
MPEG-2 | Ivy Bridge 及更新 | Broadwell 及更新 |
No | – | No6 |
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 及更新 | ||
VP8 | Cherryview/Braswell 及更新 Hybrid: Haswell to Skylake3 |
No | |||
VP9 8bit | Kaby Lake 及更新 | Icelake 及更新 | |||
VP9 10bit | No |
- 1 直到 GeForce GTX 750.
- 2 支持提供自y libva-intel-driver-g45-h264AUR.
- 3 混合的VP8/9支持自 intel-hybrid-codec-driverAUR.
-
4 MPEG-4第二部分默认关闭由于VA-API的设置.设置environment variable
VAAPI_MPEG4_ENABLED=true
去使用其于所有地方. - 5 实验性的VP9支持提供自libva-vdpau-driver-vp9-gitAUR.
- 6 NVIDIA CUDA 适配器/编解码器支持正积极的变化于 [6].
VDPAU drivers
Codec | Color depth |
mesa-vdpau [7] [8] | nvidia-utils |
libvdpau-va-gl (VA-API adapter) |
---|---|---|---|---|
Decoding | ||||
MPEG-2 | 8bit | Radeon R300 及更新 GeForce 8 及更新1 |
GeForce 8 及更新 | No |
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 及更新 | See #VA-API drivers |
H.265/HEVC | 8bit | Radeon R9 Fury 及更新 | GeForce 900 及更新3 | No |
10bit | Radeon 400 及更新 | No4 | ||
VP9 | 8bit | No | GeForce 900 及更新3 | |
10bit | No | No4 | ||
AV1 | 8bit | No | GeForce 30 及更新5 | |
10bit | No | No4 |
- 1 直到GeForce GTX 750.
- 2 Except GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB).
- 3 除了GeForce GTX 970 and GTX 980.
- 4 NVIDIA 实现仅限于8bit流 [9] [10].
- 5 开始于驱动版本510.[11]
NVIDIA driver only
Codec | nvidia-utils [12] | |
---|---|---|
NVDECODE | NVENCODE | |
MPEG-2 | Fermi 及更新1 | No |
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) 及更新 | No |
VP9 8bit | Maxwell (GM206) 及更新 | |
VP9 10bit | Pascal 及更新 | |
AV1 8bit & 10bit | Ampere 及更新3 |
- 1 除了 GM108 (not supported)
- 2 除了 GM108 and GP108 (not supported)
- 3 除了 A100 (not supported)
配置
环境变量 VDPAU_DRIVER
决定使用的驱动。可以全局设置 或 针对一个用户 设置 环境变量
正确的驱动程序名称取决于您的设置:
- Intel 使用
va_gl
. - 开源AMD/ATI驱动程序,您需要将它设置为适当的驱动程序版本取决于你的GPU。
- Nvidia的专有版本将变量设置为“nvidia”。
$ grep -i vdpau /var/log/Xorg.0.log
(II) RADEON(0): [DRI2] VDPAU driver: r300
然后设置 VDPAU 驱动:
VDPAU_DRIVER=r300
多显卡显示
对混合显卡(NVIDIA和AMD),需要设置下面环境变量。
$ export DRI_PRIME=1
更多信息,参阅 PRIME wiki 页面。
支持的软件
开启软件的硬件加速
- Adobe Flash Player — 见 Browser plugins#Adobe Flash Player.
- || flashpluginAUR
- MPlayer 或 mplayer2[失效链接 2020-08-02 ⓘ] — 见MPlayer#Enabling VDPAU.
-
gnome-mplayer — 开启硬件加速: Edit > Preferences > Player, 设置 Video Output 为
vdpau
.
-
SMplayer — 开启硬件加速: Options > Preferences > General > Video, 设置 Output driver 为
vdpau
.
- || smplayer
- bomi — 硬件加速可以启用: Preferences > Video > Hardware acceleration.
- || mpv
- || vlc
GStreamer
安装 gstreamer-vaapi 软件包,它存在于官方软件仓库。
$ gst-launch-1.0 playbin uri=file:///path/to/foobar.mpeg
如果发现了支持的格式,VA-API会自动被使用。
基于GStreamer的播放器:
- totem: 不需要配置。
MPlayer
安装 mplayer-vaapiAUR 软件包,它存在于官方软件仓库。
$ mplayer -vo vaapi -va vaapi foobar.mpeg
- -vo - 指定 vaapi 视频输出驱动
- -va - 指定 vaapi 视频解码驱动
基于 MPlayer 的播放器:
-
gnome-mplayer: 开启硬件加速的方法: 编辑 > 首选项 > 播放器, 并设置视频输出为
vaapi
。 -
smplayer: 开启硬件加速的方法: 选项 > 首选项 > 常规 > 视频, 并设置输出驱动为
vaapi
。
VLC media player
安装 vlc 软件包,它位于官方软件仓库。
开启硬件加速的方法: 工具 > 首选项 > 输入 / 编解码器, 然后设置 硬件加速解码 为 视频加速 (VA) API
。