How to Use the overlay_cuda Filter in FFmpeg
This article provides a straightforward guide on how to use the
overlay_cuda filter in FFmpeg for hardware-accelerated
video overlaying. You will learn the basic syntax, system requirements,
and practical command-line examples to overlay videos or images using
NVIDIA GPU acceleration.
Prerequisites
To use overlay_cuda, your system must meet the following
requirements:
- An NVIDIA GPU that supports NVDEC and NVENC.
- NVIDIA graphic drivers installed.
- A build of FFmpeg compiled with CUDA support (specifically enabling
--enable-cuda-nvccor--enable-ffnvcodecand--enable-libnpp).
Basic Command Structure
The overlay_cuda filter requires both input streams to
reside in CUDA device memory. If your inputs are decoded on the CPU, you
must upload them to the GPU using the hwupload_cuda filter.
If they are decoded on the GPU, they are already in the correct memory
space.
Here is the standard command for overlaying two hardware-decoded video streams:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i background.mp4 \
-hwaccel cuda -hwaccel_output_format cuda -i overlay.mp4 \
-filter_complex "[0:v][1:v]overlay_cuda=x=100:y=50[out]" \
-map "[out]" -c:v h264_nvenc output.mp4Key Parameters
- x: The horizontal position of the overlay video (defaults to 0).
- y: The vertical position of the overlay video (defaults to 0).
Unlike the CPU-based overlay filter,
overlay_cuda does not support complex math expressions
(like main_w - overlay_w) directly in the coordinates. You
must specify absolute pixel values.
Overlaying a Static Image (CPU to GPU Upload)
When overlaying a static image or a software-decoded video onto a hardware-decoded background, you must convert the format and upload the overlay to the GPU memory:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i background.mp4 \
-i logo.png \
-filter_complex "[1:v]format=nv12,hwupload_cuda[logo];[0:v][logo]overlay_cuda=x=10:y=10[out]" \
-map "[out]" -c:v h264_nvenc output.mp4In this command:
format=nv12converts the image to a pixel format compatible with CUDA processing.hwupload_cudauploads the converted image to the GPU.overlay_cudamerges the GPU-resident background and logo.