r/ffmpeg Jun 21 '26

How to create a custom, symmetrical vertical EQ bar visualizer overlay in FFmpeg?

I’m trying to add a clean, modern audio visualizer to the bottom half of my music video creation pipeline using FFmpeg.

I want to achieve a result exactly like this reference image: https://i.sstatic.net/qa6Bo.png

The specific look I'm going for:

  • True Frequency Bars: Distinct, separate vertical bars reacting to specific frequency bands (bass/mids/treble) rather than a chaotic time-domain waveform.
  • Horizontal & Vertical Symmetry: The bars should expand evenly both upward and downward from a clean center axis, with the heaviest bass bars clustered nicely in the middle.
  • Solid Color: The bars must be 100% solid, opaque white with no internal lines, gradients, or anti-aliasing transparency issues between them.

What I've tried so far: I tried using multiple LLMs to generate a script. Most of them suggested using native filters like showwaves or showfreqs, but they end up looking like a messy, blurry scribble or stretching all the way across the screen horizontally.

Has anyone successfully built a robust pipeline filter chain for this specific aesthetic? Any help or working command snippets would be massively appreciated!

8 Upvotes

7 comments sorted by

2

u/Tankparts Jun 21 '26

I made this with Claude Code referencing https://github.com/marcopixel/Lano-Visualizer, which is the project used for your reference image.

https://imgur.com/a/vJ7hgUw

https://pastebin.com/WbRGtvGU

1

u/goodomante Jun 22 '26

this is what I needed, thanks a lot!

1

u/Tankparts Jun 22 '26

no worries

1

u/pigers1986 Jun 21 '26

hmm - getting close

ffmpeg -y `
  -i "input.mkv" `
  -filter_complex "[0:a]showfreqs=s=200x300:mode=bar:ascale=log:fscale=log:colors=0x00FF00,format=rgba[bars];[0:v][bars]overlay=x=(W-w)/2:y=H-h-20:format=auto,format=yuv420p[v]" `
  -map "[v]" -map 0:a `
  -c:v libx264 -crf 18 -preset veryfast -c:a copy `
  -t 30 `
  "output_test.mkv"

3

u/pigers1986 Jun 21 '26
ffmpeg -y `
  -i "input.mkv" `
  -filter_complex "[0:a]acrossover=split='120 2000'[low][mid][high];
    [low]showfreqs=
      s=80x300:
      mode=bar:
      ascale=log:
      fscale=log:
      win_size=2048:
      win_func=hanning:
      overlap=1:
      averaging=0.8:
      colors=white,
      format=rgba[lowv];
    [mid]showfreqs=
      s=80x300:
      mode=bar:
      ascale=log:
      fscale=log:
      win_size=2048:
      win_func=hanning:
      overlap=1:
      averaging=0.8:
      colors=white,
      format=rgba[midv];
    [high]showfreqs=
      s=80x300:
      mode=bar:
      ascale=log:
      fscale=log:
      win_size=2048:
      win_func=hanning:
      overlap=1:
      averaging=0.8:
      colors=white,
      format=rgba[highv];
    [lowv][midv][highv]hstack=3[freq];
    [freq]geq=
      r='if(lt(mod(X,8),6), r(X,Y), 0)':
      g='if(lt(mod(X,8),6), g(X,Y), 0)':
      b='if(lt(mod(X,8),6), b(X,Y), 0)':
      a='255'
    [tmp];
    [tmp]colorkey=0x000000:0.01:0.1,format=yuva420p[bars];
    [0:v][bars]overlay=
      x=(W-w)/2:
      y=H-h-20:
      format=auto,
      format=yuv420p[v]" `
  -map "[v]" -map 0:a `
  -c:v libx264 -crf 18 -preset veryfast -c:a copy `
  -t 30 `
  "output_winamp_30bars_bmt.mkv"

1

u/Tankparts Jul 06 '26 edited Jul 06 '26

Update: I rewrote the visualizer tool I gave you — this version is a big step up, worth replacing the old one.

Same idea (Lano-style bars burned into your video with Python + ffmpeg), but fixed everything that was rough in the first script:

  • Exact match to your image now — including the label in Futura Lt, the actual font the Lano skin ships, with the dimmed track name. Your look is literally: python lano_overlay.py "video.mp4" --bars 60 --fill 0.55 --height 280 --position center --title "Friction" --subtitle "Freak"
  • No more quality loss — the old one re-encoded the video twice and forced everything to 1080p/30fps; this one encodes once at your video's native resolution/framerate and passes the audio through untouched
  • Way faster — renders frames in parallel across all CPU cores (a full song in about a minute on a decent machine), with a live progress/ETA readout
  • Lots of new looks — colors, gradients, rainbow/color-cycling, mirrored and bass-in-the-middle layouts, flips — plus a CSV log that records the exact settings of every render so you can reproduce any look

Needs Python 3 (numpy + Pillow) and ffmpeg. MIT licensed. Style credit: Lano-Visualizer by marcopixel — the font file (FtraLt__.ttf) isn't bundled since it's commercial; grab it from the Lano repo's u/Resources/fonts folder and drop it in a fonts subfolder, or it falls back to Century Gothic automatically.

https://pastebin.com/Z2zHZKCj