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

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

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи 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.

Для получения информации о видеокартах, выпущенных до 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:

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

- 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 (англ.).

## Проверка

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

Совет: 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:
  - Укажите `i965`, если используется libva-intel-driver.
  - Укажите `iHD`, если используется intel-media-driver.
- NVIDIA:
  - Укажите `nouveau`, если используется Nouveau.
  - Укажите `vdpau`, если используется NVIDIA.
- ATI/AMD:
  - Укажите `radeonsi`, если используется AMDGPU.
  - Укажите `fglrx`, если используется AMD Catalyst.

Примечание:

- Установленные драйверы находятся в `/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 для получения более подробной информации.

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

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

- FFmpeg#Hardware video acceleration (англ.)
- GStreamer#Hardware video acceleration (англ.)

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

- 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]

Categories:

- Graphics (Русский)
- X server (Русский)