Hardware video acceleration (Русский)
Аппаратное ускорение видео (англ.) позволяет выполнять операции кодирования и декодирования видео на стороне видеокарты, разгружая CPU и экономя энергию.
Существуют несколько реализаций этой технологии на Linux:
- Video Acceleration API (VA-API) — разработанная Intel спецификация и свободная библиотека, предоставляющая аппаратное ускорение кодирования и декодирования видео.
- Video Decode and Presentation API for Unix (VDPAU) — разработанная NVIDIA свободная библиотека и API для переноса части процесса декодирования видео и его постобработки на сторону GPU.
- NVDECODE/NVENCODE — проприетарные API аппаратного ускорения, используемые в таких поколениях GPU от NVIDIA, как Fermi, Kepler, Maxwell и Pascal.
Для получения информации о видеокартах, выпущенных до 2007 года, см. XvMC. Также всесторонний обзор поддержки данных технологий со стороны драйверов и приложений доступен в разделе #Сравнительные таблицы.
Установка
Intel
Свободные драйверы Intel graphics поддерживают VA-API:
- Серия HD Graphics, начиная с Broadwell (~2015) и новее, поддерживается intel-media-driver.
- GMA 4500 series и более новые GPU до Coffee Lake поддерживаются libva-intel-driver.
- Декодирование H.264 на GMA 4500 поддерживается libva-intel-driver-g45-h264AUR, см. Intel graphics (Русский)#Декодирование H.264 на GMA 4500.
- Гибридное декодирование VP9 на процессорах от Broadwell до Skylake, а также гибридное декодирование VP8 на процессорах от Haswell до Skylake, поддерживается intel-hybrid-codec-driverAUR.
- Skylake и более новые поколения также требуют linux-firmware.
NVIDIA
Свободный драйвер Nouveau поддерживает как VA-API, так и VDPAU:
- GeForce 8 series и новее (до GeForce GTX 750) поддерживаются libva-mesa-driver и mesa-vdpau.
- Необходим nouveau-fwAUR — пакет с микропрограммой, которая на сегодняшний день извлекается из бинарного драйвера NVIDIA.
Проприетарный драйвер NVIDIA поддерживает следующие технологии с помощью пакета nvidia-utils:
ATI/AMD
Свободные драйверы ATI и AMDGPU поддерживают как VA-API, так и VDPAU:
- VA-API на Radeon HD 2000 и новее поддерживается libva-mesa-driver.
- VDPAU на Radeon R300 и новее поддерживается mesa-vdpau.
Проприетарный драйвер AMDGPU PRO основывается на драйвере AMDGPU и поддерживает как VA-API, так и VDPAU.
Слои преобразований
Активация поддержки VA-API при её отсутствии в драйвере:
- libva-vdpau-driver – бекенд VDPAU для VA-API.
- libva-vdpau-driver-chromiumAUR – бекенд VDPAU для VA-API с патчем, позволяющим взаимодействовать с Chromium.
- libva-vdpau-driver-vp9-gitAUR – экспериментальная поддержка VP9.
Активация поддержки VDPAU при её отсутствии в драйвере:
- libvdpau-va-gl – бекенд VA-API для VDPAU, поддерживается только H.264 (англ.).
Проверка
Аппаратное ускорение, скорее всего, хорошо заработает по умолчанию. Проверить это можно описанными ниже способами.
Проверка VA-API
Проверьте настройки VA-API, выполнив vainfo
(предоставляется пакетом 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
:
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
Необходимо задать корректный драйвер, см. #Настройка 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 вручную. Перед тем как продолжать чтение данного раздела, просмотрите раздел #Проверка.
Названия драйверов по умолчанию угадываются системой, если остутствуют какие-либо другие настройки. Однако они часто не совпадают и не работают. Предполагаемые значения можно просмотреть, выполнив следующую команду:
$ grep -iE 'vdpau | dri driver' /var/log/Xorg.0.log
(II) RADEON(0): [DRI2] DRI driver: radeonsi (II) RADEON(0): [DRI2] VDPAU driver: radeonsi
В данном случае по умолчанию используется radeonsi
для VA-API и VDPAU.
journalctl -b | grep -iE 'vdpau | dri driver'
.Настройка VA-API
Драйвер VA-API можно переопределить с помощью переменной окружения LIBVA_DRIVER_NAME
:
-
Intel graphics:
- Укажите
i965
, если используется libva-intel-driver. - Укажите
iHD
, если используется intel-media-driver.
- Укажите
- NVIDIA:
- ATI/AMD:
- Укажите
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, libva-mesa-driver предоставляет
radeonsi
вместоgallium
.
Настройка VDPAU
Драйвер VDPAU можно переопределить с помощью переменной окружения VDPAU_DRIVER
.
Корректное название драйвера зависит от конфигурации:
- Если используется Intel Graphics или AMD Catalyst, необходимо задать
va_gl
. - Если используется свободный драйвер AMD/ATI, задайте соответствующую версию драйвера, в зависимости от видеокарты. См. #Проверка.
- Если используется свободный драйвер Nouveau, задайте
nouveau
. - Если используется проприетарный драйвер NVIDIA, задайте
nvidia
.
- Установленные драйверы находятся в
/usr/lib/vdpau/
и используются как/usr/lib/vdpau/libvdpau_${VDPAU_DRIVER}.so
. - Некоторые драйверы устанавливаются несколько раз под разными именами в целях совместимости. Их список можно увидеть, выполнив команду
sha1sum /usr/lib/vdpau/*
. - В случае с конфигурацией с гибридной графикой (как с NVIDIA, так и с AMD), может потребоваться задать переменную окружения
DRI_PRIME=1
. См. статью PRIME для получения более подробной информации.
Настройка приложений
Мультимедийные фреймворки:
Видеоплееры:
- Browser plugins#Adobe Flash Player (англ.)
- Kodi#Hardware video acceleration (англ.)
- MPlayer#Hardware video acceleration (англ.)
- mpv#Hardware video acceleration (англ.)
- VLC media player#Hardware video acceleration (англ.)
Веб-браузеры:
- Chromium#Hardware video acceleration (англ.)
- Firefox (Русский)#Аппаратное ускорение видео
- GNOME/Web#Video (англ.)
Решение проблем
Ошибка "Failed to open VDPAU backend"
Необходимо задать переменную VDPAU_DRIVER
, указывающую на корректный драйвер. См. #Настройка VDPAU.
Ошибка "init failed" с VAAPI
Данная ошибка (например, libva: /usr/lib/dri/i965_drv_video.so init failed
) может происходить из-за неправильного определения Wayland. Одно из решений — сбросить переменную $DISPLAY
, таким образом, mpv, MPlayer, VLC и т.д. не будут исходить из того, что используется X11. Также можно добавить аргумент --gpu-context=wayland
, если используется mpv.
Сравнительные таблицы
Драйверы VA-API
Кодек | libva-intel-driver [2] | intel-media-driver [3] | libva-mesa-driver [4] [5] |
libva-vdpau-driver (адаптер VDPAU) |
---|---|---|---|---|
Декодирование | ||||
MPEG-2 | GMA 4500 и новее | Broadwell и новее | Radeon HD 6000 и новее GeForce 8 и новее1 |
См. #Драйверы VDPAU |
MPEG-44 | Нет | Нет | 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 и новее Гибридное: Broadwell to Skylake3 |
Broxton/Apollo Lake и новее | Raven Ridge и новее | См. #Драйверы VDPAU5 |
VP9 10bit | Kaby Lake и новее | Kaby Lake и новее | Нет | |
Кодирование | ||||
MPEG-2 | Ivy Bridge и новее | Broadwell и новее кроме Broxton/Apollo Lake |
Нет | – |
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 и новее Гибридное: от Haswell до Skylake3 |
Нет | ||
VP9 8bit | Kaby Lake и новее | Icelake и новее | ||
VP9 10bit | Нет |
- 1 До GeForce GTX 750.
- 2 Поддерживается libva-intel-driver-g45-h264AUR.
- 3 Гибридный кодировщик VP8 и декодировщик VP9 поддерживается intel-hybrid-codec-driverAUR.
-
4 MPEG-4 отключён по умолчанию из-за ограничений VAAPI. Задайте переменную окружения
VAAPI_MPEG4_ENABLED=true
, если вы всё-таки хотите протестировать данную функцию. - 5 Экспериментальная поддержка VP9 доступна в libva-vdpau-driver-vp9-gitAUR.
Драйверы VDPAU
Кодек | mesa-vdpau [6] [7] | nvidia-utils |
libvdpau-va-gl (адаптер VA-API) |
|
---|---|---|---|---|
Декодирование | ||||
MPEG-2 | Radeon R300 и новее GeForce 8 и новее1 |
GeForce 8 и новее | Нет | |
MPEG-4 | Radeon HD 6000 и новее GeForce 200 и новее1 |
GeForce 200 и новее | ||
VC-1 | Radeon HD 2000 и новее GeForce 9300 и новее1 |
GeForce 8 и новее2 | ||
H.264/MPEG-4 AVC | Radeon HD 2000 и новее GeForce 8 и новее1 |
GeForce 8 и новее | См. #Драйверы VA-API | |
H.265/HEVC 8bit | Radeon R9 Fury и новее | GeForce 900 и новее3 | Нет | |
H.265/HEVC 10bit | Radeon 400 и новее | Нет4 | ||
VP9 8bit | Нет | GeForce 900 и новее3 | ||
VP9 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 ограничена 8-битными потоками [8] [9].
Драйвер NVIDIA
Кодек | nvidia-utils [10] | |
---|---|---|
NVDECODE | NVENCODE | |
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 | Pascal и новее |
- 1 Кроме GM108 (не поддерживается)
- 2 Кроме GM108 и GP108 (не поддерживаются)
Поддержка приложениями
Приложение | Декодирование | Кодирование | Документация | |||
---|---|---|---|---|---|---|
VA-API | VDPAU | NVDECODE | VA-API | NVENCODE | ||
FFmpeg | Да | Да | Да | Да | Да | FFmpeg#Hardware video acceleration (англ.) |
GStreamer | Да1 | Да | Да2 | Да1 | Да2 | GStreamer#Hardware video acceleration (англ.) |
Kodi | Да | Да | Да | – | – | Kodi#Hardware video acceleration (англ.) |
mpv | Да | Да | Да | – | – | Mpv (Русский)#Аппаратное декодирование |
VLC media player | Да | Да | Нет | – | – | VLC media player#Hardware video acceleration (англ.) |
MPlayer | Да3 | Да | Нет | – | – | MPlayer#Hardware video acceleration (англ.) |
Flash | Нет4 | Да4 | Нет | – | – | Browser plugins#Adobe Flash Player (англ.) |
Chromium | Да5 | Нет | Нет | ? | Нет | Chromium#Hardware video acceleration (англ.) |
Firefox | Да6 | Нет | Нет | Нет | Нет | Firefox (Русский)#Аппаратное ускорение видео |
GNOME/Web | Да1 | Да | Да2 | ? | ? | GNOME/Web#Video (англ.) |
-
1 GStreamer использует белый список (англ.) драйверов VA-API. Чтобы использовать другие драйверы (например, intel-media-driver), задайте переменную окружения
GST_VAAPI_ALL_DRIVERS=1
. - 2 NVDECODE/NVENCODE отключён в пакете Arch.
- 3 Поддержка VA-API доступна в mplayer-vaapiAUR.
- 4 VDPAU поддерживается только NPAPI-плагином. Доступен экспериментальный адаптер в виде PPAPI-плагина для NPAPI-браузеров, который частично поддерживает ускорение VA-API и VDPAU.
- 5 Поддержка VA-API доступна в chromium-vaapiAUR. Wayland не поддерживается, а XWayland не работает корректно (англ.) с libva-intel-driver.
- 6 Начиная с Firefox 75 (firefox-nightlyAUR). В Firefox 75 поддерживаются только технологии H.264 и Wayland, а поддержка отличных от H.264 стандартов реализована в Firefox 76 и выше. Поддержка X11 на данный момент отсутствует. [11][12][13]