ffmpeg 2.6 から使える nvenc をコンパイルする方法。

FFmpeg / libav | NVIDIA Developer
NVIDIA VIDEO CODEC SDK | NVIDIA Developer

hardware acceleration の Wiki:HWAccelIntro – FFmpeg

関連記事
qsv 対応の ffmpeg をつくる
AMD VCE 対応の ffmpeg をつくる

追記 2017年5月10日
SDK 8.0.14 にアップデートされた。新機能は

  • 10/12-bit decoding support with HEVC/VP9, enabling end-to-end HDR transcoding
  • Improved quality via weighted prediction
  • Support for OpenGL inputs (Linux only)

ドライバーのバージョンは
NVIDIA Linux display driver 378.13 以上
NVIDIA Windows display driver 378.66 以上

compat/nvenc: bump nvEncodeAPI.h to Video Codec SDK 8.0.14 – ffmpeg.git/commitdiff
avcodec/nvenc: add weighted prediction support – ffmpeg.git/commitdiff
avcodec/nvenc: add fractional CQ support – ffmpeg.git/commitdiff

準備

現在は cofigure に –disable-nvenc をつけなければ有効化されていたが、master では このコミット以降 はヘッダをインストールしないと有効化されなくなった。

  1. まずは ffmpeg の ソースコードNVidia headers をダウンロードする
  2. nv-codec-headers のフォルダに移動し make install PREFIX=/usr して、lib, include をインストールする
  3. ffmpeg の cofigure に –disable-nvenc を付けなければ自動で有効化する
  4. SDK を使ったリサイズフィルタ scale_npp を使うにはツールキットをインストールして include, lib64 フォルダをリンクし、–enable-libnpp –enable-nonfree をつける。詳しくは 公式, 1, 2 を参照
  5. SDK を使ったリサイズフィルタ scale_cuda も利用できる。cuda.h をリンクし –enable-cuda-sdk –enable-nonfree をつける。コンパイルに cl.exe とツールキットの bin フォルダにある nvcc.exe が必要(未確認)

タイトルの通りに nvenc なので Nvidia のグラフィックボードを搭載していないとエンコードできない。ドライバーが古いと新しいSDK のバージョンを使った ffmpeg で使えない。さらに特定の(価格帯の安い)グラフィックボードでも nvenc が使えないことがあるのでよく調べること。

公式に対応しているグラフィックボードは以下のリンクを参照。
NVENC – Hardware-Accelerated Video Encoding | NVIDIA Developer
NVDEC – Hardware-Accelerated Video Decoding | NVIDIA Developer
Video Encode and Decode GPU Support Matrix | NVIDIA Developer

オプション内容

v 8.0 より
ffmpeg -h encoder=h264_nvenc

実際にエンコードできる環境がないので設定を煮詰められないがビットレートを上げる以外で画質の直結する設定は preset が大きい。

H.264 オプション日本語訳

  • preset
    • hq, medium, default
      high quality の略:既定値
    • hp, fast
      high performance の略
    • bd
      ブルーレイディスク用のエンコード
    • ll
      LOW_LATENCY_DEFAULT(低遅延)
    • llhp
      LOW_LATENCY_HP(低遅延で高性能)
    • llhq
      LOW_LATENCY_HQ(低遅延で高画質)
    • slow
      hq 2pass
    • lossless
      可逆圧縮
    • losslesshp
      可逆圧縮の高圧縮モード
  • profile
    プロファイル指定。high, main, baseline or high444p。既定値:main
  • levlel
    レベル指定。auto, 1.0 … 5.1 まで。既定値:auto
  • cbr
    固定ビットレートモード。既定値:0
  • 2pass
    2パス CBR モード。既定値:auto
  • gpu
    グラフィックボードを2枚差し以上にしている場合にどれを使うか指定する。
    0 は既定値、1 は2枚目、以下同様。
  • delay
    指定フレームだけ出力結果を遅らせる。0 から。既定値:0

エンコード例

ffmpeg -i input -vcodec nvenc_h264 ouput.mkv
画面下半分の色がおかしくなる場合は -pix_fmt nv12 をつける
ffmpeg -i input -vcodec nvenc_h264 -pix_fmt nv12 ouput.mkv
実際にエンコードする場合は、rc, qmin, qmax を併用して品質指定をする
ffmpeg -i input -vcodec nvenc_h264 -pix_fmt nv12 -rc constqp -qmin 20 -qmax 26 ouput.mkv

nvenc が使えるようになった commitdiff
avcodec: Add NVENC encoder : git.videolan.org Git
H.264 だけではなく H.265(HEVC) にも対応した commitdiff
avcodec/nvenc: Add support for H.265 encoding : git.videolan.org Git

H.265(HEVC) オプション

ffmpeg -h encoder=hevc_nvenc

デコード例

入力データの前にデコーダを指定する。無指定だとソフトウェアデコードになる。
ffmpeg -vcodec h264_cuvid -i input
そのほかのハードウェアデコーダ

  • hevc_cuvid
  • mjpeg_cuvid
  • mpeg1_cuvid
  • mpeg2_cuvid
  • mpeg4_cuvid
  • vc1_cuvid
  • vp8_cuvid
  • vp9_cuvid

更新履歴

追記 2016年4月28日
master で –enable-nonfree が不要になり配布バイナリに含められるようになった。
configure: Don’t require nonfree for nvenc : git.videolan.org Git – ffmpeg.git/commitdiff

追記 2016年8月29日
master で API 7.x に対応し、ffmpeg に組み込まれたので nvEncodeAPI.h のコピーが不要になった。ffmpeg で NVENC を使うのに SDK をダウンロードする必要がなくなったが、SDK をダウンロードするにはアカウント作成が必要になった。API 7.x で rc-lookahead のオプションと、Pascal generation GPU(GTX 1060、GTX 1070、GTX 1080)から HEVC 10-bit エンコードが追加された。それ以外の新機能が ffmpeg に実装されているかは未確認。API 7.x の新機能は以下の通り。

  • HEVC 8K (8192 pixels x 8192 pixels) encoding *
  • HEVC 4:4:4 encoding *
  • HEVC 10-bit encoding *
  • HEVC lossless encoding *
  • HEVC Sample Adaptive Offset (SAO) *
  • HEVC Motion-Estimation-(ME)-only mode *
  • HEVC (up to 8K) decoding *
  • VP9 (up to 8K) decoding *
  • HEVC long term reference (LTR) frame support
  • Asynchronous H.264 Motion-Estimation-(ME)-only mode
  • Look-ahead
  • Improved H.264 spatial adaptive quantization
  • H.264 temporal adaptive quantization
  • Rate control and quality improvements

* は Pascal generation GPU(GTX 1060、GTX 1070、GTX 1080)からの新機能になる

avcodec/nvenc: include nvEncodeAPI v7 SDK header : git.videolan.org Git
avcodec/nvenc: added support for 10 bit HEVC encoding : git.videolan.org Git
avcodec/nvenc: added support for rate control lookahead : git.videolan.org Git

追記 2017年10月4日
品質指定するエンコード例を追加した。
追記 2017年11月29日
対応グラフィックボードのリンクに変更した。不要な追記文章を削除した。
追記 2018年3月4日
自動で有効化しなくなったのを追記。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)