Hardware video acceleration (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Hardware video acceleration. Дата последней синхронизации: 31 марта 2020. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Аппаратное ускорение видео (англ.) позволяет выполнять операции кодирования и декодирования видео на стороне видеокарты, разгружая 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.

Также всесторонний обзор поддержки данных технологий со стороны драйверов и приложений доступен в разделе #Сравнительные таблицы.

Установка

Intel

Свободные драйверы Intel graphics поддерживают VA-API:

NVIDIA

Свободный драйвер Nouveau поддерживает как VA-API, так и VDPAU:

  • GeForce 8 series и новее (до GeForce GTX 750) поддерживаются libva-mesa-driver и mesa-vdpau.
  • Необходим nouveau-fwAUR — пакет с микропрограммой, которая на сегодняшний день извлекается из бинарного драйвера NVIDIA.

Проприетарный драйвер NVIDIA поддерживает следующие технологии с помощью пакета nvidia-utils:

  • VDPAU на серии GeForce 8 и новее;
  • NVDECODE на Fermi и новее [1];
  • NVENCODE на Kepler и новее.

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 при её отсутствии в драйвере:

Активация поддержки VDPAU при её отсутствии в драйвере:

Проверка

Аппаратное ускорение, скорее всего, хорошо заработает по умолчанию. Проверить это можно описанными ниже способами.

Совет: mpv отлично подходит для проверки аппаратного ускорения на практике.

Проверка 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.

Примечание: Если используется GDM, выполните вместо этого следующую команду: journalctl -b | grep -iE 'vdpau | dri driver'.

Настройка VA-API

Драйвер VA-API можно переопределить с помощью переменной окружения LIBVA_DRIVER_NAME:

  • Intel graphics:
  • NVIDIA:
    • Укажите nouveau, если используется Nouveau.
    • Укажите vdpau, если используется 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 для получения более подробной информации.

Настройка приложений

Мультимедийные фреймворки:

Видеоплееры:

Веб-браузеры:

Решение проблем

Ошибка "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 Нет

Драйверы 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 (англ.)