この記事でわかること
- NVENCハードウェアエンコードの仕組みと前提条件
h264_nvencおよびhevc_nvencの基本的な使い方- プリセット・品質オプション(
-rc、-cq、-b:v)の選び方 - CPUソフトウェアエンコードとの速度・品質比較
- よくあるエラーと対処法
テスト済みバージョン: FFmpeg 6.1(NVIDIA GPU環境)
対象 OS: Windows / Linux(CUDAドライバーが必要)
NVENCとは
NVENCはNVIDIAのGPUに搭載されたハードウェアビデオエンコーダーです。CPUのソフトウェアエンコードに比べて大幅に高速で、CPUリソースをほぼ消費しません。その代わり、ソフトウェアエンコードより圧縮効率がやや劣る傾向があります。
| 項目 | NVENCハードウェア | libx264ソフトウェア |
|---|---|---|
| 速度 | 5〜10倍高速 | 基準 |
| CPU使用率 | 低い(GPU処理) | 高い |
| 圧縮効率 | やや劣る | 優秀 |
| 対応コーデック | H.264, H.265, AV1(RTX40以降) | H.264 |
前提条件
NVENCを使うには以下が必要です:
- NVIDIA GPU:Kepler世代(GTX 600)以降
- NVIDIA ドライバー:最新版を推奨(Linux: 520以上)
- FFmpegのNVENC対応ビルド:
ffmpeg -encoders | grep nvencでH264/HEVC NVENCが表示されることを確認
NVENCが有効かどうかの確認:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -encoders | grep nvenc
h264_nvencの基本コマンド
最もシンプルなNVENCエンコード:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy output_nvenc.mp4
品質パラメーター(-cq)を指定する場合(0〜51、低いほど高品質):
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -rc vbr -cq 23 -c:a aac -b:a 128k output_nvenc.mp4
hevc_nvenc(H.265)
同等の品質でH.264よりファイルサイズを削減できます:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v hevc_nvenc -rc vbr -cq 28 -c:a aac -b:a 128k output_hevc_nvenc.mp4
プリセット
NVENCのプリセットは速度と品質のバランスを制御します:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -rc vbr -cq 23 output.mp4
新しいドライバーでは -preset p1(最速)〜 -preset p7(最高品質)を使います。古いドライバーでは fast、medium、slow を使います。
| プリセット | 速度 | 品質 |
|---|---|---|
| p1 / fast | 最速 | 低め |
| p4 / medium | バランス | 普通 |
| p7 / slow | 遅い | 高い |
GPUデコード+NVENCエンコードの組み合わせ
GPUでデコードも行うことでCPU負荷をさらに下げられます:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -preset p4 -rc vbr -cq 23 output.mp4
-hwaccel_output_format cuda を指定することでGPUメモリ上のデコードフレームをそのままNVENCに渡せます。
ビットレート指定エンコード
特定のビットレートをターゲットにする場合:
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -rc cbr -b:v 4M -maxrate 4M -bufsize 8M output.mp4
よくあるエラーと対処法
No NVENC capable devices found
- NVIDIA ドライバーが古いかインストールされていない
nvidia-smiでGPUが認識されているか確認
NVENC: OpenEncodeSessionEx failed: out of memory (10)
- 他のプロセスがNVENCセッションを使い切っている
- Consumer GPU(GeForce)はNVENCの同時セッション数に制限がある場合がある(Quadro/RTXは制限なし)
Cannot load libcuda.so.1(Linux)
- CUDAライブラリのパスが通っていない
ldconfig -v | grep cudaで確認、または/usr/lib/x86_64-linux-gnu/にあるか確認
ソフトウェアエンコードとの使い分け
| 用途 | 推奨 |
|---|---|
| アーカイブ・高品質 | libx264 / libx265(ソフトウェア) |
| リアルタイム・ライブ配信 | NVENC |
| バッチ変換・時間優先 | NVENC |
| GPU非搭載環境 | ソフトウェアエンコード |
関連リソース
CRF・ビットレート・2 パスの設定を視覚的に調整して最適な圧縮コマンドを生成できるツールです。容量削減に迷ったときに役立ちます。
関連記事
一次ソース: trac.ffmpeg.org/wiki/HWAccelIntro / ffmpeg.org/ffmpeg-codecs.html
よくある質問
NVENC は libx264 と比べて画質はどう?
同じビットレートなら NVENC の方が若干劣ります。ただし最新の NVENC(Ada Lovelace 世代以降)は libx264 medium 相当まで肉薄しており、速度を考えると実用上は十分です。
NVENC が使えない
GPU が NVIDIA 製であること、ドライバが最新であること、FFmpeg ビルドに --enable-nvenc が含まれていることを確認してください。ffmpeg -encoders | grep nvenc で確認できます。
CRF と CQ どちらを使う?
NVENC では -cq を使います(-crf は libx264 用)。値の範囲は 0〜51 で、libx264 の CRF と同様に小さいほど高画質です。19〜23 が一般的です。
B-frame は使った方がいい?
はい、-b_ref_mode middle -bf 3 で B-frame を有効にすると圧縮効率が大きく改善します。古い NVENC(Pascal 以前)では B-frame 機能が制限されていることがあります。
NVENC でストリーミング配信できる?
はい、低遅延ストリーミングに最適です。-tune ll または -tune ull(ultra-low-latency)と -preset p1 の組み合わせで遅延を最小化できます。