NVEncで超高速エンコードにFFmpegで再挑戦!今度はうまくいった!
2018/04/07
動画を高速に変換しよう!
NVIDIAのGPUを利用したハードウェアエンコード機能「NVEnc」。CUDAによるエンコードの後継となるもので、CPUに負荷をかけることなく高速にエンコードができます。(光の速さは言い過ぎですけどね)
前回は結局うまくいきませんでしたが、今回再挑戦してうまくいきましたよ!
目次
前回失敗した原因
明確な原因が分かっているわけではありませんが、使っているグラフィックボードのドライバーを更新したらうまく実行できるようになりました。
私が使っているグラフィックボードはNVIDIAのGTX960を搭載しています。現在使っているGPUのドライバーは376.53。2017年3月29日現在の最新バージョンは378.92ですが、そちらはまだ試していません。
GPUドライバーの更新だけでうまく実行できるようになりましたが、ついでにFFmpegの方も新しくしています。現在使っているバージョンは[N-81784-g92de2c2]です。
FFmpeg
前回うまくいかなかったMTSファイル(AVCHD形式から取り出した動画ファイル)も、問題なくエンコードできました。
前回と少し異なるのは、「-vcodec」に指定するコーデック名です。
コーデック | -vcodec | |
---|---|---|
CPUエンコード | NVEnc | |
H.264 (MPEG-4 AVC) | libx264 | h264_nvenc |
H.265 (HEVC) | libx265 | hevc_nvenc |
ffmpeg.exe -i test.mts -vcodec h264_nvenc test.mp4
ちゃんとエンコードできました。
前回と同じく、iPhone 6で撮影した2分の動画(1920×1080)を以下の環境で1280×720のh.264に変換してみたところ、x264の5倍速となる、わずか15秒で完了しました。
CPU | Intel Core i5-6600K 4C/4T 3.5-3.9GHz |
---|---|
メモリ | DDR4-2133 48GB |
グラフィック | NVIDIA GTX960 + 2GB (ASUS製グラフィックボード) |
色の問題も発生せず
変換後に色がおかしくなる、通称「ひこにゃん問題」(いま名付けた)も発生しなくなりました。
H.264だけでなく、H.265(H.264より圧縮・再生負荷は高いが、同等画質で高い圧縮率になる)でも正常にエンコードできました。
オプションは基本的にlibx264などと同じ
エンコード時に指定できるオプションはlibx264やlibx265のものがほとんどそのまま使えます。
アーカイブ目的なら十分に実用的
ハードウェアエンコードなので、画質に関してはソフトウェアエンコード(libx264などのCPUエンコード)にはやや劣ります。ですが圧倒的に高速なので、目的によっては十分に実用的だと思います。
例えば「録画したテレビ番組で、見終わったので高画質で保存しておくほどではないが、削除するのは忍びないもの」みたいなコンテンツを残しておくには、超高速でエンコードできるNVEncを利用する価値は十分にあるでしょう。あるいはPC上に保存してある動画をiPhoneやiPadなど向けに縮小して持ち出すといった用途でも活用できると思います。
CPU使用率は50~60%
CPUエンコードのようにCPU使用率が100%に張りつくということはありませんが、前述の環境でフルHD動画をエンコードするとCPU使用率は50~60%程度で推移しました。CPUを全然使わず、というわけにはいきませんが、この程度の使用率ならエンコード中は重くてPCが使えないということもありません。他の作業をしている間に裏で動画エンコードを走らせるというのも十分実用的なレベルです。
画質
フルHD・30秒の動画を各コーデックでエンコードしたときの画質とエンコード時間は以下の通りです。
コーデック | 画質 (SSIM) |
エンコード時間 | |
---|---|---|---|
CPUエンコード | libx265 | 94.56% | 41.7 秒 |
libx264 | 94.37% | 19.6 秒 | |
NVEnc | hevc_nvenc | 93.64% | 5.8 秒 |
h264_nvenc | 93.63% | 5.8 秒 |
ただし上の表の画質評価指標が正しく計算されているかはやや疑問です。実際に見た感じは以下の通り。
- 画質:libx265 > libx264 ≧ hevc_nvenc > h264_nvenc
- H.264よりH.265の方がブロックノイズが出にくい分劣化が小さく見える
- 全体の画質はNVEncよりCPUエンコードの方が上
まとめ
今回はちゃんと使えるようになりましたね! 圧倒的に高速なので用途を選べば十二分に活用できると思います。
私は長期的に保存する用途としては画質面でCPUエンコードを使いますが、映画などを一時的にiPhoneに入れて持ち出すときにはNVEncを使っています。iPhone用なら再生負荷や汎用性の観点でH.264の方が向いていますから、「h264_nvenc」で適当にファイルサイズを小さくしています。