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

提供: ArchWiki
2023年1月8日 (日) 14:12時点におけるAshMyzk (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

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

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

  • Video Acceleration API (VA-API) はハードウェア支援による動画エンコード・デコードの両方を実現する仕様とオープンソースライブラリです。Intel によって開発されました。
  • Video Decode and Presentation API for Unix (VDPAU) は GPU ビデオハードウェアに動画のデコードやポストプロセス処理をオフロードするオープンソースのライブラリです。NVIDIA によって開発されました。
  • Advanced Media Framework (AMF) は、AMDGPU PRO を使用してマルチメディア処理のために AMD GPU に「部分的に」アクセスできるようにするオープンソースのフレームワークです。AMD によって開発されました。
  • NVDECODE/NVENCODE - Fermi 以降の NVIDIA GPU によって使われている、ハードウェアビデオアクセラレーションのためのプロプライエタリ API。

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

インストール

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 プロプライエタリドライバは nvidia-utils によってサポートされています:

ATI/AMD

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

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

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

  • Fiji 及びそれ以降の GPU における AMF は amf-amdgpu-proAUR によってサポートされています。
ノート:
  • 場合によっては、あなたのアプリケーションが AMDGPU PRO Vulkan ドライバを使用するように強制する必要があります。
  • HEVC エンコードは Navi より古い GPU では利用できない場合があります。

互換レイヤー

  • libva-vdpau-driver — VA-API のための VDPAU ベースのバックエンド。
https://cgit.freedesktop.org/vaapi/vdpau-driver || libva-vdpau-driver, libva-vdpau-driver-chromiumAUR, libva-vdpau-driver-vp9-gitAUR
  • libvdpau-va-gl — OpenGL/VAAPI バックエンドを用いた VDPAU ドライバ。H.264 のみ。
https://github.com/i-rinat/libvdpau-va-gl || libvdpau-va-gl
  • nvidia-vaapi-driver — VA-API のための CUDA NVDECODE ベースのバックエンド。
https://github.com/elFarto/nvidia-vaapi-driver/ || libva-nvidia-driverAUR
ノート:

Nvidia ドライバの 525 シリーズにはリグレッションがあり、VA-API が機能しなくなります。 nvidia-vaapi-driver#126

修正されるまでの間、ドライバをバージョン 520 にダウングレードするか、実験的な direct-backend を使用することができます。

確認

設定せずともシステムが完璧に動作する場合があります。なので、このセクションから読み始めて、システムの確認をすると良いでしょう。

ヒント:
  • コマンドラインサポートのある mpv は、ハードウェアアクセラレーションをテストするのにぴったりです。mpv --hwdec=auto video_filename のログを見てください。詳細は hwdec を参照。
  • Intel GPU の場合、intel-gpu-tools を使って、intel_gpu_top を root として実行することで、ビデオプレイバック中に GPU 使用率をモニタできます。ビデオバーが 0% よりも上にあれば、GPU のビデオデコーダ/エンコーダが使用されていることを示します。
  • AMD GPU の場合、radeontop を使用して GPU 使用率をモニタできます。intel-gpu-tools とは違い、現在 radeontop でデコード/エンコードの仕様状況を確認する方法はありません [2]
  • 任意の GPU において、htop のようなツールで CPU 使用率を比較できます。特に、高解像度なビデオ (4k 以上) において、VA-API が有効化されていて動作しているときの CPU 使用率は、ノート PC や他の比較的低電力なデバイスにおいて劇的に低いはずです。

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           :	VAEntrypointEncPicture
      VAProfileVP8Version0_3          :	VAEntrypointVLD
      VAProfileVP8Version0_3          :	VAEntrypointEncSlice
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointEncSlice

あなたのカードを使ってデコードできるフォーマットが VAEntrypointVLD で、エンコードできるフォーマットが VAEntrypointEncSlice で示されます。

上の例では、以下の行があることから i965 ドライバーが使われていることが確認できます:

vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.7.3

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 を手動で設定する必要があります。#確認 セクションを見た場合にのみ、このセクションを読み進めてください。

(他に設定が存在しない場合に使用される) デフォルトのドライバ名はシステムによって推測されます。しかし、それらはしばしばトリッキーで、機能しないこともあります。推測された値は Xorg のログファイルに出力されます。ログファイルは、Xorg が rootless の場合は ~/.local/share/xorg/Xorg.0.log、Xorg が root として実行されている場合は /var/log/Xorg.0.log です。ログファイルからある値を検索するには:

$ grep -iE 'vdpau | dri driver' xorg_のログファイル
(II) RADEON(0): [DRI2] DRI driver: radeonsi
(II) RADEON(0): [DRI2] VDPAU driver: radeonsi

この出力の場合、radeonsi が VA-API と VDPAU のデフォルトです。

ノート: GDM を使用している場合、代わりに journalctl -b --grep='vdpau | dri driver' を root として実行してください。

しかし、これは 設定 を表すものではありません。上記の値は、オーバーライドしたとしても変更されません。

VA-API の設定

LIBVA_DRIVER_NAME 環境変数 を使うことで、VA-API 用に使用するドライバをオーバーライドできます:

  • Intel Graphics:
  • NVIDIA:
    • Nouveau の場合は nouveau を使ってください。
    • NVIDIA VDPAU の場合は vdpau を使ってください。
    • NVIDIA NVDECODE の場合は nvidia を使ってください。
  • AMD:
    • AMDGPU ドライバの場合は radeonsi を使ってください。
ノート:
  • インストールされているドライバーは /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-drivergallium の代わりとして radeonsi を提供しています。

VDPAU の設定

VDPAU_DRIVER 環境変数を使うことで、VDPAU 用に使用するドライバをオーバーライドできます。

適切なドライバ名は、あなたのセットアップに依存します:

  • Intel graphics の場合、va_gl に設定する必要があります
  • オープンソースの AMD ドライバの場合、あなたの GPU に合わせて適切なドライババージョンを設定してください。#確認 を参照。
  • オープンソースの Nouveau ドライバの場合、nouveau に設定してください。
  • NVIDIA のプロプライエタリなバージョンの場合、nvidia に設定してください。
ノート:
  • インストールされているドライバーは /usr/lib/vdpau/ ディレクトリを見ることで確認できます。/usr/lib/vdpau/libvdpau_${VDPAU_DRIVER}.so として使われます。
  • 一部のドライバーは互換性を保つために異なる名前を使っていることがあります。sha1sum /usr/lib/vdpau/* を実行することで確認できます。
  • ハイブリッド構成 (NVIDIA と AMD の両方のカードが搭載されている) 場合、DRI_PRIME 環境変数を設定する必要があるかもしれません。詳しくは PRIME を参照。

アプリケーションの設定

マルチメディアフレームワーク:

ビデオプレイヤ:

ウェブブラウザ:

マルチメディア録画/ストリーミング:

トラブルシューティング

Failed to open VDPAU backend

適切なドライバを指すように VDPAU_DRIVER 変数を設定する必要があります。#VDPAU の設定 を参照。

VAAPI init failed

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

このエラーは、あなたのハードウェアに合わない VA-API ドライバをインストールした場合にも起こりえます。

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

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

比較一覧

VA-API ドライバ

コーデック libva-intel-driver [4] intel-media-driver [5] libva-mesa-driver [6] [7] libva-vdpau-driver
(VDPAU アダプタ)
libva-nvidia-driverAUR
(NVDECODE アダプタ)
デコード
MPEG-2 GMA 4500 以降 Broadwell 以降 Radeon HD 6000 以降
GeForce 8 以降1
#VDPAU ドライバ を参照 #NVIDIA ドライバのみ を参照7,8
H.263/MPEG-4 Visual4 No No 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 以降 No No
VP9 8bit Broxton 以降
Hybrid: Haswell refresh から Skylake3
Broxton/Apollo Lake 以降 Raven Ridge 以降 #VDPAU ドライバ を参照5
VP9 10bit Kaby Lake 以降 Kaby Lake 以降 No
AV1 8-bit & 10-bit No Tiger Lake 以降 Radeon RX 6000 以降
エンコード
MPEG-2 Ivy Bridge 以降 Broadwell 以降
Broxton/Apollo Lake を除く
No No6
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 以降
Hybrid: Haswell から Skylake3
No
VP9 8bit Kaby Lake 以降 Icelake 以降
VP9 10bit No
  • 1 GeForce GTX 750 まで。
  • 2 代わりに libva-intel-driver-g45-h264AUR によってサポートされています。
  • 3 Hybrid VP8 エンコーダと VP9 エンコーダは intel-hybrid-codec-driverAUR によってサポートされています。
  • 4 MPEG-4 Part 2 は VAAPI の制限のためデフォルトで無効化されています。使用してみるには、VAAPI_MPEG4_ENABLED=true 環境変数を設定してください。
  • 5 実験的な VP9 サポートは代わりに libva-vdpau-driver-vp9-gitAUR によって提供されています。
  • 6 NVIDIA CUDA アダプタコーデックのサポートは活発に開発中であり、これは変更される可能性があります [8]
  • 7 FireFox 98 以降が必要です [9]
  • 8 10bit+ のビデオは、まだマージされていません [10]

VDPAU ドライバ

コーデック 色深度 mesa-vdpau [11] [12] nvidia-utils libvdpau-va-gl
(VA-API アダプタ)
デコード
MPEG-2 8bit Radeon R300 以降
GeForce 8 以降1
GeForce 8 以降 No
H.263/MPEG-4 Visual 8bit Radeon HD 6000 以降
GeForce 200 以降1
GeForce 200 以降
VC-1 8bit Radeon HD 2000 以降
GeForce 9300 以降1
GeForce 8 以降2
H.264/MPEG-4 AVC 8bit Radeon HD 2000 以降
GeForce 8 以降1
GeForce 8 以降 #VA-API ドライバ を参照
H.265/HEVC 8bit Radeon R9 Fury 以降 GeForce 900 以降3 No
10bit Radeon 400 以降 No4
VP9 8bit No GeForce 900 以降3
10bit No No4
AV1 8bit No GeForce 30 以降5
10bit No No4
  • 1 GeForce GTX 750 まで。
  • 2 GeForce 8800 Ultra、8800 GTX、8800 GTS (320/640 MB) は除く
  • 3 GeForce GTX 970 と GTX 980 は除く。
  • 4 NVIDIA の実装は8ビットストリームまでに制限されています [13] [14]
  • 5 ドライババージョン 510 から [15]

NVIDIA ドライバのみ

コーデック nvidia-utils [16]
NVDECODE NVENCODE
MPEG-2 Fermi 以降1 No
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) 以降 No
VP9 8bit Maxwell (GM206) 以降
VP9 10bit Pascal 以降
AV1 8bit & 10bit Ampere 以降3
  • 1 GM108 は除く (未サポート)
  • 2 GM108 と GP108 は除く (未サポート)
  • 3 A100 は除く (未サポート)

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

アプリケーション デコード エンコード ドキュメント
VA-API VDPAU NVDECODE VA-API NVENCODE
FFmpeg Yes Yes Yes Yes Yes FFmpeg#ハードウェアアクセラレーション
GStreamer Yes1 No Yes Yes1 Yes GStreamer#ハードウェアアクセラレーション
Kodi Yes Yes No Kodi#ヒントとテクニック‎
mpv Yes Yes Yes mpv#ハードウェアデコード
VLC media player Yes Yes No VLC media player#ハードウェアアクセラレーションのサポート
MPlayer Yes2 Yes No MPlayer#ハードウェアアクセラレーション
Flash No3 Yes3 No ブラウザプラグイン#Adobe Flash Player
Chromium Yes No No Yes No Chromium#ハードウェアビデオアクセラレーション
Firefox Yes No No No No Firefox#ハードウェアビデオアクセラレーション
GNOME/Web GStreamer ? ? GNOME Web#ビデオ
  • 1 GStreamer は VA-API ドライバのホワイトリストを使用します。ホワイトリストを無視する方法については、GStreamer#ドライバのホワイトリストは無視する を見てください。
  • 2 VA-API サポートは代わりに mplayer-vaapiAUR によって提供されています。
  • 3 VDPAU は NPAPI プラグインによってのみサポートされています。部分的な VA-API と VDPAU アクセラレーションを提供する、PPAPI プラグインから NPAPI ブラウザへの実験的なアダプタが利用できます。
翻訳ステータス: このページは en:Hardware video acceleration の翻訳バージョンです。最後の翻訳日は 2023-01-08 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。