m-ab-s/media-autobuild_suiteで調べたところ、–enable-ffnvcodec –enable-cuda –enable-cuvid –enable-nvenc –enable-nvdecを基本に、–enable-libnpp –enable-nonfreescale_npp, transpose_nppフィルタが使え、–enable-cuda-llvmの追加でscale_cuda、yadif_cuda、thumbnail_cuda、overlay_cudaフィルタが使える。

scale_cuda リサイズ

libnppを使わないリサイズフィルタ。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_cuda=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,scale_cuda=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -c:a copy output.mp4

公式ドキュメントはない。

オプション

  • w[string]
    出力解像度の横幅。-nが使える
    既定値:”iw”(入力横幅)
  • h[string]
    出力解像度の縦幅。-nが使える
    既定値:”ih”(入力縦幅)
  • interp_algo[int]
    アルゴリズムの指定
    • 1, nearest
    • 2, bilinear
    • 3, bicubic
    • 4, lanczos
  • passthrough[boolean]
    Do not process frames at all if parameters match
    既定値:1(有効)
  • force_original_aspect_ratio[int]
    アスペクト比を強制する
    • 0, disable:保持する。既定値
    • 1, decrease:切り捨て
    • 2, increase:繰り上げ
  • force_divisible_by[int]
    割り切れるピクセル数の倍数の指定。w、hの-nを優先する
    既定値:1
    範囲:1から256まで

scale_npp リサイズ

scale_cudaフィルタよりも使えるアルゴリズムが多い。同じアルゴリズムなら速度は変わらない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -c:a copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : scale_npp

オプション

  • w[string]
    出力解像度の横幅。-nが使える
    既定値:”iw”(入力横幅)
  • h[string]
    出力解像度の縦幅。-nが使える
    既定値:”ih”(入力縦幅)
  • format[string]
    出力フォーマットの指定
    既定値:”same”
  • interp_algo[int]
    アルゴリズムの指定
    • 1, nn:Nearest Neighbour
    • 2, linear:Linear
    • 4, cubic:Cubic
    • 5, cubic2p_bspline:2-parameter Cubic (B=1, C=0)
    • 6, cubic2p_catmullrom:2-parameter Cubic (B=0, C=1/2)
    • 7, cubic2p_b05c03:2-parameter Cubic (B=1/2, C=3/10)
    • 8, super:Supersampling
    • 16, lanczos:Lanczos

scale2ref_npp リサイズ

ffmpeg 4.5から使える予定。scale2refフィルタと同じように使う。オプションはscale_nppフィルタと同じ。1入力を2入力の解像度に揃えて2入力は出力しない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "scale2ref_npp=interp_algo=lanczos[0][1];[0]hwdownload,format=nv12[0];[1]nullsink" -map [0] -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "scale2ref_npp=interp_algo=lanczos[0][1];[1]nullsink" -map [0] -c:v hevc_nvenc -c:a copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : scale2ref_npp

sharpen_npp 先鋭化

ffmpeg 4.5から使える予定。

オプション

  • border_type[int]
    • 2, replicate

公式ドキュメント:FFmpeg Filters Documentation : sharpen_npp

yadif_cuda インターレース解除

フレームを間引くならフィルタの最後にdecimateフィルタを追加する。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "yadif_cuda" -c:v hevc_nvenc -c:a copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : yadif_cuda

オプション

yadifフィルタとオプション内容は同じ。

  • mode[int]
    モード指定
    • 0, send_frame
      2枚のフィールドから1枚のフレームを作る。既定値
    • 1, send_field
      1枚のフィールドから1枚のフレームを作る
      いわゆる片フィールド補間でフレーム数が2倍になる
    • 2, send_frame_nospatial
      0 に似ているが空間軸のチェックを行わない
    • 3, send_field_nospatial
      1 に似ているが空間軸のチェックを行わない
  • parity[int]
    フィールドタイプを指定する。自動で判断できなければ tff と判断する
    • 0, tff
      トップフィールドファースト
    • 1, bff
      ボトムフィールドファースト
    • -1, auto
      自動指定。既定値
  • deint[int]
    どのフレームを処理するか
    • 0, all
      すべて。既定値
    • 1, interlaced
      インターレースフラグがあるのだけ

transpose_npp 映像回転

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=format=yuv420p,transpose_npp=cclock_flip,hwdownload,format=yuv420p" -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=format=yuv420p,transpose_npp=cclock_flip" -c:v h264_nvenc -c:a copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : transpose_npp

オプション

transposeフィルタとオプション内容は同じ。

  • dir[int]
    回転方向の設定
    • 0, cclock_flip
      反時計回りに90度回転し上下反転。既定値
    • 1, clock
      時計回りに90度回転
    • 2, cclock
      反時計回りに90度回転
    • 3, clock_flip
      時計回りに90度回転し上下反転
  • passthrough[int]
    フィルタを当てた後の縦と横の解像度を比較して回転をそのままにするかやめるかの設定
    • 0, none
      なにもしない。既定値
    • 1, landscape
      横解像度が縦解像度以上になるとフィルタの効果を打ち消す
    • 2, portrait
      縦解像度が横解像度以上になるとフィルタの結果そのまま返す

thumbnail_cuda サムネイル出力

一定フレーム間隔で画像出力するときに使うフィルタ。考えられる用途はライブ配信サイトで見られるサムネイルの定期更新やVODのシークサムネイルが考えられる。しかしこのフィルタは-filter_complexで複数出力すると出力しなかったりで扱いが難しい。もしかして GPU の制限かもしれない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "thumbnail_cuda=2,hwdownload,format=nv12" -vframes 1 output.jpg
ffmpeg -hwaccel cuvid -c:v h264_cuvid -hwaccel_output_format cuda -i input -vf "thumbnail_cuda=1800,hwdownload,format=nv12" -vsync 0 output-%03d.jpg

NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,thumbnail_cuda=2,hwdownload,format=nv12" -vframes 1 output.jpg
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,thumbnail_cuda=1800,hwdownload,format=nv12" -vsync 0 output-%03d.jpg

ffmpeg ではデコードできない Animated WebPに出力。setptsフィルタの分数とthumbnail_cudaフィルタの値をそろえる。
ffmpeg -hwaccel cuvid -c:v h264_cuvid -hwaccel_output_format cuda -i input -vf "setpts=(PTS-STARTPTS)/300,thumbnail_cuda=300,hwdownload,format=nv12" -vsync 0 -vframes 100 -loop 0 output.webp

映像と音声の pts を扱う setpts, asetpts

動画出力しながらサムネイルも出力。fpsフィルタの値の逆数とthumbnail_cudaフィルタの値の積(例では10×10)から、その秒間隔で画像出力する。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -c:v libx264 -c:a copy output.mp4 -vf "fps=1/10,format=nv12,hwupload_cuda,thumbnail_cuda=10,hwdownload,format=nv12" -vsync 0 output-%03d.jpg

公式ドキュメントはない。

オプション

thumbnailフィルタと同じ。

n[int]
おおよそのフレーム間隔で出力する
既定値:100
範囲:2からINT_MAXまで

overlay_cuda オーバーレイ

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "overlay_cuda=x=100:y=200,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "overlay_cuda=x=100:y=200" -c:v hevc_nvenc -c:a copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : overlay_cuda

オプション

  • x[string]
    オーバーレイする映像の左上の横座標。評価式が使える
  • y[string]
    オーバーレイする映像の左上の縦座標。評価式が使える
  • eof_action[int]
    2入力した映像が終了したときの1入力した映像の挙動指定。framesync を参照
  • eval[int]
    x、yで指定した値どのように更新するか。2021年6月11日のコミット以降から使える
    • 0, init:最初に決めたら更新しない
    • 1, frame:フレーム毎に更新。既定値

評価式

ffmpeg で使える評価式を使って複雑な計算ができる。

  • main_w, W:1入力目の横の解像度
  • main_h, H:1入力目の縦の解像度
  • overlay_w, w:2入力目の横の解像度
  • overlay_h, h:2入力目の縦の解像度
  • x:xで指定した値
  • y:yで指定した値
  • n:1から始まるフレーム番号
  • pos:映像のバイトサイズの位置。不明ならNAN
  • t:0から始まるタイムスタンプ秒。1フレーム目の経過時間が最初の値になる。不明ならNAN

コメントを残す

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

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