Cross-platform Qt/C++ show-control video app inspired by ProVideoPlayer workflows.
- Cue list with metadata:
- target screen
- target set (
Selected Screen, per-screen set, orAll Screens) - layer
- loop
- preload flag
- hotkey
- timecode trigger
- MIDI note mapping
- DMX channel/value trigger mapping
- cue-level transition override
- transition styles (
Cut,Fade,Dip To Black,Wipe Left,Dip To White) - cue filter chain (
mpv vf) - cue filter preset binding
- live input source URL
- auto-follow action (follow row + delay)
- playlist actions (playlist id, auto-advance, loop, delay)
- auto-stop timer
- Program output engine:
- multi-screen full-screen outputs
- per-screen layered playback
- transitions (
Cut,Fade,Dip To Black) - per-screen edge blend + keystone controls
- per-screen output mask controls (left/top/right/bottom)
- fallback slate on errors/stopped state
- operator text overlay (
OSC /text)
- Preview/program workflow:
- preview window
Taketo program with selected transition
- Project persistence:
- save/load
.show(JSON structure) - cues, transition settings, control config, calibrations
- relative media path mode for portable projects
- save/load
- Control inputs:
- OSC UDP server
- Art-Net DMX input listener (OpDmx/universe routing)
- MIDI input (optional RtMidi build)
- timecode trigger routing (from OSC
/timecodeor MIDI MTC quarter-frame) - DMX-style trigger input via OSC
/dmx <channel> <value>
- Backup trigger:
- optional HTTP POST when a cue goes live
- optional UDP failover sync (cue-live/stop-all/overlay replication with shared-key auth)
- Utility workflow:
- add color-bars test-pattern cues
- relink missing media files in loaded projects
- Optional NDI hook:
- compile-time abstraction with SDK detection
- Optional Syphon/SDI hooks:
- compile-time bridge toggles with SDK/header detection
- Packaging/deployment baseline:
- CPack config for macOS DMG and Windows ZIP/NSIS
Required:
- CMake
>= 3.21 - Qt 6 (
Core,Gui,Widgets,Network) libmpv
Optional:
- RtMidi (
HAVE_RTMIDI) for direct MIDI input - NewTek NDI SDK (
HAVE_NDI_SDK) for NDI initialization path
brew install cmake qt mpv pkg-config
# optional
brew install rtmidi- Install Qt 6 via Qt Maintenance Tool.
- Install mpv dev package (or use
vcpkg+ CMake toolchain). - Optional: install/build RtMidi and NDI SDK.
- For signed releases, install Windows SDK
signtool.exeand import your signing cert.
cmake -S . -B build-default -DCMAKE_BUILD_TYPE=Debug
cmake --build build-default -jPreset-based builds:
cmake --preset dev-debug
cmake --build --preset dev-debug
cmake --preset sanitizer-debug
cmake --build --preset sanitizer-debugRun tests:
ctest --preset dev-debug
# or
ctest --preset sanitizer-debugCurrent smoke test:
project_serializer_smokevalidates save/load roundtrip for cues, calibration, and app config.
- Use the bug report form at
/Users/liammarincik/projects/liams-projects/videoplayerforme/.github/ISSUE_TEMPLATE/bug_repro.ymlwhen filing issues. - Follow
/Users/liammarincik/projects/liams-projects/videoplayerforme/docs/repro-checklist.mdto gather reproducible steps, environment details, and validation command output.
macOS bundle executable:
./build-default/VideoPlayerForMe.app/Contents/MacOS/VideoPlayerForMeServer listens on configured UDP port (default 9000).
Supported addresses:
/cue/play <row>/cue/preview <row>/cue/preload <row>/cue/take/cue/stop_all/timecode <HH:MM:SS:FF>/dmx <channel> <value>/text <message>(empty to clear)
Text-command fallback (non-binary OSC datagrams) is also accepted:
play 3preview 3preload 3takestopalltimecode 01:00:00:00dmx 1 255text Live lyrics
Space: preview selected cueEnter: take preview liveG: play selected cue liveCtrl+L: preload selected cueS: stop selected layerShift+S: stop allUp/Down: selection1..9: preview cue row 0..8Shift+1..9: play cue row 0..8 live- Cue-specific hotkeys can be set in cue properties.
cmake --build build-default --target packageGenerated artifacts depend on OS and installed packaging tools.
Use the PowerShell automation in /Users/liammarincik/projects/liams-projects/videoplayerforme/packaging/windows.
Unsigned build/package example:
pwsh -ExecutionPolicy Bypass -File packaging/windows/build-windows-release.ps1 `
-SourceDir . `
-BuildDir build-win `
-InstallDir build-win/install `
-Generator Ninja `
-QtPrefixPath "C:/Qt/6.8.2/msvc2022_64" `
-MpvRuntimeDll "C:/mpv/mpv-2.dll"Signed build/package example:
$env:SIGNTOOL_PATH = "C:/Program Files (x86)/Windows Kits/10/bin/10.0.26100.0/x64/signtool.exe"
$env:SIGN_CERT_THUMBPRINT = "<YOUR_CERT_THUMBPRINT>"
pwsh -ExecutionPolicy Bypass -File packaging/windows/build-windows-release.ps1 `
-SourceDir . `
-BuildDir build-win `
-InstallDir build-win/install `
-Generator Ninja `
-QtPrefixPath "C:/Qt/6.8.2/msvc2022_64" `
-MpvRuntimeDll "C:/mpv/mpv-2.dll" `
-EnableSigningSee /Users/liammarincik/projects/liams-projects/videoplayerforme/packaging/windows/README.md for details.