MSI GeForce GTX 1050 2GT LP と Ubuntu 16.10 と FFmpeg 3.2.4 で NVENC

スポンサーリンク

現在、Intel Media Server Studio 2017 R2 と Skylake と CentOS 7.2 と FFmpeg 3.2 で h264_qsv なトランスコードを行っています。しかし、対応 CPU はほぼ Skylake といってもよい状況、OS に至っては CentOS 7.2 というディストリとバージョンまで指定され、環境の縛りが非常に厳しいです。プライベートではあまり積極的に CentOS を使用したくないこともあり、Ubuntu でも気軽にハードウェアアクセラレーションを使用した H.264 のトランスコードを行いたいということで、FFmpeg の h264_nvenc オプションを使用すべく NVIDIA のグラフィックカードを購入しました。PC でゲームや動画編集等は行わないので、グラフィックカードを購入するのは非常に久々です。

どうせ購入するなら最新の GeForce GTX 10 シリーズで、その中で一番安い GeForce GTX 1050 としました。所有している PC ケース的にロープロファイルが必須なので MSI GeForce GTX 1050 2GT LP を選択しました。

数値は最後に載せていますが、結論から先に書くと自分の環境では QSV と NVENC の速度はほぼ同等でした。どちらもだいたい 8 倍を超えるくらいの速度でした。

ちなみに Intel Media Server Studio を CentOS 以外にもインストールはできるようですが、ドキュメントを読む限り結構面倒だと思います。

外箱

外箱の裏面

本体とロープロファイル用の金具

で、実際に ANTEC VSK2000-U3 に入れてみたところ。

環境は以下の通り。

  • CPU: Intel Core i3-4170 CPU @ 3.70GHz (Haswell Refresh)
  • メモリ: 4GB
  • マザーボード: ASUS B85M-K
  • 電源: KRPW-TX300W/90+
  • OS: Ubuntu 16.10

Linux 用のドライバをダウンロードしてインストールします。

NVIDIAドライバダウンロード
http://www.nvidia.co.jp/Download/index.aspx?lang=jp

Linux 64-bit をダウンロードします。

現時点では NVIDIA-Linux-x86_64-375.39.run というファイルが保存されるので、実行権を付けて root で実行します。X が起動しているとインストールできないので CLI でインストールするなり、リモートからログインしてインストールする必要があります。

Yasm をインストールした上で FFmpeg をビルドします。例えば下記の通り。

cd /tmp && \
    wget https://ffmpeg.org/releases/ffmpeg-3.2.4.tar.bz2 && \
    tar jxvf ffmpeg-*.tar.bz2 && \
    cd ffmpeg-* && \
    ./configure --disable-shared --enable-static && \
    make -j$(nproc) && \
    sudo make install

h264_nvenc のオプション自体は特に何も設定する必要はなく、デフォルトで有効になっているようです。ただし、下記の FFmpeg wiki に記載されているように h264_nvenc を使用するためには下記の 3 条件が揃っていることが必要とのこと。

  • A supported GPU
  • Supported drivers
  • ffmpeg configured without –disable-nvenc

FFmpeg – HWAccelIntro
https://trac.ffmpeg.org/wiki/HWAccelIntro

h264_nvenc のオプションは下記のいずれかのコマンドで確認できるようです。

ffmpeg -h encoder=h264_nvenc or ffmpeg -h encoder=hevc_nvenc

ということで準備は整ったので、何かビデオファイルをトランスコードしてみます.

wget https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
ffmpeg -i sintel_trailer-1080p.mp4 -vcodec h264_nvenc out_nvenc.mp4

ログを見てみると、h264_nvenc でスピードは 8.19x でした。すこぶる高速です。

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_nvenc))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
...
speed=8.19x

QSV での結果と比較してみます。QSV での確認結果は以下のポスト。

Intel Media Server Studio 2017 R2 と FFmpeg 3.2.3 と Linux (CentOS 7.2 1511) で QSV (Quick Sync Video)
https://hirooka.pro/?p=8660

下記の通り、CPU の世代が異なりますが QSV の方がちょっと速いもののほぼ同等ですね。画質についてはあんまり気にしないので細かく比較はしていません。

Intel Media Server Studio 2017 R2 + Intel Core i3-6100 CPU @ 3.70GHz (Skylake)
speed=8.55x

GeForce GTX 1050 + Core i3-4170 CPU @ 3.70GHz (Haswell Refresh)
speed=8.19x

というわけで、NUC や Mini-ITX のようにハードウェアの制限がある場合は QSV、ハードウェアの制限が無く OS のディストリやバージョンに縛られたく無い場合は NVENC、コンテナ環境や仮想環境は x264 のソフトトランスコード、と使い分けようかなと思います。

あと、Raspberry Pi では h264_omx が使用できます。ただし、これは変換前後で解像度を変更すると途端に変換スピードが落ちます。

Raspberry Pi 3 Model B, FFmpeg, OpenMAX IL H.264 ハードウェアエンコード、トランスコード
https://hirooka.pro/?p=8678

FFmpegNVENC
スポンサーリンク
コピペワールド