ffmpeg 4.3から使えるフィルタ。GPUを取り付けていると使えるVulkanフィルタのまとめ。4.5から使える予定のlibglslangとlibplaceboも使ったlibplaceboフィルタがあり、こちらは使えるオプションがかなり多い。6.1より新しいバージョンはffplayでもvulkanデコードに対応した。

vlukanのハードウェア支援を受けた汎用フィルタlibplacebo

media-autobuild_suiteは2020年6月8日に対応:ffmpeg: support libglslang and vulkan

ハードウェア支援フィルタのまとめ
CUDA を使ったハードウェアアクセレーションフィルタのまとめ

以下のコマンドでGPUが対応しているか調べられる。
ffmpeg -hide_banner -v verbose -init_hw_device vulkan

avgblur_vulkan ブラー

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。ffmpeg 6.1ではplanesを書き換えると色がおかしくなるが、ffmpeg 7.0では直っている。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,avgblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

平均ブラー avgblur
FFmpeg Filters Documentation : avgblur_vulkan

オプション

  • sizeX[int]
    横軸のカーネルのサイズ。大きい値ほどぼける
    既定値:3
    範囲:1から32まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点を参照
    既定値:15(すべてのチャンネル)
    範囲:0 から 15 まで
  • sizeY[int]
    縦軸のカーネルのサイズ
    既定値:3
    範囲:1から32まで

bwdif_vulkan インターレース解除

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。対応しているのはH264、HEVC、AV1だけで、MPEG2はvulkanデコードに対応していない
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

インターレースを解除する bwdif
FFmpeg Filters Documentation : bwdif_vulkan

オプション

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

chromaber_vulkan 色収差

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

彩度の座標をずらすchromashift
FFmpeg Filters Documentation : chromaber_vulkan

オプション

彩度を上下左右にずらす。

  • dist_x[float]
    プラスで右に、マイナスで左にずれる
    既定値:0
    範囲:-10から10まで
  • dist_y[float]
    プラスで下に、マイナスで上にずれる
    既定値:0
    範囲:-10から10まで

gblur_vulkan ガウシアンブラー

映像をぼかすガウシアンブラー。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,gblur_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,gblur_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

ガウシアンブラー gblur
FFmpeg Filters Documentation : gblur_vulkan

オプション

  • sigma[float]
    水平シグマの指定
    既定値:0.5
    範囲:0.01から1024まで
  • sigmaV[float]
    垂直シグマの指定
    既定値:0
    範囲:0から1024まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点を参照
    既定値:15(すべてのチャンネル)
    範囲:0から15まで
  • size[int]
    カーネルサイズの指定
    既定値:19
    範囲:1から127まで

nlmeans_vulkan デノイズ

ハードウェア支援を行うがそれでも処理は重たい。nlmeansフィルタは輝度と彩度を別にフィルタリングできたがこちらは個別にフィルタリングできない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,nlmeans_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,nlmeans_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

非局所平均のデノイザ nlmeans
FFmpeg Filters Documentation : nlmeans_vulkan

オプション

  • s[double]
    全コンポーネントのノイズ除去強度
    既定値:1
    範囲:1から100まで
  • p[int]
    全コンポーネントのパッチサイズ
    既定値:7
    範囲:0から99まで
  • r[int]
    探索窓の半径
    既定値:15
    範囲:0から99まで
  • t[int]
    並列処理
    既定値:36
    範囲:1から168まで
  • s1[double]
    1番目のコンポーネントのノイズ除去強度
    既定値:1
    範囲:1から100まで
  • s2[double]
    2番目のコンポーネントのノイズ除去強度
    既定値:1
    範囲:1から100まで
  • s3[double]
    3番目のコンポーネントのノイズ除去強度
    既定値:1
    範囲:1から100まで
  • s4[double]
    4番目のコンポーネントのノイズ除去強度
    既定値:1
    範囲:1から100まで
  • p1[int]
    1番目のコンポーネントのパッチサイズ
    既定値:0
    範囲:0から99まで
  • p2[int]
    2番目のコンポーネントのパッチサイズ
    既定値:0
    範囲:0から99まで
  • p3[int]
    3番目のコンポーネントのパッチサイズ
    既定値:0
    範囲:0から99まで
  • p4[int]
    4番目のコンポーネントのパッチサイズ
    既定値:0
    範囲:0から99まで

overlay_vulkan オーバーレイ

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -hwaccel cuda -hwaccel_output_format cuda -i input2.mp4 -filter_complex "[0:v]hwdownload,format=nv12,hwupload[0v];[1:v]hwdownload,format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -hwaccel cuda -hwaccel_output_format cuda -i input2.mp4 -filter_complex "[0:v]hwdownload,format=nv12,hwupload[0v];[1:v]hwdownload,format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]format=nv12,hwupload[0v];[1:v]format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]format=nv12,hwupload[0v];[1:v]format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

映像の上に映像をのせる overlay
FFmpeg Filters Documentation : overlay_vulkan

オプション

  • x[string]
    オーバーレイする映像の左上の横座標。W、H、t、nなどは使えない
  • y[string]
    オーバーレイする映像の左上の縦座標。W、H、t、nなどは使えない

scale_vulkan リサイズ

iw, ihの書式が使えるので手軽に半分の解像度の指定ができる。ただし片方に-nが使えないのでアスペクト比に合わせたリサイズはできない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,scale_vulkan=1280:720,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,scale_vulkan=1280:720,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,scale_vulkan=1280:720,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,scale_vulkan=1280:720,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

リサイズする scale
Zライブラリを使ったリサイズフィルタ zscale

オプション

  • w[string]
    出力解像度の横幅。-nが使えない
    既定値:”iw”(入力横幅)
  • h[string]
    出力解像度の縦幅。-nが使えない
    既定値:”ih”(入力縦幅)
  • scaler[int]
    • 0, bilinear:Bilinear interpolation (fastest)。既定値
    • 1, nearest:Nearest (useful for pixel art)
  • format[string]
    出力フォーマットの指定
  • out_range[int]
    • 1, limited, mpeg, tv
    • 2, full, jpeg, pc

transpose_vulkan 回転

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,transpose_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,transpose_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

ピクセル数はそのままに映像を回転させる transpose
FFmpeg Filters Documentation : transpose_vulkan

オプション

  • dir[int]
    回転方向の設定
    • 0, cclock_flip:反時計回りに90度回転し上下反転。既定値
    • 1, clock:時計回りに90度回転
    • 2, cclock:反時計回りに90度回転
    • 3, clock_flip:時計回りに90度回転し上下反転

h|vflip_vulkan 反転

左右反転するhflip_vulkanフィルタと、上下反転するvflip_vulkanフィルタ。オプション指定はない。

NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,hflip_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,hflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,vflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,vflip_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,vflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4

上下左右を入れ換える vflip, hflip

コメントを残す

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

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