|
All checks were successful
CI / build-and-test (push) Successful in 31s
The PCMs16 FourCC was 0x73334d50, which is the little-endian packing of the bytes 'P','M','3','s' — not the intended 'P','C','M','s'. NDI packs FourCCs little-endian (cf. BGRA = 0x41524742 = bytes 'B','G','R','A'), so 'P','C','M','s' is 0x734D4350. Effect of the bug: any legacy Teams/NDI sender delivering 16-bit PCM audio fell through AudioPeakComputer.ComputePeak's switch to the unknown branch and reported 0.0, so the operator VU meter read silent for those sources even when audio was present. FLTP (the common NDI 6 format) was unaffected. The existing tests passed because they referenced the symbol rather than the literal, so the wrong value was self-consistent in-test. |
||
|---|---|---|
| .forgejo/workflows | ||
| docs | ||
| installer | ||
| src | ||
| .editorconfig | ||
| .gitignore | ||
| build-and-test.ps1 | ||
| CHANGELOG.md | ||
| coverlet.runsettings | ||
| Directory.Build.props | ||
| Dragon-ISO.Linux.slnf | ||
| Dragon-ISO.sln | ||
| Dragon-ISO.Windows.slnf | ||
| README.md | ||
TeamsISO
Per-participant NDI ISO controller for Microsoft Teams.
TeamsISO sits between Microsoft Teams' raw NDI broadcast output and a live-production environment. It receives each participant's NDI stream, normalizes framerate / resolution / aspect / audio per a configured target, and re-emits clean, individually-addressable NDI sources for ingestion by a switcher — vMix, OBS, Ross, hardware capture.
Status: v1.0.0 — first general release. Windows only. Requires Microsoft Teams (with NDI broadcast enabled) and the NDI 6 runtime.
What it does
- Discovers participants as Teams broadcasts each one over NDI. Cleans the Teams-prefixed source name down to a readable display name.
- Normalizes feeds to a consistent framerate, resolution, aspect mode, and audio routing — so the downstream switcher gets predictable inputs regardless of what each participant's webcam is doing.
- Routes per-participant as separate NDI sources with a configurable per-row output name. Default is the speaker's display name; override inline in the participants table.
- Records each ISO to disk simultaneously — raw BGRA +
manifest.json- FFmpeg
convert.cmd— so post-production gets a clean per-guest archive.
- FFmpeg
- Embeds Teams orchestration: launch / stop Teams, hide its UI windows during a show, drive in-call controls (mute, camera, share, leave, raise hand) without leaving the operator console.
- Operator presets save the current per-participant ISO assignment and custom output names, applicable on next launch automatically.
- Live preview thumbnails in the participants table, plus pop-out floating preview windows for multi-monitor monitoring.
- External control surface — REST + WebSocket on
127.0.0.1:9755and OSC on UDP127.0.0.1:9000for Bitfocus Companion / Stream Deck / TouchOSC. Self-contained HTML panel at/uifor phone-as-controller. - Theme-aware — dark and light palettes, system-following or pinned. The Wild Dragon mark and watermark flip to match.
Install
Grab the latest MSI from the
Releases page,
double-click, and accept the install prompts. Per-machine install under
C:\Program Files\Wild Dragon\TeamsISO.
Prerequisites:
- Windows 10 / 11, 64-bit
- .NET 8 Desktop Runtime
- NDI 6 Runtime (the installer warns if missing but does not block — operators can stage the app before NDI is rolled out)
- Microsoft Teams (NDI broadcast enabled in admin policy)
Configure
First-run defaults work for most setups. If your downstream switcher needs a particular framerate / resolution / NDI group routing, open the gear icon in the header to access the settings drawer:
- Output — framerate, resolution, aspect mode, audio routing
- Network — NDI discovery and output group names
- App — recording paths, startup behavior, theme
Per-participant overrides — click the CFG column gear on any row to override framerate / resolution / aspect / audio for just that participant.
Keyboard shortcuts
| Key | Action |
|---|---|
F1 |
Open help / cheat sheet |
Ctrl + K (or Ctrl + P) |
Open the command palette |
Ctrl + T |
Toggle theme (dark ↔ light) |
Ctrl + M |
Drop a timestamped marker into every active recording |
Ctrl + Shift + S |
Stop every running ISO (emergency) |
Ctrl + R |
Refresh NDI discovery (rebuild finder) |
1–9 / NumPad 1–9 |
Toggle the Nth visible participant's ISO |
File locations
| Path | Contents |
|---|---|
%APPDATA%\TeamsISO\config.json |
Engine settings (framerate, NDI groups, etc.) |
%LOCALAPPDATA%\TeamsISO\presets.json |
Saved operator presets + auto-apply preference |
%LOCALAPPDATA%\TeamsISO\logs\ |
Rolling daily diagnostic logs |
%LOCALAPPDATA%\TeamsISO\Notes\ |
Per-day show-notes markdown files |
%USERPROFILE%\Videos\TeamsISO\<date>\ |
Default recording output |
%APPDATA%\NDI\ndi-config.v1.json |
NDI Access Manager group routing |
Documentation
- Control surface API — REST, WebSocket, and OSC reference with curl recipes and a Companion config example.
- Real-time recording — recorder format, manifest schema, and the FFmpeg conversion path.
- Releasing — tag-push workflow and MSI signing.
Build from source
Requires the .NET 8 SDK on Windows. WPF is the only host.
dotnet restore TeamsISO.Windows.slnf
dotnet build TeamsISO.Windows.slnf -c Release
dotnet test TeamsISO.Windows.slnf --filter "Category!=ndi&requires!=ndi"
Or use the included helper:
pwsh -File .\build-and-test.ps1
To produce a fresh MSI:
dotnet publish src\TeamsISO.App\TeamsISO.App.csproj `
-c Release -r win-x64 --self-contained false `
-o publish\TeamsISO
dotnet build installer\TeamsISO.Installer.wixproj -c Release
# Output: installer\bin\x64\Release\TeamsISO-Setup-<version>.msi
License
Proprietary, © Wild Dragon LLC 2026. All rights reserved.