Old home-video cameras, low-light phone footage, and high-ISO stills converted to video all carry temporal noise — random pixel changes between adjacent frames. hqdn3d is a high-quality 3D denoiser that averages each pixel against its neighbors in space and time, smoothing the noise while preserving real motion.

The command

ffmpeg -i noisy.mp4 -vf hqdn3d=4:3:6 -c:v libx264 -crf 20 out.mp4

What it does

The filter takes three numbers: spatial luma strength, spatial chroma strength, and temporal strength. Larger values mean stronger denoising at the cost of fine detail. The default `4:3:6` is a good starting point; raise the temporal value (third) to clean up grain that flickers between frames, raise the spatial values to soften general noise.

Requirements

Any container FFmpeg can read. hqdn3d is a CPU filter built into libavfilter, so no GPU is required. Encoding is done with your normal encoder; hqdn3d only changes the source frames the encoder sees.

Things to avoid

  • Setting all three values very high. Heavy temporal denoising leaves a 'smear' on fast motion; heavy spatial denoising softens textures like skin and grass. Start low.
  • Using hqdn3d on already-clean footage. It will not improve it and may introduce softness on edges.
  • Confusing hqdn3d with nlmeans. nlmeans is slower but preserves more detail; hqdn3d is fast and good enough for most use cases.
  • Applying it to a stream that is already interlaced. Deinterlace first, then denoise — denoising an interlaced stream introduces inter-field artifacts.