2015/11/19

LinuxでGPUの動画再生支援を用いる(主にDebian/Ubuntu向け)

本記事はGPUの動画再生支援機能をGNU/Linuxで使用する上での情報を扱ったもので、2014年5月に書かれた記事を大幅に書き直している。

動画再生支援機能を使用するには、GPUが動画再生支援に対応している必要がある。

(2016/4/27)MesaのVA-APIネイティブ対応(Ubuntuでは16.04から)などについて追記し、更に情報取得コマンドの出力結果をUbuntu 16.04上のものにするなど、一部内容の修正も行っている。
  1. Linux上の動画再生支援の主な方式
  2. Debian/Ubuntuにおける動画再生支援パッケージ
    1. 自由なソフトウェアのグラフィックドライバ使用時のパッケージ
    2. 互換パッケージ
    3. プロプライエタリなグラフィックドライバ使用時のパッケージ
      1. NVIDIAドライバを使用している場合
      2. AMDのfglrxドライバを使用している場合
  3. 動画再生支援についての情報の取得
    1. VDPAUの情報を取得
    2. VA-APIの情報の取得
  4. アプリケーションからの使い方
    1. mpv
    2. VLC
    3. Firefox + freshplayerplugin でのH.264の再生支援
    4. Google Chrome / Chromium でのH.264の再生支援

Linux上の動画再生支援の主な方式

GNU/Linuxで利用可能な動画再生支援の方式は、主に

  • VDPAU: NVIDIAのプロプライエタリドライバがネイティブ対応している[1]方式
  • VA-API: Intelのグラフィックドライバがネイティブ対応している方式

の2種類がある。他にも複数の方式が存在するが、2015年時点ではこれらが主に(ドライバ・アプリケーションの両方で)用いられている。

これらの方式は自由なソフトウェアのグラフィックドライバ[2]使用時に用いられるMesaライブラリがAMDとNVIDIAのGPUを対象として提供する動画再生支援ドライバでも用いられ、Mesa 11.2時点では両方の方式にネイティブ対応している(以前はVDPAUのみ対応だったが後にVA-APIにも対応した)。

Debian/Ubuntuにおける動画再生支援パッケージ

以下で挙げるパッケージ名については、他のディストリでも同様のパッケージ[3]が存在する。

自由なソフトウェアのグラフィックドライバ使用時のパッケージ

自由なソフトウェアのグラフィックドライバ使用時の動画再生支援のパッケージ名は以下のようになる。

GPUベンダネイティブな方式パッケージ名
AMD もしくは NVIDIAVDPAUmesa-vdpau-drivers
VA-APImesa-va-drivers
IntelVA-APIi965-va-driver

互換パッケージ

アプリケーションがVDPAUとVA-APIの片方にしか対応していない場合などのために、ネイティブな方式をバックエンドとして、ネイティブ対応していない側の方式を利用するための互換パッケージが存在する。

パッケージ名は以下のようになる。

互換対象の方式バックエンドの方式パッケージ名
VA-APIVDPAUvdpau-va-driver
VDPAUVA-APIlibvdpau-va-gl1

(以前のDebian/Ubuntuでのmesa-vdpau-drivers使用時など) “vdpau-va-driver” を通してVA-API対応ソフトウェアをVDPAU経由で用いる際にうまく動作しない(後述の情報取得コマンドの処理に失敗する)場合は環境変数LIBVA_DRIVER_NAMEに文字列 “vdpau” を指定する(Ubuntu 15.10時点では指定不要)。

(i965-va-driver使用時など) “libvdpau-va-gl1” を通してVDPAU対応ソフトウェアをVA-API経由で用いる場合は環境変数VDPAU_DRIVERに文字列 “va_gl” を指定する。

AMDやNVIDIAのGPUについては、Ubuntu 16.04ではMesaのVA-API対応を受けて “vdpau-va-driver” パッケージは互換用ファイルを提供しなくなっている(代わりにVA-APIネイティブのパッケージ “mesa-va-drivers” を入れる)。

プロプライエタリなグラフィックドライバ使用時のパッケージ

NVIDIAドライバを使用している場合

動作再生支援機能を提供するパッケージは先述した自由なソフトウェア向けのものとは異なり、プロプライエタリなグラフィックドライバの一部として含まれる形となっている。

AMDのfglrxドライバを使用している場合

(ネイティブな方式の)XvBAをバックエンドに用いるVA-API互換パッケージを用いることでVA-API対応ソフトウェアから再生支援が使用できる。この互換パッケージはDebianには “libfglrx-amdxvba1” という名前で存在し、Ubuntuでは過去に “xvba-va-driver” というパッケージがあったが、Ubuntu 15.10時点ではこれら2つのどちらの名前でもパッケージがインストールできない。Ubuntu 15.04用のパッケージを入れるか、今後のバージョンでDebianと同じパッケージ名でインストールできるようになるのを待つことになる。

VDPAUについてはこれに加えてIntelのドライバと同様に “libvdpau-va-gl1” をインストールし、前述の通りに環境変数を設定して用いる。

ただ、いずれも手元の環境(Radeon HD 4200)ではGPUが古くプロプライエタリドライバの動作対象外となっている[4]ため、動作は確認できていない。

動画再生支援についての情報の取得

VDPAUの情報を取得

“vdpauinfo” パッケージをインストールしてvdpauinfoコマンドを実行すると、VDPAU方式の動画再生支援についての情報を得ることができる。

手元の環境では

$ vdpauinfo
display: :0.0   screen: 0
API version: 1
Information string: G3DVL VDPAU Driver Shared Library version 1.0

Video surface:

name   width height types
-------------------------------------------
420     8192  8192  NV12 YV12 
422     8192  8192  UYVY YUYV 
444     8192  8192  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
MPEG4_PART2_SP                 --- not supported ---
MPEG4_PART2_ASP                --- not supported ---
DIVX4_QMOBILE                  --- not supported ---
DIVX4_MOBILE                   --- not supported ---
DIVX4_HOME_THEATER             --- not supported ---
DIVX4_HD_1080P                 --- not supported ---
DIVX5_QMOBILE                  --- not supported ---
DIVX5_MOBILE                   --- not supported ---
DIVX5_HOME_THEATER             --- not supported ---
DIVX5_HD_1080P                 --- not supported ---
H264_CONSTRAINED_BASELINE      --- not supported ---
H264_EXTENDED                  --- not supported ---
H264_PROGRESSIVE_HIGH          --- not supported ---
H264_CONSTRAINED_HIGH          --- not supported ---
H264_HIGH_444_PREDICTIVE       --- not supported ---
HEVC_MAIN                      --- not supported ---
HEVC_MAIN_10                   --- not supported ---
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   --- not supported ---
HEVC_MAIN_444                  --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8          8192  8192    y  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 
R8G8B8A8          8192  8192    y  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 
R10G10B10A2       8192  8192    y  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 
B10G10R10A2       8192  8192    y  NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 

Bitmap surface:

name              width height
------------------------------
B8G8R8A8          8192  8192
R8G8B8A8          8192  8192
R10G10B10A2       8192  8192
B10G10R10A2       8192  8192
A8                8192  8192

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             y
DEINTERLACE_TEMPORAL_SPATIAL     -
INVERSE_TELECINE                 -
NOISE_REDUCTION                  y
SHARPNESS                        y
LUMA_KEY                         -
HIGH QUALITY SCALING - L1        -
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              y        48     2048
VIDEO_SURFACE_HEIGHT             y        48     1152
CHROMA_TYPE                      y  
LAYERS                           y         0        4

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 y  
CSC_MATRIX                       y  
NOISE_REDUCTION_LEVEL            y      0.00     1.00
SHARPNESS_LEVEL                  y     -1.00     1.00
LUMA_KEY_MIN_LUMA                y  
LUMA_KEY_MAX_LUMA                y

となり、以前は対応していなかったH.264やVC-1にも対応している。

見方としては、 “Decoder capabilities” の中で “not supported” となっていないものが再生支援に対応している。

VA-APIの情報の取得

“vainfo” パッケージをインストールしてvainfoコマンドを実行することで、VA-API方式の動画再生支援についての情報を得ることができる。

手元の環境(ネイティブ対応)では下のようになった。

$ vainfo
libva info: VA-API version 0.39.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/r600_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.0)
vainfo: Driver version: mesa gallium vaapi
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileH264Baseline           : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc

見方としては、 “VAEntrypointVLD” とあるコーデック(“VAProfile” の後ろの部分が示す)が動画再生支援に対応している。

アプリケーションからの使い方

アプリケーションからは、ドライバ自体がネイティブ対応している方式を選択するほうがよい。[5]アプリケーションがVDPAUとVA-APIの内の片方にしか対応していない場合は前述の互換機能経由で使用する。

mpv

以下のオプション群を指定する。

  • VDPAUの場合: --vo vdpau--hwdec vdpau
  • VA-APIの場合: --vo vaapi(もしくは--vo opengl)と--hwdec vaapi
  • --hwdec-codecs [コーデック...] [6]

下は実行例。

(VDPAUを用いる場合)
$ mpv --vo vdpau --hwdec vdpau --hwdec-codecs h264,vc1,wmv3,mpeg1video,mpeg2video [入力ファイルの場所...]

(VA-APIを用いる場合)
$ mpv --vo vaapi --hwdec vaapi --hwdec-codecs h264,vc1,wmv3,mpeg1video,mpeg2video [入力ファイルの場所...]

設定ファイル内に以下の内容を記述することで--vo [vdpau もしくは vaapi]オプション指定時に上記オプションが自動設定されるようにできる。

設定ファイルの場所は、環境変数XDG_CONFIG_HOME

  • 定義済みの場合: ${XDG_CONFIG_HOME}/mpv/mpv.conf
  • 未定義の場合: [ホームディレクトリ]/.config/mpv/mpv.conf

となる(mpvディレクトリがない場合は新規に作成する)。

[一部]ファイル名: ${XDG_CONFIG_HOME}/mpv/mpv.conf もしくは [ホームディレクトリ]/.config/mpv/mpv.conf
# ハードウェアデコード時に使用するコーデック一覧
# 既定値は "h264,vc1,wmv3"
hwdec-codecs=h264,vc1,wmv3,mpeg1video,mpeg2video

# 常にVDPAUを指定(--vo vdpau)したい場合に下の行のコメントを解除する
#vo=vdpau
# 常にVA-APIを指定(--vo vaapi)したい場合に下の行のコメントを解除する
#vo=vaapi

# 映像の出力先にVDPAUが指定されたときにのみ適用される設定
[vo.vdpau]
hwdec=vdpau

# 映像の出力先にVA-APIが指定されたときにのみ適用される設定
[vo.vaapi]
hwdec=vaapi

(対応していない形式のファイルを指定したなどで)GPUによる処理に失敗した場合にはソフトウェア処理で再生される。

VLC

“ツール - 設定” の “入力 / コーデック” で “コーデック” の “ハードウェアアクセラレーションによるデコード” で “自動” か、VDPAUもしくはVA-APIの(使用したいほうの)項目を選択する。

Firefox + freshplayerplugin でのH.264の再生支援

Flashを用いた動画サイト上で動画再生支援機能を使用するには設定ファイルへ記述を追加する必要がある。また、ビルド時の設定でlibvdpauやlibvaが有効になっていないと機能自体が有効にならないので、手動でビルドする場合はこれらの開発パッケージ(libvdpau-dev,libva-dev)もビルド前にインストールして正しく検出されるようにしておく必要がある。

下はfreshplayerpluginで動画再生支援を用いるための設定ファイルへの記述例。

[一部]ファイル名: ${XDG_CONFIG_HOME}/freshwrapper.conf もしくは [ホームディレクトリ]/.config/freshwrapper.conf
enable_hwdec = 1

上記設定を記述後にYouTubeのHTML5プレーヤを無効化するアドオンを入れて設定した後で映像にH.264を用いた形式で再生すると、詳細統計情報の中に “accelerated video decoding” という表示が含まれ、CPU使用率がソフトウェアデコード時と比べて下がる。

再生支援自体は動作するが、Flashプラグインが(再生停止やページ遷移時に)突然他のウィンドウ含めて落ちたり、メモリを非常に多く使用する[7]ことがあったり、サイトによってはチラつき現象が起こったりと、色々トラブルも起こっているため、有効にする場合は注意が必要。また、手元のGPUの性能が低いせいか、動画によっては(CPU使用率は低いものの)再生がかえってカクカクするようになる例もあった。

Google Chrome / Chromium でのH.264の再生支援

手元の環境では、 “chrome://gpu” のURLで “Video Decode: Software only, hardware acceleration unavailable” と表示されている状態で、 “chrome://flags” の “ソフトウェア レンダリング リストをオーバーライド” で無理やり有効化した上でYouTubeのHTML5プレーヤを無効化する拡張を入れても、YouTubeでは再生支援がうまく動かなかった。

“chrome://gpu” には “Accelerated video decode is unavailable on Linux: 137247” という項目があり、まだGNU/Linuxでは再生支援機能を用いることができていない段階でバグ報告もされているが、2015年11月時点では対応予定なしとなっている。

使用したバージョン:
  • Linux (linux-image) 4.2.0-18.22, 4.4.0-21.37
  • linux-firmware 1.149.2, 1.157
  • libvdpau 1.1-1ubuntu1, 1.1.1-3ubuntu1
  • libva 1.6.0-1, 1.7.0-1
  • mpv 0.9.2-1ubuntu2, 0.14.0-1build1
  • VLC 2.2.1-3, 2.2.2-5
  • Firefox 42.0, 46.0
  • freshplayerplugin 0.3.3, 0.3.5
  • Google Chrome 46.0.2490.86, 50.0.2661.86
  • Chromium 45.0.2454.101, 49.0.2623.108
[1]: その方式に合わせて作られて直接対応している
[2]: “カーネルのDRMモジュール + libdrm + Mesa” から成る
[3]: 名前が一部異なることがあるが機能は同じもの
[4]: 古いGPU向けのLegacy版は2013年1月版(13.1)の後の更新がなく、他のパッケージのバージョンの関係で2015年時点のディストリで導入することはできない
[5]: fglrxの場合は処理の流れ上、VDPAUよりもVA-APIのほうがネイティブに近いと思われる
[6]: 既定で有効な3つのコーデック(H.264,VC1,wmv3)以外をハードウェアデコードで用いる場合のみ指定し、"mpv --vd=help“ の出力結果内の "lavc:” の右側部分をコンマ区切りで羅列したものとなる
[7]: Firefoxを一度終了するまで開放されない・Flash自体の問題の可能性もある