Ultralight IP CAM Viewer
Ultra-light multi-camera RTSP viewer and recorder: dozens of cameras on one slow PC or server
A Windows-first, dependency-light IP-camera monitoring application written in C11 on FFmpeg and SDL2: it shows up to dozens of RTSP cameras in a matrix grid, records each stream to hourly...

A Windows-first, dependency-light IP-camera monitoring application written in C11 on FFmpeg and SDL2: it shows up to dozens of RTSP cameras in a matrix grid, records each stream to hourly MPEG-TS segments with an archive cap, plays back history on a scrubbable timeline, drives ONVIF PTZ heads from the mouse, and exposes a C plugin ABI for frame/audio analysis.
Built for a real client's warehouse/workshop site (15 cameras in the shipped settings.ini), it ships as a portable exe + SDL2.dll with a statically linked minimal FFmpeg, plus MSI/MSIX installers and a separate plugin MSI.
The whole point is weight: a static minimal FFmpeg build and one worker thread per camera mean it runs on very slow PCs and servers and handles far more IP cameras per machine than typical NVR software.
What it does
- Multi-camera matrix grid with per-camera worker threads, double-click expand, preview/main stream switching, warm pre-buffering and cached thumbnails for instant startup
- Continuous recording to 1-hour MPEG-TS segments (recordings/<cam>/<dd.MM.yyyy>/<start__end>.ts) via a fully asynchronous per-camera recorder that never blocks decode; archive trimmer enforces a MaxArchiveGB cap
- 'Time machine' DVR playback (F9): scans recordings into a coverage index, bottom timeline strip with pan/zoom, seek, 1x paced playback overdrawn onto the live tile
- ONVIF integration: device probe, media profile discovery, PTZ ContinuousMove/Stop with WS-Security digest auth, driven from a dedicated thread with a one-slot mailbox and safety watchdog
- In-app camera manager, settings and plugin manager overlays (F1/F2/F10), EN/RU i18n, intro help overlay, settings.ini persisted by a background writer
- Plugin system: versioned C ABI (magic/abi/size-checked structs), plugins receive YUV420P frames and S16 audio and return overlay rectangles; shipped Face Counter plugin detects, re-identifies and counts faces per day with no external libraries
- Robustness: SEH crash logging, UI-hang watchdog thread, RTSP open-throttle semaphore (avoids NVR handshake bursts), startup trace log, automatic reconnect
- Packaging: static minimal FFmpeg build script, portable dist (exe + 2 DLLs), WiX MSI, MSIX with test cert, separate plugin installer
17k lines of hand-written C with a clear threading discipline: one worker per camera, per-camera locks, decode threads never touch disk, UI thread only peeks. Hand-rolled ONVIF/SOAP client with WS-Security digest (no gSOAP). DVR scrubbing over hourly TS segments with exact-span filenames renamed on close. A stable, extensible C plugin ABI and a from-scratch face detection/re-identification plugin (pico cascade + LBP histograms, zero dependencies). Custom minimal static FFmpeg shrinks the distributable to an exe + SDL2.dll. Real deployment for a client site with 15 cameras.
Want something like this?
I build it live on a Zoom call, you watch the screen, the timer stops when you say stop. First 15 minutes are free.