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

bilateral_cuda スムーズ

ネイティブフィルタ:エッジ保持のスムースフィルタ bilateral

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

オプション

  • sigmaS[float]
    既定値:0.1
    範囲:0.1から512まで
  • sigmaR[float]
    既定値:0.1
    範囲:0.1から512まで
  • window_size[int]
    既定値:1
    範囲:1から255まで

bwdif_cuda インターレース解除

ネイティブフィルタ:インターレースを解除する bwdif
フレームを間引くならフィルタの最後にdecimateフィルタを追加する。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "bwdif_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,bwdif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

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

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

オプション

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

  • 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
      インターレースフラグがあるのだけ

chromakey_cuda クロマキー

ネイティブフィルタ:ffmpeg でクロマキー合成 その2

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

オプション

  • color[color]
    既定値:black
  • similarity[float]
    既定値:0.01
    範囲:0.01から1まで
  • blend[float]
    既定値:0
    範囲:0から1まで
  • yuv[boolean]
    既定値:false

colorspace_cuda レンジ変換

色空間変換はまだ実装されていない。
ネイティブフィルタ:色空間変換するcolorspace

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

オプション

  • range[int]
    既定値:0
    • 1, tv, mpeg
    • 2, pc, jpeg

overlay_cuda オーバーレイ

ネイティブフィルタ:映像の上に映像をのせる overlay

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 -init_hw_device cuda=cuda -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i input.mp4 -hwaccel cuda -hwaccel_output_format cuda -i rot_text.png -filter_complex "[1]hwupload_cuda[rot];[0]scale_cuda=format=yuv420p[vid];[vid][rot]overlay_cuda=x=(W-w)/2:y=(H-h)/2" -c:v h264_nvenc output.mp4

画像をオーバーレイする。
video – Ffmpeg rotate drawtext with hwaccel – Super User

公式ドキュメント: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

scale_cuda リサイズ

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

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_cuda=-2:720:interp_algo=lanczos:format=nv12,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:format=nv12,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

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

オプション

  • w[string]
    出力解像度の横幅。-nが使える
    既定値:”iw”(入力横幅)
  • h[string]
    出力解像度の縦幅。-nが使える
    既定値:”ih”(入力縦幅)
  • interp_algo[int]
    アルゴリズムの指定
    • 1, nearest
    • 2, bilinear
    • 3, bicubic
    • 4, lanczos
  • format[string]
    出力フォーマットの指定。無指定では変換しない。YUVとRGBの相互変換には対応していない
  • passthrough[boolean]
    Do not process frames at all if parameters match
    既定値:1(有効)
  • param[float]
    interp_algo=bicubic利用時のカーブに利用する
    既定値:999999
    範囲:-FLT_MAXからFLT_MAXまで
  • 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:format=nv12,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:format=nv12,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
  • force_original_aspect_ratio[int]
    アスペクト比を強制する
    • 0, disable:保持する。既定値
    • 1, decrease:切り捨て
    • 2, increase:繰り上げ
  • force_divisible_by[int]
    割り切れるピクセル数の倍数の指定。w、h-nを優先する
    既定値:1
    範囲:1から256まで
  • eval[int]
    w、hで指定した値どのように更新するか
    • 0, init:最初に決めたら更新しない
    • 1, frame:フレーム毎に更新。既定値

scale2ref_npp リサイズ

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:format=nv12[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:format=nv12[0][1];[1]nullsink" -map [0] -c:v hevc_nvenc -c:a copy output.mp4

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

sharpen_npp 先鋭化

オプション

  • border_type[int]
    • 2, replicate

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

transpose_npp 映像回転

ネイティブフィルタ:ピクセル数はそのままに映像を回転させる transpose

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

video – Accurately extract frames every N seconds using FFmpeg – Super User

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

オプション

thumbnailフィルタと同じ。

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

yadif_cuda インターレース解除

ネイティブフィルタ:一番メジャーなインターレース解除フィルタ yadif
フレームを間引くならフィルタの最後に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
      インターレースフラグがあるのだけ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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