D3D11経由なので同じメモリ上からエンコードできるNVENC, AMFのエンコーダには処理が速くなる。Windowns向けのDesktop Duplication APIを使う。
- NVENC:ffmpeg に nvenc(cuda)をインストールする
- AMF:AMD VCE 対応の ffmpeg をつくる
- wiki:Capture/Desktop – FFmpeg
- 従来の方法:ffmpeg 単体で画面キャプチャができる gdigrab
基本コマンド
ソフトウェアフィルタは使えるが、ハードウェア支援のフィルタにつなげる方法がわからない。今までは使えてたのに、同じコマンドでも以下のエラーなどが出て使えなくなることがあるも解決方法がわからない。
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=video_size=1920x1080:framerate=30000/1001,hwdownload,format=bgra -c:v hevc_nvenc -tune lossless -pix_fmt gbrp -color_range pc output.mp4
bgraからgbrp変換にGPU支援がなくて現状は処理落ちする可能性が高い。
ffmpeg -init_hw_device d3d11va -thread_queue_size 4096 -filter_complex ddagrab=video_size=3840x2160:framerate=60,hwdownload,format=bgra -c:v hevc_nvenc -preset p2 -tune ll -2pass false -g 240 -b:v 80M -maxrate 100M -profile:v rext -rgb_mode 2 -colorspace 0 -color_range pc -color_primaries 1 -color_trc 13 -pix_fmt gbrp 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
音声も同時に録画するなら以下のコマンドでデバイス名を調べてdshow経由で取り込む。
ffmpeg -list_devices true -f dshow -i dummy
具体例:
- 千円HDMIキャプチャ、Y&H HDMIキャプチャカード
- ffmpeg で同じ種類のウェブカメラを2台同時利用する
- rdp/virtual-audio-capture-grabber-device: free audio capture device to capture all the “wave out sound” that is playing on your speakers (i.e. record what you hear) for Windows Vista+. Releases downloadable in this package:
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