Title here
Summary here
TK Dynamic Delay uses HLS (HTTP Live Streaming) segment-based buffering with playlist manipulation to achieve an adjustable delay from 0 to 180 seconds.
┌──────────────────────────────────────────────────────────────┐
│ OBS Studio │
│ Settings → Stream: Twitch (Primary Output to Viewers) │
│ Tools → Multiple output: SRT to localhost:9000 (Buffer) │
└──────────────────────────────────────────────────────────────┘
│ Port 9000 (SRT)
▼
MediaMTX Server
│ HLS Segments (2s)
▼
Buffer Storage (C:\ProgramData\StreamDelay\hls)
│ Playlist Manipulation
▼
Controller Service
│ Port 8080 (HTTP)
▼
┌──────────────────────────────────────────────────────────────┐
│ OBS Studio — Scene Switching │
│ → Live Scene: Immediate (viewers see this on Twitch) │
│ → Delayed Scene: Media Source (delayed.m3u8) — past moments │
└──────────────────────────────────────────────────────────────┘Purpose: Manages the MediaMTX process lifecycle and monitors stream health.
| Detail | Value |
|---|---|
| Implementation | services/input-receiver-mediamtx/main.go |
| Service Name | StreamDelayInput |
| Display Name | Stream Delay Input Receiver |
| Start Type | Automatic (Delayed Start) |
Key Responsibilities:
.env filePurpose: REST API server, web dashboard host, and HLS playlist manipulator.
| Detail | Value |
|---|---|
| Implementation | controller/main.go (~921 lines) |
| Service Name | StreamDelayController |
| Display Name | Stream Delay Controller |
| Start Type | Automatic |
Key Responsibilities:
delayed.m3u8 from live.m3u8 every 2 secondsPlaylist Manipulation Algorithm:
live.m3u8delaySeconds / segmentDurationsegments[:len-skipCount])delayed.m3u8Purpose: User-friendly browser interface for delay control.
| Detail | Value |
|---|---|
| Implementation | controller/dashboard.html (embedded via //go:embed) |
| URL | http://localhost:8080 |
Features:
Purpose: Convert SRT input to HLS segments.
| Detail | Value |
|---|---|
| Binary | mediamtx.exe v1.8.5 |
| SRT Port | 9000 |
| HLS Port | 8888 |
| API Port | 9997 |
| Segment Duration | 2 seconds |
| Buffer Size | 100 segments |
Purpose: Elevated setup utility run during MSI installation.
Functions:
| Decision | Rationale |
|---|---|
| HLS over Direct Buffering | Segments naturally support variable delay; disk-based = no memory pressure; standard format supported by OBS |
| Two Separate Services | Separation of concerns; can restart independently |
| No Authentication | Localhost-only reduces risk; simpler OBS configuration |
| Native Go Windows Services | No external dependencies; proper event logging; graceful shutdown |
| Embedded Dashboard | Zero external files; atomic deployment |
| Metric | Value |
|---|---|
| CPU (idle) | < 1% |
| CPU (streaming) | 15–30% total |
| Memory (Controller) | ~50 MB |
| Memory (Input Receiver) | ~30 MB |
| Memory (MediaMTX) | ~80 MB |
| Total system latency (0s delay) | ~4–5 seconds minimum |
| Delay adjustment latency | ~4–6 seconds |
| Path | Contents |
|---|---|
C:\Program Files\StreamDelay\ | Executables |
C:\ProgramData\StreamDelay\.env | Configuration |
C:\ProgramData\StreamDelay\hls\ | HLS segments & playlists |
C:\ProgramData\StreamDelay\logs\ | Service log files |
TKDynamicDelay/
├── controller/ # Controller service (Go)
│ ├── main.go # REST API, HLS manipulation
│ ├── dashboard.html # Embedded web UI
│ └── build.ps1, go.mod
├── services/
│ └── input-receiver-mediamtx/ # Input service (Go)
│ ├── main.go # MediaMTX wrapper
│ └── build.ps1, go.mod
├── bootstrapper/ # MSI bootstrapper (Go)
│ └── main.go, build.ps1, go.mod
├── msi/ # MSI installer (WiX)
│ └── Product.wxs
├── DOC/ # Documentation
├── build-all.ps1 # Full build script
├── build-msi.ps1 # MSI-only build
├── install-prerequisites.ps1 # Dev environment setup
└── README.md