録画サーバ構築 NVENCエンコード Linux編

長々と続けてきたエンコード検証もいよいよ最後、LinuxでのNVENCを試してみる。使うグラボは前回同様elsaのGD750-2GERTSP。NVENCはffmpegで利用する事になるが、ここまでのところffmpegについてWindowsとLinuxでの有為な差は見受けられないので、おそらく性能面では前回のWindows編と大差ないだろう。どちらかと言うとLinuxでの環境構築可否や手順の容易さが主な評価対象になるかもしれない。デュアルブートにしてあるsh67h3を今回はLinuxで起動する。公式からLinux用のドライバを検索してダウンロード。そのファイルを実行するとドライバのインストールウィザードに入るので適当に答えて完了させる。続いて、公式からcudaのtoolkitを見つけて、これもダウンロードしてインストール。

cd /usr/local/src
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/361.42/NVIDIA-Linux-x86_64-361.42.run
chmod 755 NVIDIA-Linux-x86_64-361.42.run
./NVIDIA-Linux-x86_64-361.42.run
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm
yum install cuda-repo-rhel7-7-5-local-7.5-18.x86_64.rpm

ffmpegにnvencの機能を追加する必要があるが、QSVのときにソースコンパイルはやったので、今回はrpmbuildでnvencの追加を行ってみる。コンパイルにはnvEncodeAPI.hが必要なので、nvidia_video_sdk_6.0.1の中から探して/usr/includeにコピーしておく。rpmbuildのパッケージやffmpegの再コンパイルに必要なパッケージもインストール。epelとnux-dextopリポジトリが必要。そしてffmpegのsrc.rpmをダウンロード。その中のSOURCEディレクトリに好みのバージョンのffmpegソースを配置する。最初はrpmと同じ2.6.8を使ってみたが、Windowsに比べて性能が悪かったので、Windowsと同じく最新の3.0.2を使った。

yum install --enablerepo=epel,nux-dextop bzip2-devel faac-devel gnutls-devel gsm-devel ladspa-devel libass-devel libcdio-paranoia-devel libdc1394-devel libmodplug-devel libtheora-devel libv4l-devel libvdpau-devel libXvMC-devel openal-soft-devel openjpeg-devel pulseaudio-libs-devel schroedinger-devel SDL-devel soxr-devel speex-devel xvidcore-devel rpm-build
cd /usr/local/src
wget https://developer.nvidia.com/video-sdk-601
unzip nvidia_video_sdk_6.0.1.zip
cp /usr/local/src/nvidia_video_sdk_6.0.1/Samples/common/inc/nvEncodeAPI.h /usr/include
wget https://li.nux.ro/download/nux/dextop/el7/SRPMS/ffmpeg-2.6.8-3.el7.nux.src.rpm
rpm -ivh ffmpeg-2.6.8-3.el7.nux.src.rpm
cd ~/rpmbuild/SPEC
cp ffmpeg.spec _ffmpeg.spec
vi ffmpeg.spec
diff -u _ffmpeg.spec ffmpeg.spec
--- _ffmpeg.spec    2016-05-30 23:54:09.581007054 +0900
+++ ffmpeg.spec    2016-05-31 01:42:46.022384592 +0900
@@ -10,13 +10,13 @@
 %global _without_vpx      1
 %global _with_fdkaac      1
 %global _with_faac        1
-%global _with_nvenc       0
+%global _with_nvenc       1
 %endif

 Summary:        Digital VCR and streaming server
 Name:           ffmpeg
-Version:        2.6.8
+Version:        3.0.2
 Release:        3%{?date}%{?date:git}%{?rel}%{?dist}
 %if 0%{?_with_amr:1}
 License:        GPLv3+
@@ -166,6 +166,7 @@
     --enable-avresample \\\
     --enable-postproc \\\
     --enable-pthreads \\\
+    --enable-nvenc \\\

rpmbuild -ba ffmpeg.spec
cd ../RPMS/x86_64
yum install ffmpeg-3.0.0-3.el7.centos.x86_64.rpm ffmpeg-libs-3.0.0-3.el7.centos.x86_64.rpm libavdevice-3.0.0-3.el7.centos.x86_64.rpm

QSV対応に比べれば、遥かに楽な手順で環境を準備出来た。RPMで作ったのでドライバさえ入っていれば、パッケージのインストールだけでnvencの機能を利用可能となる。一応ソフトウェアエンコードなどの処理を試してみたが、今までの検証と処理時間に大差なかったので、いつも通りのffmpegが出来たと思う。早速、いつも通りアメトーク60分を録画した6.5GBのTSファイルを使って検証。まずはbitrateを指定しないエンコード。

time ffmpeg -y -i ame.ts -f mp4 -vcodec nvenc -s 1280x720 -vf yadif -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 4 ame_nvenc.mp4

16分で終わり、900MB弱のmp4ファイルが出来た。画質はサイズ相当なので使い物にはならない。ちなみに、ffmpeg-2.6.8だとこの処理が23分かかったので、3.0.x系の方が処理効率が向上している模様。とりあえず最新版を使っておくつもりでよいかも。続いて、bitrateを大きめに設定してエンコード。

time ffmpeg -y -i ame.ts -f mp4 -vb 5000k -vcodec nvenc -s 1280x720 -vf yadif -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 4 ame_nvenc.mp4

処理時間は17分で2GBほどのmp4ファイルが出来た。やはり性能や品質についてはWindowsと同等という結果になった。結論としては、環境面の自由度とffmepgでの処理性能が高いNVENCを使っていく方向で当面は考える。最近のCPUで性能面の改善がなされていれば、PCIスロットを必要としないQSVにも一定の魅力は感じる。一番の難としてはkernelを細かく限定されてしまう事。厳密にはどのkernelで動かす事ももちろん可能だが、ただでさえ利用者の少ない環境を更に推奨環境以外にしてしまうと、ネットの知見を活用する事が極めて難しくなってしまう。そういう意味でもPCIスロットさえあればどのノードでも動かせるNVENCは、やはり利用環境としての敷居が低いので、皆さん使ってみませんか?w 2スロット厚が許されるならh265のハードウェアエンコードまで出来てしまうだろうし。GTX950とかsz170R8とか欲しいなあw

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)