この記事は、 NetBSD Advent Calendar 2018の10日目の記事です。
はじめに
IntelのCPUに内蔵されているGPUには、Intel Quick Sync Video (QSV)というビデオのデコードとエンコードをする仕組みが入っています。
今回は、KabylakeなIntel Core i7なチップの搭載されているHP Spectre x360 ae019TUで、NetBSD/amd64 8.99.27上で、
H.264のビデオのデコードとエンコードをQSVでさせてみました。
エンコードには、pkgsrc/multimedia/ffmpeg4
を使い、
デコードには、pkgsrc/multimedia/mpv
を使います。
比較のためにfmpeg4
でCPUを使ってH.264を利用しますが、
これには本来はライセンスが必要なはずです。
CPUを使ってH.264のデコード/エンコードをしてはいけないと思います。
Intel QSVを使用する準備
NetBSDでIntel QSVを使うためには、pkgsrc/multimedia/libva
(VA API)を使うのが一番良いようです。
Intel Media SDKはもしNetBSDで使えたとしても相当苦労するのが明らかですし、
VDPAU
は、2015年以降のコミットは2018年11月の2件のみです。
NetBSD/amd64 8.99.27で必要なものをpkgsrc
からインストールします。
pkgsrc/multimedia/ffmpeg4
も
pkgsrc/multimedia/mpv
もNetBSD/amd64 8.99.27ではpkgsrc/multimedia/libva
に依存するのが既定値になっています。
本当に自分の環境でlibva
サポートが有効になるかを確認したい場合にが、
make show-options
の出力にvaapi
が含まれているかを確認すれば良いでしょう。
libva
からIntel QSVを使うには、pkgsrc/multimedia/intel-vaapi-driver
が必要です。
また、libva
の動作確認をするには、pkgsrc/multimedia/libva-utils
があると良いです。
# cd /usr/pkgsrc/multimedia/ffmpeg4 # make install # cd /usr/pkgsrc/multimedia/mpv # make install # cd /usr/pkgsrc/multimedia/intel-vaapi-driver # make install # cd /usr/pkgsrc/multimedia/libva-utils # make installこれで必要なソフトウェアは準備できました。
本当にIntel QSVが使えるか確認する
mpv
やffmpeg4
を使ってみる前に、libva-utils
パッケージに含まれるvainfo
コマンドで、
サポートされているIntel QSVの機能を確認してみます。
$ vainfo vainfo: VA-API version: 1.3 (libva 2.3.0) vainfo: Driver version: Intel i965 driver for Intel(R) Kaby Lake - 2.2.0 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 VAProfileHEVCMain10 : VAEntrypointVLD VAProfileHEVCMain10 : VAEntrypointEncSlice VAProfileVP9Profile0 : VAEntrypointVLD VAProfileVP9Profile0 : VAEntrypointEncSlice VAProfileVP9Profile2 : VAEntrypointVLD私の環境ではH.264のサポートはデコードもエンコードも有効なようです。
より古いIntel製CPUの場合には、提供されない機能もあるようです。 ですので、全ての環境で同じ結果が表示されるとは限りません。
テスト用のビデオファイルを用意する
良く考えると、私は全くビデオファイルを持っていませんでした。
自由に使えるビデオファイルと言えば、Blender FoundationのBig Buck Bunnyの3Dアニメーションビデオです。
https://download.blender.org/peach/bigbuckbunny_movies/
から、
big_buck_bunny_1080p_stereo.avi
のファイルをダウンロードしておきます。
これは、MS MPEG4というcodecでエンコードされたファイルのようです。
H.264にエンコードしてみる
ffmpeg4
を使ってH.264にエンコードしてみます。
ちょっとマシンの都合が悪く、実際の結果を示せませんが、おおむね以下のような性能でエンコードされました。
大変期待外れな内容です。
エンコーダー | CPU (libx264) | QSV (h264_vaapi) | |
---|---|---|---|
実時間に対する倍数 | 1.7倍程度 | 1.0倍程度 |
; CPUエンコードの場合 $ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.avi software.mp4 ; QSVエンコードの場合 $ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.avi hardware.mp4QSVエンコードの場合、load averageは2程度で推移しています。 もしかしたらMS MPEG4のデコードが律速になっているのかもしれません。
big_buck_bunny_1080p_stereo.avi
のファイルをH.264エンコードのファイルに変換したファイルを変換元ファイルにして
再度挑戦してみます。
エンコーダー | CPU (libx264) | QSV (h264_vaapi) | |
---|---|---|---|
実時間に対する倍数 | 0.3倍程度 | 0.7倍程度 |
; CPUエンコードの場合 $ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4 ; QSVエンコードの場合 $ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4余計に悪くなってしまいました。
次にQSVの場合のH.264のデコードも有効にしてみます。
エンコーダー | CPU (libx264) | QSV (h264_vaapi) | |
---|---|---|---|
実時間に対する倍数 | 0.3倍程度 | 9.3倍程度 |
; CPUエンコードの場合 $ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4 ; QSVエンコードの場合 $ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4これくらい差があれば、ありがたさを実感できます。
mpv
でのデコード
pkgsrc/multimedia/mpv
でIntel QSVでデコードして視聴する場合には、以下のようにします。
$ mpv --hwdec=vaapi --vo=vaapi big_buck_bunny_1080p_stereo.mp4これで視聴すると、load averageは上がらないようですし、H.264のライセンスのことも気にしなくて良いのかもしれません。
実際には、VP9等のcodecもIntel QSVはサポートしています。そちらの方が有用かもしれません。
明日は、furandon_pigさんが記事を書いてくれます。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。