NVIDIA GeForce GTX 1050のNVENCで動画を高速エンコード

「GeForce GTX 1050(GP107チップ搭載)」で動画をエンコードしてみたら強烈に速かった話です。

広告

動作環境

環境は以下の通りで、定格で稼働してます。

OSWindows 10 HOME 1803 64bit
CPUINTEL Core i5-650 @ 3.20GHz
GPUZOTAC GeForce GTX 1050 2GB Mini(Driver ver. 398.11)
メモリ8GB

GTX 1050にはデコーダー(NVDEC)とエンコーダー(NVENC)が実装されていて、それぞれがGPU(CUDAコア)とは別に動作します。これを使います。

検証用の動画

民生機(CANON iVIS HFM41)で撮影した動画をffmpegを使ってハードウェアエンコード(NVDEC + NVENC)とソフトウェアエンコード(CPU)とを比較します。動画は何も編集せず、ffmpegのオプションはcodec以外は無指定で変換しています。

フォーマットMPEG4-AVC/H.264、1920×1080
時間5分2秒
ビットレート23Mbps
ファイルサイズ830MB

変換結果

H.265/HEVC

H.265/HEVC 時間 fps ファイルサイズ
ソフトウェアエンコード0:19:45813.8MB
ハードウェアエンコード0:00:2932481.3MB

約40倍も違う。CPUが古いからか…。ソフトウェアだと実時間の4倍かかってますが、ハードウェアだと1/10と目の醒めるような速さです。一方、ファイルサイズは逆の開きがあります。ビットレートが23Mbps → 2Mbps(後述)なので双方ともファイルサイズはかなり縮小していますが、ソフトウェアはハードウェアの1/6程度になっています。

H.264

H.264 時間 fps ファイルサイズ
ソフトウェアエンコード0:11:461374.2MB
ハードウェアエンコード0:00:2242681.2MB

H.264の場合。ハードウェアはfpsが400を超えています。ファイルサイズは先のH.265のソフトウェアがさすがに圧倒的。圧縮率の違いがよく分かります。

動画データ

動画の情報をffmpegで見てみると…。ビットレートの指定なしだと、2Mbpsくらいになるようです。動きの少ない動画だったためか、再生しても違いがよく分からない…。

変換元

Duration: 00:05:02.82
Bitrate: 23016 kb/s
Video: h264 (High) (HDMV / 0x564D4448), yuv420p(top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s

変換後(H.265/HEVC)

Duration: 00:05:02.84
Bitrate: 2253 kb/s
Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, top coded first (swapped)), 1920x1080 [SAR 1:1 DAR 16:9], 2118 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 29.97 tbc (default)
Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)

変換後(H.264)

Duration: 00:05:02.84
Bitrate: 2250 kb/s
Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 2115 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)

ビットレート変更

では、ビットレート8Mbpsではどうでしょう。ffmpegのオプションに -b:v 8000k を追加してH.265へ変換してみます。

H.265/HEVC(8Mbps) 時間 fps ファイルサイズ
ソフトウェアエンコード0:40:414295MB
ハードウェアエンコード0:00:38241297MB

スピードは60倍の差ながらファイルサイズはほぼ同じでした。

CPU/GPUの負荷状況

ハードウェアでの変換時にタスクマネージャーで使用率を見ると以下のような感じです。元の動画をデコーダーがデコードしつつ、エンコーダーが全負荷でエンコードしている様が分かります。GPUは無負荷、左上のCPUは高みの見物中くらいな感じ。

システムの状況
ハードウェアデコード/エンコード

ffmpegのコマンドの例

もしエンコード中に動画を見るためにデコーダーを使いたいという場合は、エンコードだけハードウェアにする手もあります。

ハードウェアデコード(NVDEC)+ハードウェアエンコード(NVENC)の例
ffmpeg -y -hwaccel cuvid -vcodec h264_cuvid -i input.mts -vcodec hevc_nvenc output.mp4

ソフトウェアデコード(CPU)+ハードウェアエンコード(NVENC)の例
ffmpeg -y -i input.mts -vcodec hevc_nvenc output.mp4

青下線部分がハードウェアデコードの指定なので、それを外すだけです。下はソフトウェアデコード+ハードウェアエンコードしながら、YoutubeでVP9の8K60Pの動画を再生している状態です。先ほどとは違って、今度はデコーダーがYoutube動画のデコードで全負荷で動いています。左上のCPU使用率にも注目。CPUが変換元の動画をデコードしているのでCPU負荷が上がっています。デコードが遅いので、それを入力とするGPUの「Video Encode」は3割程度の負荷しかかかっていませ。

動画処理をハードウェアで行うとCPUもGPUも負荷が下がるので変換中も他のことが出来ます。デコードもエンコードもハードウェアで変換するフルハードウェアトランスコードなら、ffmpegでバッチを組んで録り溜めたファイルの一括変換なんかにいいかもしれませんね。

ということで、古いPCが最新ビデオカードの追加で爆速動画変換器にもなったお話でした。

コメント

タイトルとURLをコピーしました