GPU-accelerated video processing with ffmpeg
Solution 1:
FFmpeg provides a subsystem for hardware acceleration, which includes NVIDIA: https://trac.ffmpeg.org/wiki/HWAccelIntro
In order to enable support for GPU-assisted encoding with an NVIDIA GPU, you need:
- A supported GPU
- Supported drivers for your operating system
- The NVIDIA Codec SDK
- ffmpeg configured with
--enable-nvenc
(default if the drivers are detected while configuring)
Solution 2:
Quick use on supported GPU:
CUDA
ffmpeg -hwaccel cuda -i input output
CUVID
ffmpeg -c:v h264_cuvid -i input output
Full hardware transcode with NVDEC and NVENC:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -c:v h264_nvenc -preset slow output
If ffmpeg was compiled with support for libnpp, it can be used to insert a GPU based scaler into the chain:
ffmpeg -hwaccel_device 0 -hwaccel cuda -i input -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow output.mkv
Source: https://trac.ffmpeg.org/wiki/HWAccelIntro
Solution 3:
As Mike mentioned, ffmpeg wraps some of these HW-accelerations. You should use it instead of going for more low-level approaches (official NVIDIA libs) first!
The table shows, that NVENC is probably your candidate.
But: Be careful and do some benchmarking. While GPU-encoders should be very fast, they are also worse than CPU ones in comparison to visual quality.
The thing to check here is: Does a GPU-encoder compete with a CPU-encoder when some quality at some given bitrate is targeted? I would say no no no (except for very high bitrates or very bad quality), but that's something which depends on your use-case. GPU-encoding is not a silver-bullet providing only advantages.