Trigger Video Playback from QLab Using OSC
QLab is already the timeline for your show — lighting, audio, projection. This guide adds video playback to that timeline by sending OSC cues from QLab to a DearScenario Player node on the network.
Why use DearScenario Player with QLab?
QLab has its own video playback engine, but it runs on the same Mac that manages your cue list. In exhibition and installation contexts, you often need video playing on a separate machine — a PC in a rack, a Raspberry Pi behind a screen, or multiple displays across a venue. DearScenario Player provides the remote player; QLab provides the timeline and cue logic.
Setup overview
- DearScenario Player node: Running on the playback machine (Windows or Raspberry Pi), connected to the display; set
network.enable_osctotrueand restart the player - QLab Mac: On the same network, sending OSC cues to the node’s IP and port
- Media files: Stored locally on the playback machine (DearScenario Player plays local files, not streamed from the Mac)
1. Configure the OSC destination in QLab
- Open Settings → Network in QLab
- Under Network Cue Destination Patches, add a new patch
- Set Destination to the DearScenario Player machine’s IP address (e.g.,
192.168.1.100) - Set Port to
18290(DearScenario Player’s default port) - Set Type to
UDP - Name it something clear, like
DearScenario Player Node 1
2. Create OSC cues
Add a Network cue in your cue list. Set it to use the DearScenario Player destination patch you just created, then configure the OSC message.
Play a full cue in one message
Load, cue point, loop policy, and automatic playback in a single OSC message:
| Field | Value |
|---|---|
| OSC Address | /player/play_media |
| Argument 1 | C:\media\scene_opening.mp4 (string) |
| Argument 2 | 30.0 (float) — cue position in seconds |
| Argument 3 | 0 (int) — loop off (1 = loop on) |
Pre-load without playing
| Field | Value |
|---|---|
| OSC Address | /player/prepare |
| Argument 1 | C:\media\scene_opening.mp4 (string) |
| Argument 2 | 0.0 (float) |
| Argument 3 | 0 (int) |
Then fire /player/play when the show is ready.
Start / pause / stop
| OSC Address | Arguments | Action |
|---|---|---|
/player/play | none | Start or resume |
/player/pause | none | Pause |
/player/stop | none | Stop and unload |
/player/cue | none | Return to cue point, stay ready |
Volume and seek
| OSC Address | Argument | Action |
|---|---|---|
/player/volume | 0.7 (float) | Absolute volume 0..1 |
/player/seek_sec | 45.0 (float) | Seek to seconds |
3. OSC address reference
DearScenario Player listens for OSC on port 18290. Only the short /player/<action> root is supported.
| OSC Address | Type tags | Action |
|---|---|---|
/player/play_media | s, sfi, or sii | Load and play (atomic cue) |
/player/prepare | s, sfi, or sii | Load and leave ready/paused |
/player/play | — | Play current media |
/player/pause | — | Pause |
/player/cue | — | Return to cue point |
/player/stop | — | Stop and remove media |
/player/seek_sec | f | Seek to time in seconds |
/player/volume | f | Set volume (0.0 – 1.0) |
/player/mute | i | Mute (1) or unmute (0) |
/player/loop | i | Enable (1) or disable (0) looping |
Removed addresses
Legacy long-root and load / seek / seek_abs OSC addresses are no longer supported. Use prepare / play_media and seek_sec instead.
4. Example cue list structure
Cue 1 [Network] /player/play_media "C:\media\welcome.mp4" 0.0 1
── lobby loop runs immediately ──
Cue 10 [Network] /player/play_media "C:\media\main_show.mp4" 30.0 0
── main show starts at 30s, no loop ──
Cue 20 [Network] /player/play_media "C:\media\exit.mp4" 0.0 0Each network cue fires one OSC message. QLab handles timing and grouping; DearScenario Player handles video output on the remote display.
5. Multi-node setups
Create a separate destination patch per DearScenario Player node (each has its own IP). Group cues that should fire together using QLab’s Group Cue with auto-follow.
Tips
- Prefer
play_mediaover load+wait+play: One message expresses source, cue point, loop, and automatic playback—no blind delay between load and play - Test the network path:
curl http://192.168.1.100:18290/api/statusfrom the Mac - Media paths are on the player machine: Copy files to the playback machine in advance
- OSC is fire-and-forget: HTTP from a Script cue can confirm validation and queue admission. To verify loading or playback, also inspect
GET /api/status.
Next step: For a compact playback node behind each screen, see how to build a Raspberry Pi video player.

