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

提供: ArchWiki
2018年6月17日 (日) 22:25時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

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

Linux でハードウェアアクセラレーションを利用する方法は複数存在します:

  • Video Acceleration API (VA-API) はハードウェア支援による動画エンコード・デコードの両方を実現するオープンソースライブラリです。Intel によって開発されました。
  • Video Decode and Presentation API for Unix (VDPAU) は GPU ビデオハードウェアに動画のデコードやポストプロセス処理をオフロードするオープンソースのライブラリです。NVIDIA によって開発されました。
  • X-Video Motion Compensation (XvMC) は動画のデコード処理を動画プログラムから GPU ビデオハードウェアにオフロードできる X.Org サーバーの拡張です。

対応状況

フォーマット

ノート: ドライバーの選択についてはインストールを見てください。
VA-API
libva-intel-driver [1] libva-mesa-driver Catalyst XvBA libva-vdpau-driver
(VDPAU アダプタ)
デコード
MPEG2 GMA 4500 以降 Radeon HD 4000 以降 Radeon HD 4000 以降 VDPAU を参照。
MPEG4
?
Radeon HD 6000 以降
H.264 GMA 45001, Ironlake Graphics 以降 Radeon HD 4000 以降 Radeon HD 4000 以降
HEVC (H.265) Cherryview/Braswell 以降 Radeon HD 6000 以降
VC1 Sandy Bridge Graphics 以降 Radeon HD 4000 以降 Radeon HD 4000 以降
VP8 Broadwell 以降 ?
VP9 Broxton 以降 ?
エンコード
MPEG2 Ivy Bridge Graphics 以降 ?
H.264 Sandy Bridge Graphics 以降 Radeon HD 4000 以降
HEVC (H.265) Skylake 以降 ?
VP8 Cherryview/Braswell 以降 ?
VP9 Kaby Lake 以降 ?
VDPAU
mesa-vdpau nvidia-utils amdgpu-pro-vdpauAUR libvdpau-va-gl
(VA-API アダプタ)
デコード
MPEG2 Radeon 9500 以降, GeForce 8 以降 GeForce 8 以降 ? 2
MPEG4 Radeon HD 6000 以降, GeForce 200 以降 GeForce 200 以降
H.264 Radeon HD 4000 以降, GeForce 8 以降 GeForce 8 以降 VA-API を参照。
HEVC (H.265) GeForce 9004 以降 2
VC1 Radeon HD 4000 以降, GeForce 83 以降 GeForce 83 以降
  • 1 libva-intel-driver-g45-h264AUR パッケージによってサポートされています。
  • 2 バージョン 0.3 現在、VA GL ドライバーは H.264 以外のハードウェアデコーダをサポートしていません。
  • 3 GeForce 8800 Ultra, 8800 GTX, 8800 GTS (320/640 MB) は除外
  • 4 GeForce GTX 970 と GTX 980 は除外。
Nvidia NVDEC/NVENC (NVIDIA のみ)
デコード (NVDEC) エンコード (NVENC)
MPEG-2
VC-1
H.264
HEVC (H.265) Pascal 以降 Pascal 以降
VP8 Maxwell2 以降
VP9 Pascal 以降

あなたの GPU でどのプロファイルがサポートされているか知る方法は確認を見てください。

amdgpu-pro-vdpauAUR パッケージについては AMDGPU#AMDGPU PRO を見てください。

ソフトウェア

VA-API VDPAU NVDEC/NVENC
GStreamer ✓ (gstreamer-vaapi を使用、GStreamer#ハードウェアアクセラレーションを参照) ✓ (gst-plugins-bad を使用、GStreamer#ハードウェアアクセラレーションを参照) ✓ (gst-plugins-bad を使用、GStreamer#ハードウェアアクセラレーションを参照)
VLC media player ✓ (VLC media player#ハードウェアアクセラレーションのサポートを参照) ✓ (VLC media player#ハードウェアアクセラレーションのサポートを参照)
mpv ✓ (mpv#ハードウェアデコードを参照) ✓ (mpv#ハードウェアデコードを参照)
MPlayer ✓ (mplayer-vaapiAUR を使用、MPlayer#VA-API を有効にするを参照) ✓ (MPlayer#VDPAU を有効にするを参照)
Flash ✓ (libvdpau-va-gl を使用、Flash#設定を参照) ✓ (Flash#設定を参照)
Kodi
Firefox [2] [3] [4]
Chromium 開発中 (chromium-vaapiAUR)
FFmpeg

インストール

使用しているビデオカードのメーカーにあわせて適切なドライバーを選択してください:

  • Intel Graphics の場合は VA-API を使用してください。
  • NVIDIA 製のカードの場合は VDPAU を使用してください。
  • AMD 製のカードの場合は両方とも使うことができます (mesa を使用)。

VA-API と VDPAU それぞれに対して以下のドライバーも存在します:

  • libva-vdpau-driver は VDPAU を VA-API のバックエンドとして使用します。
  • libvdpau-va-gl は VA-API を VDPAU のバックエンドとして使用します。

2007年以前のカードについては XvMC を参照してください。

ヒント: 様々な状況に対応するために VA-API と VDPAU の両方をインストール・設定することを推奨します。例えば Flash は VA-API をサポートしていませんが VDPAU の VA-API バックエンドを使用することができます。

VA-API のインストール

オープンソースドライバー:

プロプライエタリドライバー:

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

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

VDPAU の設定

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

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

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