この記事は、 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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。