Nodes/DJZ-Nodes/VHS Effect v1
ComfyUI Node

VHS Effect v1

The OG VHS degradation node — tape hiss, waves, and a black edge

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 78
VHS Effect v1
  • images
  • IMAGE
luma_compression_rate1.0
luma_noise_sigma30
luma_noise_mean0
chroma_compression_rate1.0
chroma_noise_intensity10
vertical_blur1
horizontal_blur1
border_size1.7
generations3

You want a video that looks like it spent twenty years in a basement next to a VCR. That's this node. VHS_Effect_v1 is DJZ-Nodes' first-generation VHS simulation, and while the pack has since shipped v2 and v3 with fancier signal-chain math, v1 is still the one people search for - partly because it's simple, partly because it nails the fundamentals with a handful of sliders.

What it does under the hood

Feed it an IMAGE batch and it processes each frame by splitting into luma (brightness) and chroma (color), in YCrCb space. The trick is that it treats the two like a real composite tape signal:

  • Luma compression - squashes the frame horizontally, adds Gaussian noise, and rescales it back, recreating that blocky, soft brightness channel.
  • Chroma compression - the same squeeze/noise/restore cycle but on color, which gives you the bleeding, undersampled color you remember from VHS.
  • Wave distortion - a sine-wave horizontal wobble per row, plus a random "switch noise" that jolts rows out of place, like a tracking problem.
  • A black line is cut down the right edge at border_size percent of width - that signature tape-edge artifact.

The catch is that none of this is seeded, so the noise regenerates every run. If you need a repeatable shot, batch it and freeze the result, because there's no seed input here (that's a V2-era fix).

The inputs that matter

Ten sliders, but you'll live in a handful:

  • luma_noise_sigma / luma_noise_mean - the grainy static in the brightness channel. Default sigma 30 is already visible; push toward 60+ for heavy snow.
  • chroma_noise_intensity - random RGB channel dithering. This is what makes colors look like a degraded copy.
  • luma_compression_rate / chroma_compression_rate - how hard the horizontal squeeze is. 1.0 is no compression; higher values eat more horizontal resolution.
  • vertical_blur / horizontal_blur - the final softness, which sells the whole effect.
  • generations - how many passes of the compression pipeline to run. More passes = more degraded. Default 3 is a good middle ground; 1 is nearly clean, 10 is mush.
  • border_size - the width of that black tape edge.

Output is a single IMAGE tensor at the same resolution, ready for any encoder or save node.

Installing

It's one node in the big DJZ-Nodes pack from Drift Johnson. Install the pack once and you get all of its effects:

cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt

Or just search "DJZ-Nodes" in ComfyUI Manager. The VHS nodes need opencv-python, which is in the pack's requirements.

Honest advice

Between the three VHS generations, v1 is the "no thinking required" one - you get classic tape artifacts from two or three sliders. v2 is more realistic (real filter-based ringing and tape-speed models) but fiddlier, and v3 adds noise lines and band distortion on top of v2. If your clip is supposed to be "old home video," start here, set generations to 2-3, and only reach for v2/v3 when v1's output feels too uniform. The one real gotcha: no seed means the same settings give you different static every run, which is annoying if you're iterating on a specific frame.

Categoryimage/effects

Inputs (10)

NameTypeDefaultDescription
imagesIMAGE
luma_compression_rateFLOAT1.00.1–10
luma_noise_sigmaFLOAT300–100
luma_noise_meanFLOAT0-50–50
chroma_compression_rateFLOAT1.00.1–10
chroma_noise_intensityFLOAT100–50
vertical_blurINT11–21
horizontal_blurINT11–21
border_sizeFLOAT1.70–10
generationsINT31–10

Outputs (1)

NameTypeDescription
IMAGEIMAGE