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。
