Captures the Windows Desktop via Desktop Duplication API.
The filter exclusively returns D3D11 Hardware Frames, for on-gpu encoding or processing. So an explicit hwdownload is needed for any kind of software processing.
It accepts the following options:
- output_idx
-
DXGI Output Index to capture.
Usually corresponds to the index Windows has given the screen minus one, so it’s starting at 0.
Defaults to output 0.
- draw_mouse
-
Whether to draw the mouse cursor.
Defaults to true.
Only affects hardware cursors. If a game or application renders its own cursor, it’ll always be captured.
- framerate
-
Maximum framerate at which the desktop will be captured - the interval between successive frames will not be smaller than the inverse of the framerate. When dup_frames is true (the default) and the desktop is not being updated often enough, the filter will duplicate a previous frame. Note that there is no background buffering going on, so when the filter is not polled often enough then the actual inter-frame interval may be significantly larger.
Defaults to 30 FPS.
- video_size
-
Specify the size of the captured video.
Defaults to the full size of the screen.
Cropped from the bottom/right if smaller than screen size.
- offset_x
-
Horizontal offset of the captured video.
- offset_y
-
Vertical offset of the captured video.
- output_fmt
-
Desired filter output format. Defaults to 8 Bit BGRA.
It accepts the following values:
- auto
-
Passes all supported output formats to DDA and returns what DDA decides to use.
- 8bit, bgra
-
8 Bit formats always work, and DDA will convert to them if necessary.
- 10bit, x2bgr10
-
Filter initialization will fail if 10 bit format is requested but unavailable.
- dup_frames
-
When this option is set to true (the default), the filter will duplicate frames when the desktop has not been updated in order to maintain approximately constant target framerate. When this option is set to false, the filter will wait for the desktop to be updated (inter-frame intervals may vary significantly in this case).
Examples
Capture primary screen and encode using nvenc:
ffmpeg -f lavfi -i ddagrab -c:v h264_nvenc -cq 18 output.mp4
You can also skip the lavfi device and directly use the filter. Also demonstrates downloading the frame and encoding with libx264. Explicit output format specification is required in this case:
ffmpeg -filter_complex ddagrab=output_idx=1:framerate=60,hwdownload,format=bgra -c:v libx264 -crf 18 output.mp4
If you want to capture only a subsection of the desktop, this can be achieved by specifying a smaller size and its offsets into the screen:
ddagrab=video_size=800x600:offset_x=100:offset_y=100