本記事はGPUの動画再生支援機能をGNU/Linuxで使用する上での情報を扱ったもので、2014年5月に書かれた記事を大幅に書き直している。
動画再生支援機能を使用するには、GPUが動画再生支援に対応している必要がある。
(2016/4/27)MesaのVA-APIネイティブ対応(Ubuntuでは16.04から)などについて追記し、更に情報取得コマンドの出力結果をUbuntu 16.04上のものにするなど、一部内容の修正も行っている。
- Linux上の動画再生支援の主な方式
- Debian/Ubuntuにおける動画再生支援パッケージ
- 動画再生支援についての情報の取得
- アプリケーションからの使い方
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 もしくは NVIDIA | VDPAU | mesa-vdpau-drivers |
VA-API | mesa-va-drivers | |
Intel | VA-API | i965-va-driver |
互換パッケージ
アプリケーションがVDPAUとVA-APIの片方にしか対応していない場合などのために、ネイティブな方式をバックエンドとして、ネイティブ対応していない側の方式を利用するための互換パッケージが存在する。
パッケージ名は以下のようになる。
互換対象の方式 | バックエンドの方式 | パッケージ名 |
---|---|---|
VA-API | VDPAU | vdpau-va-driver |
VDPAU | VA-API | libvdpau-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
(2017/7/17)その後のバージョンで記事公開当時のオプション指定の形が非推奨となっているため、記述を新しいバージョン向けに修正している。
以下のオプション群を指定する。
- VDPAUの場合:
--vo vdpau
と--hwdec vdpau
- VA-APIの場合:
--vo vaapi
(もしくは--vo opengl
)と--hwdec vaapi
--hwdec-codecs [コーデック...]
(任意)[6]
下は実行例。
(VDPAUを用いる場合) $ mpv --hwdec vdpau [入力ファイルの場所...] (VA-APIを用いる場合) $ mpv --hwdec vaapi [入力ファイルの場所...]
(2020/9/20)本記事公開後のバージョンで--hwdec-codecs
オプションの既定値がh264,vc1,hevc,vp9
に変わっている。2017年頃から後に登場した世代のGPUではこれらのコーデックの再生支援に対応しており、Mesaでも使用できる。
設定ファイル内に以下の内容を記述することで上記オプションが自動設定されるようにできる。--vo [vdpau もしくは vaapi]
オプション指定時に
${XDG_CONFIG_HOME}/mpv/mpv.conf
もしくは [ホームディレクトリ]/.config/mpv/mpv.conf
# ハードウェアデコード時に使用するコーデック一覧
hwdec-codecs=h264,vc1,hevc,vp9,mpeg1video,mpeg2video
# VDPAUを指定したい場合に下の行のコメントを解除する
#hwdec=vdpau
# VA-APIを指定したい場合に下の行のコメントを解除する
#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, 0.24.0-1
- 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