inthisfucking.world

💩🌎

動画の再生にハードウェアアクセラレーションを使う

macOSを使っている時は、動画の再生でCPUのファンの音が気になることはなかったですが、Linuxではよくあります。同じハードウェアを使っていても、Linux向けには公式にドライバーが提供されていなかったり、されていてもmacOSのものよりも性能が悪かったりすることはよくあります。

そのままでは悔しいので、Linuxにおいてもハードウェアアクセラレーションを使って、動画の再生の際に消費されるCPUをできるだけ減らします。

VA-APIとVDPAU

Linuxにおいて、ハードウェアによって動画のデコードを行うことを目的としたAPIは二つあり、一つはVA-API、もう一つはVDPAUと呼ばれています。VA-APIはIntelによって開発が始まったもので、VDPAUはNVIDIAによって開発が始まったものです。

Arch Linuxのサイトにある比較表によると、VA-APIの実装の方が対応しているコーデックが多そうです。私はDell XPS 13 (9300)を使っていて、Dell XPS 13 (9300)はIntelのintegrated graphics cardを搭載しているので、ここではVA-APIを有効にすることにします。

Elementary OS

私はElementary OSを使っているので、Elemenrary OSにおいて必要だったパッケージを説明します。Elementary OSは、基本的にはUbuntu Bionicなので、Ubuntu Bionicでもほぼ同じだと思います。

Arch LinuxのVA-API/VDPAUのページに記載がありますが、比較的新しいIntelのintegrated graphics cardの場合はintel-media-driver、それ以外の場合はlibva-intel-driverが必要になります。Simon FelsさんがUbuntu Bionic向けにバックポートしているので、私はそれを使いました。

$ sudo add-apt-repository ppa:morphis/intel-media
$ sudo apt-get update
$ sudo apt install intel-media-va-driver

Simon FelsさんのPPAでは、intel-media-driverintel-media-va-driverという名前になっています。インストールできたら、vainfoというツールを使って、正しく認識されているか確認しましょう。

$ sudo apt install vainfo
$ vainfo

こんな出力が確認できれば、正しく認識されています。VAEntrypointVLDとなっているものは、使っているグラフィックスカードでそれがデコードできるということになります。H.246やVP8など、グラフィックスカードによって対応しているコーデックは異なると思いますが、ここではH.246をハードウェアでデコードしたいコーデックとします。VAProfileH264というprefixが付いた行にVAEntrypointVLDが出ていれば、恐らくH.246のデコードはサポートされているでしょう。

インストールしているドライバーにも依存するようですが、私の場合は以下の環境変数を指定しないとvainfoが正しく動作しませんでした。

$ export LIBVA_DRIVER_NAME=iHD

これで、VA-APIを使ってハードウェアでH.246の動画をデコードする準備はできました。それでは実際に動画を再生してみましょう。

動画を再生する

動画の再生には、Arch Linuxのページでもお勧めされているmpvを使います。意図的にハードウェアアクセラレーションのAPIを指定して動画を再生できるので、動作確認にはとても便利です。

$ sudo apt install mpv

ハードウェアアクセラレーションが効いているかどうかを判断するには、CPUだけでは再生が難しいような動画を使うのが分かりやすくて便利です。ここでは、Blenderが作ってくれたBig Buck Bunnyを使います。こちらに4Kのmp4のものがあるので、それをダウンロードしましょう。

$ mpv <path-to-big-buck-bunny-video> --hwdec=no
$ mpv <path-to-big-buck-bunny-video> --hwdec=vaapi

--hwdecというオプションで、ハードウェアによるデコードを行うAPIを指定します。noにした場合はハードウェアによるデコードを行いません。この場合、私の環境では全てのCPUが大体70%くらい消費されてて、シーンによってはラグが発生しています。vaapiにした場合は、全てのCPUが大体10%以下になって、なおかつラグは発生しません。素晴らしい。

Chromium

Firefox

結論

Linuxでも、ハードウェアアクセラレーションを使って動画をデコードできるようになりました。4KのBig Buck Bunnyを再生する場合においては、CPUの負荷が約1/7になりました。

# その分GPUが使われるので、GPUの温度を下げるためにファンが動くことに気づきました 😢️