ハードウェアビデオアクセラレーション

提供: ArchWiki
2021年9月2日 (木) 17:50時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎Intel: 転載および翻訳)
ナビゲーションに移動 検索に移動

ハードウェアビデオアクセラレーションにより、ビデオカードで動画をデコード・エンコードするを活用することで、CPU の負担を下げて電力を節約することができます。

Linux でこれを実現する方法は複数存在します:

  • Video Acceleration API (VA-API) はハードウェア支援による動画エンコード・デコードの両方を実現するオープンソースライブラリです。Intel によって開発されました。
  • Video Decode and Presentation API for Unix (VDPAU) は GPU ビデオハードウェアに動画のデコードやポストプロセス処理をオフロードするオープンソースのライブラリです。NVIDIA によって開発されました。VDPAU は2015年9月から更新されていません。
  • NVDECODE/NVENCODE - NVIDIA Fermi, Kepler, Maxwell, Pascal 世代の GPU によって使われているハードウェアビデオアクセラレーションのためのプロプライエタリ API。

2007年以前のビデオカードについては XvMC を参照してください。ドライバーとアプリケーションのサポートの包括的な概要については、#比較一覧 を参照してください。

インストール

Intel

Intel Graphics オープンソースドライバーは VA-API に対応しています:

VAAPI がサポートするハードウェアと機能 もご覧ください。

NVIDIA

Nouveau オープンソースドライバーは VA-API と VDPAU に対応しています:

  • GeForce GTX 750 までの GeForce 8 シリーズ以降の GPU は libva-mesa-drivermesa-vdpau によってサポートされています。
  • NVIDIA のバイナリドライバーから抽出される nouveau-fwAUR ファームウェアパッケージが 必要 です。

NVIDIA プロプライエタリドライバーは VDPAU と NVDECODE/NVENCODE に対応しています:

  • VDPAU は GeForce 8 シリーズ以降で nvidia-utils によってサポートされています。
  • NVDECODE/NVENCODE は Kepler 以降で nvidia-utils によってサポートされています。

ATI/AMD

ATIAMDGPU オープンソースドライバーは VA-API と VDPAU に対応しています:

  • VDPAU は Radeon R300 以降の GPU で mesa-vdpau によってサポートされています。
  • VA-API は Radeon HD 2000 以降の GPU で libva-mesa-driver によってサポートされています。

AMD Catalyst プロプライエタリドライバーは XvBA によって VA-API に対応しています。

AMDGPU PRO プロプライエタリドライバーは AMDGPU ドライバー上で動作し、VA-API と VDPAU に対応しています。

互換レイヤー

デバイスドライバーが VA-API をサポートしていない場合に VA-API を使うには:

デバイスドライバーが VDPAU をサポートしていない場合に VDPAU を使うには:

確認

ヒント:
  • ハードウェアアクセラレーションをテストするときは mpv が向いています。
  • Radeon の場合、以下のコマンドでドライバーの名前を確認できます:
$ grep -iE 'vdpau | dri driver' ~/.local/share/xorg/Xorg.0.log
(II) RADEON(0): [DRI2] DRI driver: radeonsi
(II) RADEON(0): [DRI2] VDPAU driver: radeonsi

上記の場合、VA-API と VDPAU の両方で radeonsi が使えます。

  • GDM を使っている場合は journalctl -b | grep -iE 'vdpau | dri driver' を実行してください。

VA-API の確認

VA-API の設定は libva-utils パッケージに含まれている vainfo を実行することで確認できます:

$ 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           :	VAEntrypointEncPicturehttp://img.2chan.net/b/futaba.php?mode=cat
      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 を手動で有効にする必要があります。有効化されているかどうか確認をしてください。

VA-API の設定

VA-API のドライバーは自動で認識されます [1]。使用されているドライバーを確認する方法は確認を見てください。LIBVA_DRIVER_NAME 環境変数を設定することで使用するドライバーを上書きできます:

ノート:
  • インストールされているドライバーは /usr/lib/dri/ ディレクトリを見ることで確認できます。/usr/lib/dri/${LIBVA_DRIVER_NAME}_drv_video.so として使われます。
  • 一部のドライバーは互換性を保つために異なる名前を使っていることがあります。sha1sum /usr/lib/dri/* を実行することで確認できます。
  • LIBVA_DRIVERS_PATH を使うことで VA-API ドライバーのパスを上書きできます。
  • バージョン 12.0.1 から libva-mesa-drivergallium の代わりとして radeonsi を提供しています。

VDPAU の設定

VDPAU で使用されるドライバーは自動的に認識されますが、VDPAU_DRIVER 環境変数を使うことで上書きすることができます。

使用しているビデオドライバーにあわせて適切なドライバーの名前を指定してください:

  • Intel Graphics や AMD Catalyst の場合 va_gl設定する必要があります。
  • オープンソースの AMD/ATI ドライバーの場合、使用している GPU にあわせて適切なドライバーを設定してください。確認を参照。
  • オープンソースの 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

libvdpau-va-gl を使用している場合に VDPAU_DRIVER を上書きしないと発生するエラーです。何らかの理由で VDPAU が使用するドライバーを正しく認識できていません。VDPAU の設定を見てください。

VA-API を使用するようにメディアプレイヤーを設定することで良い結果を得られる可能性があります。ソフトウェアを参照。

VAAPI init failed

エラーは libva: /usr/lib/dri/i965_drv_video.so init failed という行で確認できます。Wayland が正しく認識されていないことが原因で発生します。$DISPLAY の設定を解除することで mpv, mplayer, VLC などは X11 であると誤認しないようになります。mpv の場合は --opengl-backend=wayland パラメータを追加することでも解決できます。

AMDGPU ドライバーを使用したビデオデコード時の破損や歪み

AMDGPU ドライバーでビデオデコードの破損または歪みが発生する場合は、allow_rgb10_configs = false環境変数 または driconf として設定します。 [2]

比較一覧

VA-API ドライバ

コーデック libva-intel-driver [3] intel-media-driver [4] libva-mesa-driver [5] [6] Catalyst XvBA libva-vdpau-driver

(VDPAU アダプタ)

デコード
MPEG2 GMA 4500 以降 Broadwell 以降 Radeon HD 6000 以降
GeForce 8 以降1
Radeon HD 4000 以降 #VDPAU を参照
MPEG4 No No Radeon HD 6000 以降 Radeon HD 6000 以降
AVC (H.264) GMA 45002, Ironlake 以降 Broadwell 以降 Radeon HD 2000 以降
GeForce 8 以降1
Radeon HD 4000 以降
HEVC (H.265) 8bit Cherryview/Braswell 以降 Skylake 以降 Radeon R9 Fury 以降 No
HEVC (H.265) 10bit Broxton 以降 Broxton/Apollo Lake 以降 Radeon 400 以降
VC1 Sandy Bridge 以降 Broadwell 以降 Radeon HD 2000 以降
GeForce 9300 以降1
Radeon HD 4000 以降
VP8 Broadwell 以降 No No No
VP9 8bit Broxton 以降
Hybrid: Haswell から Skylake3
Broxton/Apollo Lake 以降 Raven Ridge 以降
VP9 10bit Kaby Lake 以降 Kaby Lake 以降
エンコード
MPEG2 Ivy Bridge 以降 Broadwell 以降
Broxton/Apollo Lake は除く
No No No
AVC (H.264) Sandy Bridge 以降 Broadwell 以降 Radeon HD 7000 以降
HEVC (H.265) 8bit Skylake 以降 Skylake 以降 Raven Ridge 以降
HEVC (H.265) 10bit Kaby Lake 以降 Cannonlake 以降
VP8 Cherryview/Braswell 以降
Hybrid: Haswell から Skylake3
No
VP9 8bit Kaby Lake 以降 Icelake 以降
VP9 10bit No

VDPAU ドライバ

ノート: VDPAU は2015年9月から更新されておらず VP8 と VP9 をサポートしていません [8]
コーデック mesa-vdpau [9] [10] nvidia-utils [11] libvdpau-va-gl
(VA-API アダプタ)
デコード
MPEG2 Radeon R300 以降
GeForce 8 以降1
GeForce 8 以降 No
MPEG4 Radeon HD 6000 以降
GeForce 200 以降1
GeForce 200 以降
AVC (H.264) Radeon HD 2000 以降
GeForce 8 以降1
GeForce 8 以降 #VA-API を参照
HEVC (H.265) 8bit Radeon R9 Fury 以降 GeForce 900 以降2 No
HEVC (H.265) 10bit Radeon 400 以降 No3
VC1 Radeon HD 2000 以降
GeForce 9300 以降1
GeForce 8 以降4
  • 1 GeForce GTX 750 まで対応。
  • 2 GeForce GTX 970 と GTX 980 は除く。
  • 3 NVIDIA の実装は8ビットストリームまでに制限されています [12] [13]
  • 4 GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB) は除く

NVIDIA ドライバのみ

コーデック nvidia-utils
デコード エンコード
MPEG-2 Fermi 以降1 No
VC-1
AVC (H.264) Kepler 以降2
HEVC (H.265) 8bit Maxwell (GM206) 以降 Maxwell (2nd Gen) 以降
HEVC (H.265) 10bit Pascal 以降
VP8 Maxwell (2nd Gen) 以降 No
VP9 8bit Maxwell (GM206) 以降
VP9 10bit Pascal 以降
AV1 8bit & 10bit Ampere 以降3
  • 1 GM108 は除く (未サポート)
  • 2 GM108 と GP108 は除く (未サポート)
  • 3 A100 は除く (未サポート)

アプリケーションサポート

VA-API VDPAU NVDECODE ドキュメント
FFmpeg Yes Yes Yes FFmpeg#ハードウェアアクセラレーション
GStreamer Yes (gstreamer-vaapi) Yes (gst-plugins-bad) Yes (gst-plugins-bad) GStreamer#ハードウェアアクセラレーション
Kodi Yes Yes Yes Kodi#ヒントとテクニック‎
mpv Yes Yes Yes mpv#ハードウェアデコード
VLC media player Yes Yes No VLC media player#ハードウェアアクセラレーションのサポート
MPlayer mplayer-vaapiAUR Yes No MPlayer#ハードウェアアクセラレーション
Flash NPAPI のみ:
freshplayerpluginAUR
NPAPI のみ:
flashplugin または
freshplayerpluginAUR
No ブラウザプラグイン#Adobe Flash Player
Chromium chromium-vaapiAUR No No Chromium#設定
Firefox Yes No No バグレポート
ヒント: VP8/VP9 のハードウェアデコードが使えない場合に YouTube を視聴する際に CPU の使用量を減らしたいときは h264ify 拡張を使ってください (Firefox/Chromium)。