NVEncで超高速エンコードにFFmpeg, AviUtl, Adobe Media Encoderで挑戦
2018/04/07
動画を高速に変換しよう!
NVIDIAのGPUを利用したハードウェアエンコード機能「NVEnc」。CUDAによるエンコードの後継となるもので、CPUに負荷をかけることなく高速にエンコードができます。(光の速さは言い過ぎですけどね)
今回はNVEncをテストしてみようとしましたが、まだ対応しているソフトが少なくてなかなか簡単にはいきませんでした。
※追記 再挑戦でうまくいきました↓
目次
FFmpeg
FFmpegは動画/音声を変換するフリーソフトです。元々はUNIX系OSのものでしたが、Windows向けのビルドもあるので、Windowsでも気軽に利用できます。
ffmpegはすでにNVEncを利用できるようになっているとの情報があったので試してみました。ちょっと前までは公式のビルドに入っていなかったので自前でビルドする必要があったようですが、今は公式で配布されているビルドでも使えるようになっていました。
ffmpeg[N-80335-gcb46b78]でNVEncできるか試してみました。
mtsファイルはエラー
試しに、ソニーのビデオカメラで撮影したMTSファイル(AVCHD形式から取り出した動画ファイル)をmp4(h.264)にエンコードしてみました。
ffmpeg.exe -i test.mts -vcodec nvenc test.mp4
が、残念ながらエラーが出てしまいました。
次の色の問題もあったので、原因を追究することなく諦めました。
iPhoneのmov動画は色がおかしくなった
次に、iPhoneで撮影したmovファイルを試してみました。
ffmpeg.exe -i test.mov -vcodec nvenc test.mp4
こちらはエラーにはなりませんでした。
例えば、iPhone 6で撮影した2分の動画(1920×1080)を以下の環境で1280×720のh.264に変換してみたところ、わずか15秒で完了しました。同じ動画をx264で変換すると1分10秒かかりました。5倍速ですよ!
CPU | Intel Core i5-6600K 4C/4T 3.5-3.9GHz |
---|---|
メモリ | DDR4-2133 48GB |
グラフィック | NVIDIA GTX960 + 2GB (ASUS製グラフィックボード) |
問題は完成したファイルの色がおかしいことです。変換前後の動画サムネイルをご覧ください。
これじゃ使い物になりませんね。ひこにゃんも真っ青(いや緑か)です。
どちらの問題もやっかいそうなので、諦めることにしました。コマンドラインが使いやすいのでffmpegを使いたかったんですけどねぇ。
Adobe Media Encoderにプラグイン追加
有志がプラグインを作ってくれているそうです。
https://2e5bdca9e0f522872725008d3981a21c7be35bc5.googledrive.com/host/0B96CRWkNxmWdODdiQ05QS1l0M0U/
最新は1.11のようです。
使い方は以下のサイトに詳しく載っています。
Adobe Premiere Pro CC 2014でNVENC-exportを使ってみました。 - 映像雑記帳(唯我独尊)
ただし、Adobe Media Encoder CC 2015でのプラグイン(nvenc_export.prm)のコピー先は
Program Files\Adobe\Common\Plug-ins.0\MediaCore\
でした。
プラグインが正常に配置されると、Media Encoder上ではインストール操作などは必要なくNVEncが使用できるようになります。
サイズを変えると遅くなる
ハードウェアエンコードに期待するのは何よりまず速さでしょう。このプラグインでは動画のサイズを変更すると途端に遅くなってしまいました。
FFmpegと同じ2分間のmov動画をそのまま(1920×1080のまま)h.264に変換すると、35秒で完了しました。
一方、1280×720にすると、1分25秒かかりました。元々あるH.264のソフトウェアエンコードで1280×720にした場合でも1分30秒で終わるので、ほとんど変わらないということになります。
エンコードではエラー頻発
Media EncoderでNVEncを使用できるようになったものの、少しエンコード設定を変えるだけでエラーがかなり頻発してしまいました。
特にh.265(HEVC)ではデフォルトの設定でもエラーが出てしまいました。
あまりにエラーに遭遇する率が高すぎるので、これでエンコードの速度や品質がどうかを評価するのは難しいと判断しました。まだまだ発展途上なんでしょうかね……。
AviUtlにプラグイン追加
フリーの映像編集ソフト「AviUtl」に出力プラグインを入れることでNVEncを使った出力ができるようになります。編集せずにエンコード目的に使えばNVEnc対応エンコーダとして使うことができます。
以下のサイトでNVEnc出力のプラグインが配布されています。
カクカクする
例によって2分のMOVファイルを読み込ませてh.264で出力したところ、約35秒で完了しました。
ですが、再生してみると5 fpsくらいのカクカクした動画になってしまいました。ffprobeでは29.97 fpsになっているので動画ファイルとしてはfpsは正しいようですが、中の絵がちゃんと描かれていないようです。
AVI出力では滑らかに再生されるのでプラグイン(か私の環境との相性)の問題のようです。
設定を詰めれば解決できそうな問題ではありますが、エンコード速度が他の方法ほど速くないのが苦しいところ。
まとめ
NVEncを使うべく、3通り試してみましたがどれも思わしい結果にはなりませんでした。
動画のハードウェアエンコードではファイルサイズに対する品質の低さ(あるいは品質に対するサイズの大きさ)が課題だと言われていますが、今回のテストでは品質以前の問題で挫折することになってしまいました。
ゲームをプレイしながらストリーミング中継するような場面では、高速なハードウェアエンコードが活躍するのでしょうが、単に持っている動画を変換する目的ならおとなしくソフトウェアエンコードの完了を待った方が良さそうです。
ゲームをしないのであまり活かせていないGPUを活用しようと思いましたが、思わしい成果を上げられませんでした。
※追記 再挑戦でうまくいきました↓