待ちに待ったNVIDIAのGeForceが手に入ったので、いよいよNVENCの検証を進める。録画サーバ用に使っているSH67H3は電源容量とスロットに余裕がないので、省電力かつ1スロットのグラボが望ましい。elsaのGD750-2GERTSPというボードを使ってみる。うちのSH63H3は300W電源なので、それでも電源容量に不安があるため、一時的にSSDやメモリ、DVDドライブを外して最小構成に。NVENCの利用方法はffmpegを使う方法が多そうなので、Windows用のffmpegを用意する。どうやらLinuxでWindows用のffmpegをコンパイルできるらしい。ffmpeg-windows-build-helpersを使ってffmpegを準備する。
GD750-2GERTSP【税込】 エルザ PCI-Express x16対応 グラフィックスボードELSA GeForce GTX 750 Ti SP 2GB [GD7502GERTSP]【返品種別B】【送料無料】【RCP】
|
利用するLinuxはいつも通りCentOS7。NVIDIA VIDEO CODEC SDKに含まれるnvEncodeAPI.hを使うらしいので、公式よりダウンロードしておく。nvEncodeAPI.hを準備出来たら、ffmpeg-windows-build-helpersをgitで落として、コンパイルするという流れ。ちなみにコンパイルの処理はえらい長いので覚悟するように。具体的には以下。
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
git clone https://github.com/rdp/ffmpeg-windows-build-helpers.git
cd ffmpeg-windows-build-helpers
mkdir ffmpeg_build
cd ffmpeg_build
yum install pax hg texinfo cvs yasm cmake
wget https://raw.github.com/rdp/ffmpeg-windows-build-helpers/master/cross_compile_ffmpeg.sh
chmod 755 cross_compile_ffmpeg.sh
./cross_compile_ffmpeg.sh
自分は何度も失敗して試行錯誤する羽目になったんだけど、その場合はcurrentにできるsandboxディレクトリを削除してから再開。でないと半端に用意されたミドルウェアがうまく動作せずコンパイルに失敗してしまう。他に自分の環境で問題となったのは、libbs2b-3.1.0.tar.lzmaが展開できなかったこと。ロジック見るのも面倒だったので、tar.gzに圧縮し直してローカルのウェブサーバに置き、shell内のURLを書き換えてしまった。こんな感じ。
build_libbs2b() {
export ac_cv_func_malloc_0_nonnull=yes # rp_alloc failure yikes
- generic_download_and_install http://downloads.sourceforge.net/project/bs2b/libbs2b/3.1.0/libbs2b-3.1.0.tar.lzma
+ generic_download_and_install http://www.home.local/libbs2b-3.1.0.tar.gz
unset ac_cv_func_malloc_0_nonnull
}
同様にgmp-6.0.0a.tar.xzとbzip2-1.0.6.tar.gzのダウンロードも失敗する事が多かったので、ローカルに配置してURLを書き換えた。これは自分の環境起因かもしれないので、あえて変更する必要はない。うまくいくとsandbox/x86_64/ffmpeg_git_with_fdk_aacにffmpeg.exeが出来上がるので、それをWindows PCにコピーしておく。これでWindowsでNVENCを使う事が出来るようになった。いつも通りに、アメトーク60分を録画した6.5GBのTSファイルを使って検証。Linuxで実行したコマンドと同じものを試してみる。折角なのでソフトウェア・エンコードの処理時間から。
ffmpeg -y -i ame.ts -f mp4 -preset medium -crf 20 -tune film -vcodec libx264 -s 1280x720 -vf yadif -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 4 ame_sw.mp4
ffmpeg -y -i ame.ts -f mp4 -preset medium -crf 20 -tune film -vcodec libx264 -s 1280x720 -vf yadif -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 8 ame_sw.mp4
1番目の4スレッドでの処理が61分かかって1.94GBに圧縮。2番目の8スレッド処理は49分だった。サイズも処理時間もLinux時とほぼ一緒。handbrakeに比べてソフトウェア・エンコードが遅いのは、OSの問題ではなくffmpegの問題という事。続いて肝心のnvencの処理を試してみる。
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
何と18分で処理が終わり、872MBまで圧縮された。ただし、画質はお察しなので品質を上げる方法を模索する。NVENCの場合はbitrateを明示指定することで品質を変更出来た。具体的には以下のオプション。
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
これも処理時間18分のままで、圧縮後のサイズは1.96GB。ざっくりソフトウェア・エンコードと同等の品質になった。現時点ではNVENCによるエンコードは処理時間において非常に優秀という評価。ハードウェア的にもNVIDIAのグラボさえ刺さればいいので環境面のハードルは低い。あとはLinuxでの利用方法や性能が同等であれば言う事なし。次回はいよいよLinuxでの検証を行う。