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

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

what-is-quick-sync-video
最近の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等のハードウェアアクセラレーションを追加出来る。具体的にサポートされているハードウェアや、ハードウェア別に出来ることは一覧が公開されている。

VAAPI
VAAPI VAAPI (Video Acceleration API) is an open-source library and API specification, which provides access to graphics hardware acceleration capabilities for video processing. It consists of a main library and driver-specific acceleration backend...

使用しているマシンスペック

実のところ、Intel Media SDKを用いてコネコネすると、h264_qsvというのが使えるようになる。が、私の環境は古すぎてお話にならないらしい。
参考までに環境を披露。

モノ ブツ
CPU Intel Core i7 3770K
メモリ 8GB
HDD SSD+HDDたくさん

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

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

Ubuntuでtsからmp4へ変換する設定 (2016年版)
tsをmp4にするのに、昔は莫大なことを行っていたのだが、今は非常にシンプルにしている。といっても、真面目な(つまり綺麗な)エンコードを行おうとすると、やはり20fpsが限界。

おっと、脱線脱線。

VAPPIを用いてUbuntuでQSVエンコードをする

ドライバの用意

必要となるドライバをインストールすることが必要。
これは非常に簡単で、下記のコマンドでインストール出来る。

#vaapi用のドライバがあるリポジトリを追加
sudo add-apt-repository ppa:wsnipex/vaapi 
sudo apt-get update 

ドライバをインストール

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 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) (default 20)
-quality E..V.... Set encode quality (trades off against speed, higher is faster) (from 0 to 8) (default 0)
-low_power E..V.... Use low-power encoding mode (experimental: only supported on some platforms, does not support all features) (from 0 to 1) (default 0)

その他のパラメータはこちらのサイトをご確認あれ。

肝心のVAAPI画質・容量は?

正直、ffmpegで超凝った設定(これは別途)を行うよりも大きいし重い。動きの多いところではブロックノイズが目立つ。うーむ、やはりWindows環境には及ばないのかなあ。

執筆者紹介

Thir

最新のガジェットを購入してはレビューする、を繰り返しています。このブログでは、ガジェットの紹介のほか、各種サーバーやスマートホームの構築などを提供しています。最近はYouTubeでもレビュー動画やVlogをあげています。(プロフィール