D3D11経由なので同じメモリ上からエンコードできるNVENC, AMFのエンコーダには処理が速くなる。Windowns向けのDesktop Duplication APIを使う。

基本コマンド

ソフトウェアフィルタは使えるが、ハードウェア支援のフィルタにつなげる方法がわからない。今までは使えてたのに、同じコマンドでも以下のエラーなどが出て使えなくなることがあるも解決方法がわからない。
Requested output format unavailable.
Failed duplicating output

上のエラーはffmpegの入力オプションに-init_hw_device d3d11vaを使えばエラーがなくなりそうだった。

ffplayで再生。
ffplay -f lavfi -i ddagrab=video_size=1280x720,hwdownload,format=bgra

ffmpegで再生。
ffmpeg -init_hw_device d3d11va -f lavfi -i ddagrab=video_size=1280x720,hwdownload,format=bgra -f sdl -

リサイズする。
ffplay -f lavfi -i ddagrab=video_size=1280x720,hwdownload,format=bgra,scale=1024x576

scale_cudaフィルタでリサイズする。
ffmpeg -f lavfi -i ddagrab -vf hwdownload,format=bgra,format=yuv420p,hwupload_cuda,scale_cuda=w=960:h=540:format=yuv420p -c:v h264_nvenc -cq 18 output.mp4
ffmpeg -f lavfi -i ddagrab -vf hwdownload,format=bgra,format=yuv444p,hwupload_cuda,scale_cuda=w=960:h=540:format=yuv444p -c:v h264_nvenc -cq 18 output.mp4
ffmpeg -f lavfi -i ddagrab -vf hwdownload,format=bgra,format=yuv420p10le,hwupload_cuda,scale_cuda=w=960:h=540 -c:v hevc_nvenc -cq 18 output.mp4

CUDA を使ったハードウェアアクセレーションフィルタのまとめ
video – Performing nvidia gpu scaling on ffmpeg desktop captured using ddagrab (on Windows) – Super User

lavfiデバイス経由のh264_nvencでエンコードする。
ffmpeg -f lavfi -i ddagrab -c:v h264_nvenc -cq 18 output.mp4

yuv420pで出力するなら-pix_fmt nv12を追加する。
ffmpeg -init_hw_device d3d11va -f lavfi -i ddagrab,hwdownload,format=bgra -c:v hevc_nvenc -cq 18 -pix_fmt nv12 output.mp4

yuv420p10leで出力するなら-pix_fmt p010leを追加する。
ffmpeg -init_hw_device d3d11va -f lavfi -i ddagrab,hwdownload,format=bgra -c:v hevc_nvenc -cq 18 -pix_fmt p010le output.mp4

フィルタ経由のlibx264でエンコードする。
ffmpeg -filter_complex ddagrab,hwdownload,format=bgra -c:v libx264 -crf 18 -pix_fmt yuv420p output.mp4

yuv420p10leで出力するなら-pix_fmt yuv420p10leに変更する。
ffmpeg -filter_complex ddagrab,hwdownload,format=bgra -c:v libx264 -crf 18 -pix_fmt yuv420p10le output.mp4

nvencのRGB(GBRP)で出力するなら-pix_fmt gbrpを追加する。
ffmpeg -init_hw_device d3d11va -filter_complex ddagrab=framerate=30000/1001,hwdownload,format=bgra -c:v hevc_nvenc -tune lossless -pix_fmt gbrp -color_range pc output.mp4

libx264のRGBで出力するなら-c:v libx264rgbに変更する。
ffmpeg -filter_complex ddagrab=framerate=30000/1001,hwdownload,format=bgra -c:v libx264rgb -crf 0 -preset ultrafast -color_range pc output.mp4

ffmpeg – Is it possible to do a lossless colorspace HEVC NVENC encoding without hwdownload? – Super User

音声も同時に録画するなら以下のコマンドでデバイス名を調べてdshow経由で取り込む。
ffmpeg -list_devices true -f dshow -i dummy

具体例:

ffmpeg -f lavfi -i ddagrab=video_size=1280x720:framerate=30000/1001,hwdownload,format=bgra -f dshow -i audio="virtual-audio-capturer" -c:v libx265 -crf 25 -g 300 -c:a libopus -pix_fmt yuv420p10le -colorspace bt709 output.mp4

座標指定するときは領域を指定するvideo_sizeと、オフセット場所を指定するoffset_x、offset_yを併用する。
ffmpeg -filter_complex ddagrab=video_size=800x600:offset_x=100:offset_y=100,hwdownload,format=bgra -c:v libx264 -crf 18 -pix_fmt yuv420p output.mp4

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

オプション

  • output_idx[int]
    取り込み出力するインデックス。メインディスプレイが0でサブディスプレイが1以降になる
    既定値:0
    範囲:0からINT_MAXまで
  • draw_mouse[boolean]
    マウスカーソルを表示するかどうか
    既定値:1
  • framerate[video_rate]
    フレームレートの指定
    既定値:30
  • video_size[image_size]
    取り込む解像度の指定。横x縦形式とテキスト形式が使える。リサイズではない
    既定値:全画面
  • offset_x[int]
    横幅のオフセット値
    既定値:0
  • offset_yint]
    縦幅のオフセット値
    既定値:0
  • output_fmt[int]
    出力フォーマットの指定
    • 0, auto:既定値
    • 57, 8bit, bgra
    • 24, 10bit, x2bgr10
    • 10, 16bit, rgbaf16
  • allow_fallback[boolean]
    8ビットにフォールバックしたときにエラーを出さない
    既定値:0
  • force_fmt[boolean]
    フォーマットリストからBGRAを除外する。実験的な機能でMicrosoftは非推奨
    既定値:0

コメントを残す

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

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