Use an iPhone as a PLAYDECK Camera

Your iPhone can be a wireless camera for PLAYDECK. Install the free Blackmagic Camera app, send an SRT stream over Wi‑Fi, and drop it into the playlist like any other live source. Optional: pull focus from the PLAYDECK desk without walking to the phone.

This is Wi‑Fi, not SDI. Fine for IMAG, a backup cam, or a room you cannot cable. Not a substitute for a locked studio camera.

In this article:
What you need
Install Blackmagic Camera
PLAYDECK listens (SRT)
iPhone sends the stream
Play it in the playlist
Remote focus (no code)
Remote focus with AI
Companion
If it stays red


What you need

What you need

  • PLAYDECK Plus (SRT is a Plus feature)
  • iPhone XR or newer, iOS 17+
  • Blackmagic Camera 3.2+ for streaming, 3.4+ for the REST focus API
  • iPhone and PLAYDECK PC on the same Wi‑Fi (5 GHz, not a guest network with client isolation)

Keep the iPhone plugged in and Auto-Lock off while it is on air.


Install Blackmagic Camera

  1. On the iPhone, install Blackmagic Camera from the App Store (free). Product page: https://www.blackmagicdesign.com/products/blackmagiccamera
  2. Open the app once and allow Camera + Microphone.
  3. Leave the phone on that Wi‑Fi. Write down the iPhone IP: iOS Settings → Wi‑Fi → tap the network → IP Address.

The stock iOS Camera app cannot do this. You need Blackmagic Camera (manual focus, SRT, REST). An NDI HX camera app is a different product — PLAYDECK can take that as an NDI Live Input, but you lose Blackmagic’s cinema controls.


PLAYDECK listens (SRT)

PLAYDECK is the listener (started first). The iPhone is the caller (connects to the PC).

  1. On the PLAYDECK PC, open a command prompt and run ipconfig. Use the IPv4 address of the LAN/Wi‑Fi adapter the iPhone can actually reach (example below: 192.168.1.50).
  2. In PLAYDECK, drag the STREAM icon onto the playlist (same dialog as other input streams — see https://playdeck.tv/input-streams/).
  3. Enter: srt://192.168.1.50:5000?mode=listener
  4. Play that clip so PLAYDECK opens the port. Windows Firewall may ask — allow it (UDP 5000).

Port 5000 is PLAYDECK’s own SRT default. Any free port is fine if the iPhone URL uses the same number.


iPhone sends the stream

Blackmagic Camera adds a custom SRT target from a small XML file.

On the PLAYDECK PC, save this as playdeck-srt.xml. Put your PC IP in the URL — not the iPhone IP:

<?xml version="1.0" encoding="UTF-8"?>
<streaming>
  <service>
    <name>PLAYDECK</name>
    <servers>
      <server>
        <name>Primary</name>
        <url>srt://192.168.1.50:5000</url>
      </server>
    </servers>
    <profiles>
      <profile>
        <name>HD low latency</name>
        <low-latency/>
        <config resolution="HD">
          <bitrate>6000000</bitrate>
          <audio-bitrate>128000</audio-bitrate>
          <keyframe-interval>1</keyframe-interval>
        </config>
      </profile>
    </profiles>
  </service>
</streaming>


  1. AirDrop the file to the iPhone (or Files / iCloud).
  2. Open it → Share → Blackmagic Camera.
  3. In the app: Settings → Live Stream → platform PLAYDECK → profile HD low latency.
  4. Start the live stream after the PLAYDECK clip is already playing.

HD at ~6 Mbps is the sensible default. 4K needs a strong 5 GHz link and resolution="4K" with a higher bitrate (iPhone 15 Pro+).


Play it in the playlist

If PLAYDECK connected, the stream name is white. Red = no connection. Double-click the info icon for format/codec. A typo: right-click → Change URL.

Treat it like a live camera clip: play it when you need the shot. A stream has no file end, so it stays up until you stop it or the phone drops Wi‑Fi.

Do not send the iPhone to YouTube/Twitch “and then into PLAYDECK”. That is the wrong direction. PLAYDECK must be the SRT listener on your LAN.mote is for.


Remote focus (no code)

Picture and focus are two different paths. The stream only carries video. Focus is camera control.

Without writing anything:

  • Apple Watch — Blackmagic Camera companion app: framing, record, exposure, focus, zoom.
  • iPad / second iPhone / Mac — same Blackmagic Camera app on the same Wi‑Fi, set that device as the controller. You get the full HUD, including focus.

Use that when someone can hold a Watch or an iPad. The next section is for the operator who wants a focus knob on the PLAYDECK PC.


Remote focus with AI

Blackmagic Camera 3.4+ speaks the Camera REST API on the phone: HTTPS port 4444, self-signed certificate. PLAYDECK does not talk to that API. You (or ChatGPT) send a tiny HTTP PUT from the PC.

Enable Remote Control in the Blackmagic Camera settings so the API is on. Then on the PLAYDECK PC open:

https://IPHONE-IP:4444/control/documentation.html

Accept the certificate warning. If the API docs load, the phone is reachable. The focus calls are:

  • GET /control/api/v1/lens/focus — returns JSON with normalised (0…1)
  • PUT /control/api/v1/lens/focus — body {"normalised":0.35}
  • PUT /control/api/v1/lens/focus/doAutoFocus — body {}


Quick test in Windows PowerShell (replace the IP). If this prints JSON, the API works:

$ip = "192.168.1.20"
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
Invoke-RestMethod "https://${ip}:4444/control/api/v1/lens/focus"


Auto-focus once:

Invoke-WebRequest -Method Put -Uri "https://${ip}:4444/control/api/v1/lens/focus/doAutoFocus" -ContentType "application/json" -Body "{}" -UseBasicParsing


Prompt to paste into ChatGPT / Claude / Gemini

Copy this, put your iPhone IP in, paste it into any AI. You should get a small PowerShell window with a slider.

Write a Windows PowerShell 5.1 script. No extra modules.

At the top: $IphoneIp = "192.168.1.20"

The Blackmagic Camera app on that iPhone exposes a REST API:
https://IP:4444/control/api/v1
Self-signed TLS — skip certificate validation.

PUT /lens/focus with JSON {"normalised": N} where N is 0.0 to 1.0
PUT /lens/focus/doAutoFocus with JSON {}
GET /lens/focus to read the current value

Open a small WinForms window titled "iPhone Focus":
- a trackbar 0–100 mapped to normalised
- send focus on mouse-up (do not spam every tick)
- a button "Auto Focus"
- a status label for errors

If GET returns different JSON keys than normalised, print the JSON and still send {"normalised": N}.
Use Invoke-WebRequest. Ignore empty 204 responses.


Working script (if you do not want to wait for the AI)

Save as iphone-focus.ps1, set $IphoneIp, right-click → Run with PowerShell. If Windows blocks it: Set-ExecutionPolicy -Scope Process Bypass then .\iphone-focus.ps1.

$IphoneIp = "192.168.1.20"
$base = "https://${IphoneIp}:4444/control/api/v1"

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

function Send-Bmd([string]$Path, [string]$Body) {
  $uri = "$base$Path"
  try {
    Invoke-WebRequest -Method Put -Uri $uri -ContentType "application/json" -Body $Body -UseBasicParsing | Out-Null
    $script:status.Text = "OK  $Path  $Body"
  } catch {
    $script:status.Text = $_.Exception.Message
  }
}

$form = New-Object Windows.Forms.Form
$form.Text = "iPhone Focus"
$form.Size = New-Object Drawing.Size(440, 210)
$form.StartPosition = "CenterScreen"

$slider = New-Object Windows.Forms.TrackBar
$slider.Minimum = 0
$slider.Maximum = 100
$slider.TickFrequency = 10
$slider.Width = 380
$slider.Location = New-Object Drawing.Point(20, 20)
$slider.Add_MouseUp({
  $n = [math]::Round($slider.Value / 100, 2)
  Send-Bmd "/lens/focus" "{`"normalised`":$n}"
})

$btn = New-Object Windows.Forms.Button
$btn.Text = "Auto Focus"
$btn.Size = New-Object Drawing.Size(120, 36)
$btn.Location = New-Object Drawing.Point(20, 90)
$btn.Add_Click({ Send-Bmd "/lens/focus/doAutoFocus" "{}" })

$script:status = New-Object Windows.Forms.Label
$script:status.AutoSize = $false
$script:status.Size = New-Object Drawing.Size(380, 40)
$script:status.Location = New-Object Drawing.Point(20, 135)
$script:status.Text = "Near = 0    Far = 100"

$form.Controls.AddRange(@($slider, $btn, $script:status))
try {
  $cur = Invoke-RestMethod "$base/lens/focus"
  $script:status.Text = "Connected  $cur"
  if ($cur.normalised -ne $null) { $slider.Value = [int]([double]$cur.normalised * 100) }
} catch {
  $script:status.Text = "Cannot reach ${base} — check IP, app 3.4+, Remote Control, same Wi-Fi"
}
[void]$form.ShowDialog()


Drag the slider, watch the lens on the phone. If PUT returns 403, focus is locked (external lens / AF lock in the app).


Companion

If you already run Bitfocus Companion for PLAYDECK, add a second connection: Blackmagic Cameras API (https://bitfocus.io/connections/bmd-cameras). Host = iPhone IP, HTTPS on, port 4444, allow insecure HTTPS (self-signed). Companion reads the phone’s own API list and builds Focus / Auto Focus actions. Put those buttons next to PLAYDECK Play/Pause. See https://playdeck.tv/companion/.


If it stays red

  • Start order — PLAYDECK listener clip playing first, then iPhone Live Stream.
  • Guest Wi‑Fi — phones cannot see PCs. Use the production SSID.
  • Wrong IP — XML URL is the PLAYDECK PC. REST URL is the iPhone.
  • Firewall — UDP 5000 inbound on the PC. TCP 4444 is outbound from the PC to the phone.
  • Plus license — SRT input needs Plus. Without it the clip will not connect.
  • Certificate popup — expected on port 4444. Accept it. The PowerShell script skips the check.
  • Latency — a few hundred ms on a good 5 GHz AP is normal. Do not expect SDI timing.

Wired studio option: Blackmagic Camera ProDock → HDMI → a capture card as a PLAYDECK Live Input. That is a cable, not this Wi‑Fi path.

Build a Custom Remote with AI

PLAYDECK already gives you two comfortable remotes: Bitfocus Companion if you have a Stream Deck or an ATEM, and the built-in Web Remote if you just want a browser on the same Wi‑Fi.

Custom Remote is the third path. You paste one HTML file, PLAYDECK serves it on this PC, and your phone opens it with a QR code. ChatGPT, Gemini or Claude only rewrite that file. PLAYDECK never talks to the AI, and you never install a chatbot inside the playout machine.

This is for the job Web Remote is not shaped for: a floor manager who only needs three huge buttons, a producer who wants remaining time the size of a truck, a show that needs one extra command the stock UI does not show. You describe the job in plain language. The AI returns HTML. You paste it back.

Do not edit files inside the PLAYDECK program folder. Updates overwrite them. Custom Remote is the fork that survives an update.

In this article:
What you get
Use the Sample (start here)
Let AI change it
Commands and live status
Using Web Remote as a base
If something does not work


What you get

Settings → Remote Control → Custom Remote.

PLAYDECK stores your HTML and serves it at a stable address:

http://YOUR-PC:11411/custom

The URL does not change when you paste a new layout. The QR next to the box encodes that same address. Phone and PLAYDECK PC must be on the same Wi‑Fi. If the page stays empty, allow TCP port 11411 in the firewall (the same port Companion and Web Remote already use).

There is always only one Custom Remote. One box, one file, one QR. That is on purpose. You are not building a website host. You are building the remote for this show.

The built-in Web Remote stays at / (the root of port 11411). Companion stays Companion. Overlays and Director View stay their own templates. Custom Remote does not replace them.


Use the Sample (start here)

If you have never done this, do not start from an empty page and do not start from Web Remote. Start from the Sample. It is a phone-first button board: two channels, fat transport keys, next clip / next block in the same modes Companion uses (Cue, Play, Cue+Play, Fade). It shows clip name, elapsed, remaining, and block remaining. Infinite clips and blocks show ∞ (sometimes  plus a loop time). That is the same text PLAYDECK shows in the progress bar. We do not invent a fake countdown.

  1. Settings → Remote Control → Custom Remote.
  2. Click Load Sample.
  3. Click Save and Open Custom Remote.
  4. Scan the QR with your phone camera, or open the address in the phone browser.

You should be able to cue, play, pause, stop, jump from the top of the playlist, and walk clip by clip / block by block — without reading a command list first.

That Sample is also the file you hand to the AI. It already contains the only technical contract that matters: one script tag, and PLAYDECK commands written on the buttons.


Let AI change it

Copy everything in the HTML box. Paste it into ChatGPT (or Gemini / Claude). Say what the remote is for, not which JavaScript library to use.

Keep this in every prompt:

Keep the line <script src="/playdeck-remote.js"></script>. Do not open your own WebSocket. Do not rewrite playdeck-remote.js. data-cmd is a PLAYDECK command from the Commands List. data-bind shows live status.

Then add the job, for example:

Floor manager, Channel 1 only

Make this a floor-manager iPad. Channel 1 only. Remaining time huge. Three buttons: PLAY, PAUSE, PLAY NEXT CLIP. Dark background, no gold borders, large tap targets.

Restyle, keep the buttons

Keep all existing buttons and commands. Change only colors, spacing and type so it looks like a broadcast panel. Playing channel should stay obvious.

Add one extra action

Keep the Sample as it is. Add a button under Channel 1 that sends startoverlay|1|1. Label it OVERLAY 1.

Paste the HTML the AI returns back into the box → Save and Open → reload the phone. If the AI dropped the script tag, PLAYDECK puts it back when you save. If the AI invented button names like fromtop or next instead of real commands, those keys will do nothing — put the Commands List command back on data-cmd.

You can paste into the box with Ctrl+V. There is no separate Paste button. Load Sample / Load Web Remote replace the box and save. Typing in the box without Save and Open does not update the phone.


Commands and live status

The helper script /playdeck-remote.js only talks WebSocket. You do not copy that file to the AI. You do not rewrite it. The HTML is the only file in the conversation.

A button is a PLAYDECK command, the same family Companion’s Custom Command uses:

<button data-cmd="play|1">PLAY</button>
<button data-cmd="cueandplay|1|1|1">FROM TOP</button>
<button data-cmd="playnext|1">PLAY NEXT CLIP</button>
<button data-cmd="cuenextblock|1">CUE NEXT BLOCK</button>


Live text is data-bind plus data-channel:

<div data-bind="channelName" data-channel="1"></div>
<div data-bind="clipName" data-channel="1"></div>
<div data-bind="elapsed" data-channel="1"></div>
<div data-bind="remain" data-channel="1"></div>
<div data-bind="blockRemain" data-channel="1"></div>
<div data-bind="blockName" data-channel="1"></div>


Elapsed and remaining are clip time. Block remaining is the block. Infinite shows ∞.

The full command list is in PLAYDECK: Main Menu → Documentation. If you can send it from Companion as a custom command, you can put it on data-cmd.

If a page needs logic the attributes cannot do (a spot counter, a rundown table), that extra JavaScript belongs in the same HTML file. Use PlaydeckRemote.send('play|1') and PlaydeckRemote.onStatus(...). Still one file, still no second WebSocket.


Using Web Remote as a base

The Sample is the path that works well with AI: few buttons, little code.

Sometimes you really want Nick’s Web Remote — the clip list, progress bars, channel tabs — but orange instead of grey, or a bigger clock, or hidden tabs. Then:

  1. Custom Remote → Load Web Remote → Save and Open.
  2. You now have a copy of the built-in Web Remote under /custom. The original Web Remote at / is unchanged.
  3. Copy that HTML to the AI with a strict rule:

This page is PLAYDECK Web Remote. Change CSS and labels only. Do not rewrite the JavaScript that builds the playlist, progress bars, or channel tabs. Keep <script src="/playdeck-remote.js"></script>.

If the AI “simplifies” that JavaScript, the clip list usually dies. Load Web Remote again and retry with a smaller ask (colors only).

Never tell people to edit webremote.html on disk and keep a backup for the next reinstall. That is what Custom Remote is for.


If something does not work

Blank phone page. Same Wi‑Fi as the PLAYDECK PC? TCP 11411 allowed? Try Save and Open on the PC first. The address is http://IP:11411/custom — not https, not another port.

Buttons do nothing. The script tag must stay. data-cmd must be a real command (play|1, not play). Reload after Save and Open.

Times stuck or list stale. Reload the phone. For a Web Remote copy, wait a few seconds — that page refreshes playlist data on a short interval.

∞ instead of a clock. The clip or block has infinite duration (live, loop, clock). PLAYDECK shows the same.

I wanted to change the normal Web Remote. You did: Load Web Remote is that page, served as Custom Remote. Leave / for everyone who still wants the stock UI.

Companion / Stream Deck. Keep using Companion for hardware. Custom Remote is HTML on a phone or tablet, not a replacement for the module.

Playout Rules

Playout Rules decide when a clip is allowed to play, and what happens after it. Shuffle uses the same gray state for clips that are not in this take.

In this article:
Where to find it
After Clip Action
Limit Playout
Gray vs Inactive
Clip Shuffle / Sync
Folder Sync
Duration, Follow and Schedule


Where to find it

Select one or more clips and click the pause / end icon on the clip (same place as the old Clip Pause). The dialog title is Playout Rules.

The top of the dialog is After Clip Action (pause / stop / continue). Below that is Limit PlayoutDefault for new Clips in the footer stores both for clips you add later.


After Clip Action

This is the former Clip Pause. It only runs when the clip actually reaches its end.

  • PLAY next Clip — the playlist continues as usual.
  • Pause after Clip — hold on the last frame and wait, or continue after a delay.
  • Stop after Clip — stop playout at the end of this clip.

On the right you choose what follows: PLAY next Clip, CUE next Clip, or Do nothing, optionally after a number of seconds.


Limit Playout

Each checked rule must match now. Unchecked rules are ignored.

  • Weekdays — only on the selected days.
  • Primetime — time of day. From is included, until is not (18:00–20:00 means until 19:59:59). If From is later than Until (e.g. 22:00–06:00), the window wraps overnight.
  • Campaign — calendar dates. Until included. If Until is off, the clip is limited to the From day only.
  • Max playouts (per Day) — how often this clip may play on the current calendar day. The counter resets at the next check after midnight (no extra timer). A play counts when the clip finished and the playhead left it. Looping the same clip does not add extra counts. A manual start does count if that clip played through.

Several rules together are AND: weekday and primetime and campaign and max playouts, if they are all on.

Reset Selection / Reset Channel in this dialog zero the daily counters. File → Reset Clip Played Status does the same for played marks and counts.


Gray vs Inactive

Two different skips:

  • First-column checkbox off — the clip is inactive. Automation will not take it, and you cannot start it with CUE / PLAY / Fade.
  • Gray name + ↷ — the clip is out of this take (Limit Playout, or leftover after Shuffle). Automation, Follow, Planned duration and Get Next skip it. You can still start it by hand. That un-greys that clip only; it does not deal a new Shuffle take.

Block headers still show the count of clips that can actually play in this take (▸ 3 Clips), not every file in the block.


Clip Shuffle / Sync

Open Clip Shuffle / Sync from the Block (shuffle icon on the block header). Dialog title: Clip Shuffle/Sync.

Shuffle methods

  • No Shuffle — normal order. Use this when you want only Folder Sync (and optional Sorting), without any shuffle take.
  • Shuffle all Clips — random order for the whole block. Every active clip is in the take.
  • Shuffle only N — pick N clips for this take; the rest go gray (↷). Over many deals, PLAYDECK prefers clips that have waited longest (fair rotation), not “last played”.
  • Shuffle time — shuffle first, then keep clips until the take reaches your duration:
    • up to HH:MM:SS — fill as much as possible without going over; clips that do not fit go gray.
    • at least HH:MM:SS — keep adding until the sum is ≥ the target; then gray the rest.

Sorting and Shuffle are mutually exclusive: a real sort (Name A–Z / Z–A, File date newest / oldest) turns Shuffle off; choosing a Shuffle method sets Sorting to No sorting / Use Shuffle.

When PLAYDECK deals a take

A new take is dealt when you enter the Block from the outside:

  • CUE / PLAY / Fade on the block header — deals.
  • CUE / PLAY on a clip inside the Block (including the first clip of the take) — plays that clip as-is. It does not reshuffle. If the clip was gray, it is un-greyed for this start only.
  • When the Block becomes Next (jump to next Block, jump to Block, stop/pause follow, …) — deals once for that pending entry.
  • Scheduled Block — when the schedule fires (or the next cache prepares that Block), PLAYDECK deals once, then starts the first take clip. If you are already playing inside that Block, the schedule does not deal again.
  • Break Block — same when the Break is entered (interrupt or after clip end). Returning from the Break to the previous clip/position does not deal a new take on the return target.
  • Loop Block / Loop Clips — keeps the same take. Leaving the Block (non-loop Block End) clears the take so the next entry can deal fresh.

Clips not in the take go gray (↷). Automation, Follow, Planned duration and Get Next skip them. You can still start a gray clip by hand — that un-greys that clip only; it does not deal a new take.

Blocks with Shuffle and/or Folder Sync show 🔀 on the header.

Open Clip Shuffle from the Block (Block End / list icon). Methods: No ShuffleShuffle all Clips, or Shuffle only N clips, with optional fixed clips at the top of the block.

PLAYDECK deals a take when the Block is played from the beginning: CUE / PLAY / Fade on the block header, on the first take clip, or when the Block becomes next in playout (Block End, command, action, schedule). Clips not in the take go gray (↷).

Looping the Block keeps the same take. It does not shuffle again. To deal a new take, start the Block from the beginning.

CUE / double-click on any other clip in the Block plays that clip (and un-greys it if it was gray). It does not reshuffle the rest.


Folder Sync

You can use Folder Sync alone — leave Shuffle on No Shuffle. Sync still adds/removes/re-scans files; optional Sorting orders them. Shuffle is optional on top. In the same Clip Shuffle / Sync dialog:

  1. Check Sync clips.
  2. Set Folder (browse or path).
  3. Optional Filter — comma-separated patterns. Extensions (*.mp4mp4.mov) and filenames: substring without * (e.g. promo matches any name containing “promo”), or wildcards (promo**_final.mp4*spot*). Mix both, e.g. *.mp4,promo*,*_de.movReset restores the default extension list. Empty filter = all playlist file types.
  4. Optional Sorting — order file clips in the block to match the folder (only when Shuffle is off).

What sync does

  • Adds new files from the folder as clips.
  • Removes file clips that are no longer in the folder.
  • Re-scans a clip if the file was replaced (same path, new size/date) — same as Rescan Clip.
  • Does not touch non-file clips (inputs, notes, …).

When it runs

  • In the background, while that Block is not Current and not Next (so live playout is not rewritten under you).
  • Also once when you OK the dialog, if the Block is idle (not Current/Next).
  • After each sync pass, PLAYDECK waits before the next background sync on that Block: about 10 seconds normally, about 30 seconds if new clips were added. Manual OK in the dialog (while idle) still runs sync immediately.

If background checks feel wrong in a live show: Settings → Disable background file checks (replace, growing files, folder sync). Leave it unchecked for normal use. New clips are still scanned when first added.


Duration, Follow and Schedule

Planned time, block duration, Follow-after-clip, and Get Next only use clips that can play now (active, not gray, Limit allowed).

scheduled Block with no take clip at fire time is skipped. Limit Playout lives on the clip, not on Schedule Block.

AMP Video Server (Ross Carbonite / Generic DDR)

This article shows how to connect a broadcast switcher such as Ross Ultrix Carbonite to PLAYDECK using AMP (Advanced Media Protocol). PLAYDECK acts as a Generic DDR. The switcher lists clips and sends cue, play, stop, eject, jog, loop and record.

AMP is control only — it does not carry video. Route PLAYDECK program out to the switcher separately via SDI, NDI or HDMI.

In this article:
Enable AMP in PLAYDECK
Route video to the switcher
Configure the switcher (Carbonite)
Channel mapping
Panel commands
Clip list & IDs
Status and logging
Troubleshooting


Enable AMP in PLAYDECK

  1. Open Settings → Network → Incoming.
  2. Enable AMP Video Server.
  3. Keep the default port 3811, unless your switcher requires another port.
  4. Allow inbound TCP on that port from the switcher IP (Windows Firewall).

When AMP is active, PLAYDECK listens for switcher connections on the configured TCP port.


Route video to the switcher

AMP does not transport picture. You must feed the switcher from a normal PLAYDECK output:

  • SDI / HDMI via a playout card (Blackmagic, AJA, Deltacast, …)
  • NDI (see our Broadcast your Video Feed guide)
  • Extended desktop / HDMI from the graphics card

Assign that source to the switcher input you use for the AMP device (e.g. BNC or NDI source from the PLAYDECK PC).


Configure the switcher (Carbonite)

On the Ross switcher (Ultrix Carbonite or compatible panel):

  1. Device Config → Add Server → AMP
  2. IP = PLAYDECK PC on the LAN
  3. Port = as set in PLAYDECK (default 3811)
  4. Protocol / server type: Generic DDR
  5. Enable Allow playlist control on the server side if the switcher asks for it

Ross Tria/Mira AMP documentation applies (driver AMP_0.2, Protocol ID Generic DDR).

Pick a VTR on the panel (e.g. Vtr1). Each AMP connection uses one VTR channel on the switcher.


Channel mapping

SwitcherPLAYDECK
Vtr1 … Vtr8Channel 1 … 8
PGM1 … PGM8Channel 1 … 8 (accepted too)

One Carbonite AMP connection = one VTR. For multiple channels, add multiple AMP servers or VTR assignments as your switcher allows.


Panel commands

SwitcherPLAYDECK
PlayPlay
StopPause (still). Play continues.
EjectStop the channel (background)
CueCue that clip at Cut In
Jog / shuttleVariable speed. Release the dial = still. Play = 1× again.
Loop on / offInfinite loop / no loop on the current clip
RecordStart/stop the PLAYDECK recording whose source is this channel (not Always-on). Map that recording slot to the same playlist channel as the VTR.

Status and logging

Status on the switcher follows PLAYDECK: Play, Pause, Cue.

Incoming AMP: Logs → Command Logs (<< AMP, readable).


Status and logging

Status on the switcher follows PLAYDECK: Play, Pause, Cue.

While a new clip is still caching, the previous clip may keep playing until cue is ready.

Incoming AMP traffic is logged under Logs → Command Logs (<< AMP).


Troubleshooting

ProblemCheck
Switcher cannot connectAMP enabled in PLAYDECK; firewall allows TCP on the port; same LAN/subnet
Empty or wrong clip listClips active on the mapped channel; captions/filenames visible in playlist
Jog does nothing / stays at wrong speedPLAYDECK playing; after release it stays still (press Play for 1×)
Cue failsUse exact 8-character ID from the list
Record does nothingRecording slot: source = playlist, channel = this VTR, not Always-on; engine running
Picture blackVideo not routed — AMP is control only; check SDI/NDI/HDMI to switcher
No log linesOpen Logs → Command Logs while testing

Unattended 24/7 Playout

This article shows how to run PLAYDECK without an operator: daily project files from a traffic or scheduling system, reload when a file is overwritten, and a scheduled application restart.

Settings → Automation is easy to miss. A checkbox named “Disable automatic project saving” does not sound like 24/7 playout — but together with “Load newest project from folder” it is the typical unattended workflow.

In this article:
Settings → Automation
Typical use cases
Disable Saving and Load newest
Restart PLAYDECK


Settings → Automation

Open Settings → Automation (last item in the Settings group).

Three independent functions live on this page:

  • Restart PLAYDECK every — daily or weekly clean start
  • Disable automatic project saving — PLAYDECK does not write the open project in the background; optional reload when that file changes
  • Load newest project from folder — at a clock time, load the newest .xml in a folder (once per day)

Note: Scheduled Restart, Load newest, and reload-on-file-change do not run while Settings are open. Configure the time, folder and options, then close Settings. Otherwise the scheduled time can pass with nothing happening. Test Restart now still runs immediately from Settings — that is the only exception.


Typical use cases

These are the situations where Automation matters — they are not obvious from the labels alone.

Traffic / scheduling system writes a new XML every day
A planner drops files such as 13-08-26_Playdeck.xml14-08-26_Playdeck.xml into a shared folder. At midnight PLAYDECK should pick the newest file and continue unattended. That is Load newest, usually together with Disable automatic project saving.

The same project file is overwritten during the day
An editor or a 3rd-party app overwrites the file that is currently open. PLAYDECK should detect that and reload. That is Disable Saving + When the open file changes → Reload/Resume. Details: Prepare/Import Playlists externally.

Both on the same machine
New dated file at 00:00, then the same day’s file overwritten again at 14:00. Enable Load newest and reload-on-change. They are not either/or.

Overnight clean start
24/7 boxes that should restart PLAYDECK once a day, even during playout. That is Restart PLAYDECK every.


Disable Saving and Load newest

Disable automatic project saving
If enabled, PLAYDECK will not save the project file in the background (the usual auto-save, and also the silent save on quit). File → Save / Save As still works.

Use this when an external system owns the XML. Otherwise PLAYDECK writes its in-memory playlist back to disk and overwrites the scheduler’s file.

When the open file changes:

  • Do nothing — ignore external overwrites
  • Reload/Resume immediately — reload and try to resume the same clip (by Unique ID)
  • Prompt for Reload/Resume — ask first

Note: Resume only works if the currently playing clip still exists in the reloaded project. If not, that channel stops. This reload is for the same file that is already open. It is not a substitute for Load newest.

Load newest project from folder
If enabled, PLAYDECK looks in the selected folder after the selected weekday and time and loads the newest .xml once per day.

  • Newest means file date (last write time), not the file name. 13-08-26 vs 01-09-26 in the name does not matter.
  • Only valid PLAYDECK project files (other XML, e.g. XMLTV exports, are skipped).
  • Files that are still being written (in use) are skipped.
  • The currently open file is ignored. PLAYDECK will not load the same playlist again. You do not need Disable Saving just to make Load newest work.
  • After a successful load, the same day will not load again.

Why combine them anyway
Load newest does not require Disable Saving — the open file is already excluded from the “newest” pick. For a traffic system you usually want both: without Disable Saving, PLAYDECK auto-saves the open project, that file’s date keeps moving, and tomorrow’s drop may look “older” than PLAYDECK’s own save. If the scheduler overwrites today’s file while it is open, PLAYDECK can also save on top of that overwrite.

Recommended 24/7 setup

  1. Enable Disable automatic project saving.
  2. When the open file changes: Reload/Resume immediately — if the same day’s file can be overwritten later; otherwise Do nothing.
  3. Enable Load newest project from folder every <Every Day> at e.g. 00:00:00.
  4. Folder = the drop folder of the scheduler. Keep only PLAYDECK project XML in that folder.
  5. After load:
    • Play first block — start playout (typical unattended switch)
    • Cue first block — load the first block, wait for a later Play
    • Follow block schedules — do not auto-play; blocks fire by their own clock times (Program Flow). If you test with this option and nothing starts, that is expected.
  6. Close Settings.

The project switch is seamless. Output stays up; only a few frames drop during the load. Set the channel background to black — if a few frames of the previous picture would flash, black is the least visible fill. This is a hard cut to the new project, not a mix. Time the file drop and the Load time (often midnight) so the cut sits in a safe gap, or use Follow block schedules in the new file.


Restart PLAYDECK

If enabled, PLAYDECK closes and starts again at the selected weekday and time, even during playout. Use this for a daily clean start on unattended machines.

Test Restart now runs the same restart immediately. The scheduled restart only runs after Settings are closed.

Recording Closed Captions & SCTE

PLAYDECK can record Closed Captions and SCTE-35 into files — but not every container supports both.

  • Closed Captions can go into MKV or MPEG-TS (and related stream-style recordings).
  • SCTE-35 only goes into MPEG-TS (.ts), not into MKV.

Matrix and domains: Closed Captions & SCTE — Overview.

In this article:
What to enable
MKV vs MPEG-TS
Sidecar files (.scc / .anc)
Verify playback
Related


What to enable

In the recording Parameter / config string, set the flags you need:

embed_cc='true'
embed_scte35='true'
scc_capture='true'
anc_capture='true'


ParameterPurpose
embed_cc='true'Embed CC into the video elementary stream (e.g. H.264 / MPEG-2)
scc_capture='true'Write a parallel .scc file (CEA-608)
anc_capture='true'Write a parallel .anc file (CEA-708)
embed_scte35='true'Embed SCTE-35 into an MPEG-TS recording only

Same idea as streaming: these flags are easy to miss — without them, pass-through CC / SCTE-35 will not be stored as expected.

While recording SCTE-35, fire markers from clips, blocks, overlays, or Action buttons (SCTE-35 type).


MKV vs MPEG-TS

MKVMPEG-TS (.ts)
Closed Captions (embed_cc)YesYes
Sidecars .scc / .ancYes (if capture flags on)Yes (if capture flags on)
SCTE-35 (embed_scte35)NoYes
Typical checkPLAYDECK playlist shows CCMediaInfo: EIA-608/708 in video; DVB Inspector: SCTE-35 cues; PLAYDECK: CC + << SCTE-35

Rule of thumb

  • Need CC only (and optional sidecars) → MKV or TS.
  • Need CC + SCTE-35 in one file → MPEG-TS.

Sidecar files (.scc / .anc)

With scc_capture / anc_capture, PLAYDECK can create:

  • yourfile.scc — CEA-608 (usable in many tools)
  • yourfile.anc — CEA-708-style ANC (mainly Medialooks/PLAYDECK)

Same base name and folder as the video. On playback, PLAYDECK can use embedded CC and/or these sidecars (see also Closed Captions & Subtitles).


Verify playback 

Closed Captions
  1. Add the recorded file to a playlist.
  2. Select the CC track if offered.
  3. Confirm CC in the channel preview (pass-through or burn-in as configured).

For TS, MediaInfo often lists Text tracks (EIA-608 / EIA-708) muxed into the video.

SCTE-35 (TS only)
  1. During record, send SCTE-35 from an Action (or clip command).
  2. Open the .ts in DVB Inspector (or TSDuck) and confirm splice/SCTE-35 cues.
  3. Play the same .ts in PLAYDECK → SCTE Event Log should show << SCTE-35.

Note: Playing an MKV recording will not show SCTE-35 in the log — the container does not carry it. MediaInfo also often omits SCTE-35 even when DVB Inspector shows cues; prefer DVB Inspector / PLAYDECK << for SCTE checks.

Related

ArticleTopic
Closed Captions & SCTE — OverviewFull matrix
Closed Captions & SubtitlesTracks, burn-in / pass-through
SCTE on SDI (SCTE-104)SDI VANC markers
Sending SCTE-35 to a stream serverLive streams, Nimble, HLS

Using SCTE-104 on SDI

On SDI, PLAYDECK uses SCTE-104 markers in VANC (not SCTE-35). Use SCTE-104 to signal ad inserts / splice points to downstream SDI equipment.

For the full matrix (including streams, recording, NDI) see:
Closed Captions & SCTE — Overview

For IP / MPEG-TS markers, use SCTE-35 instead: Sending SCTE-35 to a stream server.

In this article:
SDI vs streams
Enable SCTE-104 on SDI
Send SCTE-104
Detect and log
SDI loop test
Forwarding
Important limit (CC / ASS track)
Related


SDI vs streams

ConnectionSCTE type
SDI (DeckLink, etc.)SCTE-104 only (VANC)
UDP / SRT / DVB / TS file / HLS segmentsSCTE-35 only

PLAYDECK does not convert SCTE-104 ↔ SCTE-35 automatically.
If you go SDI → IP stream, SCTE-104 will not appear as SCTE-35 on the stream. Fire SCTE-35 on the channel that owns the stream output (see overview and SCTE-35).


Enable SCTE-104 on SDI

Input

On the SDI input, enable VANC Data → Enable Closed Captions and SCTE-104 Triggers.

Same checkbox as Closed Captions capture. It is opt-in because VANC capture adds processing load.

Output

With a license that includes SCTE / CC, SDI output can carry VANC including SCTE-104 when markers are present on the channel.


Send SCTE-104

Attach SCTE commands to clips, blocks, overlays, or Action buttons. Set the command type to SCTE-104 and paste XML your SDI gear expects.

PLAYDECK does not convert SCTE-104 ↔ SCTE-35. If the same break must hit SDI and an IP stream, fire two commands (104 on SDI, 35 on the stream channel).

The Commands dialog has SCTE-104 Out / In samples. One break = one ID: Out uses {eventidhex}, In uses {eventlastidhex}. Duration in 104 is tenths of a second as 4-digit hex ({blockduration10hex}), not the 90 kHz number from SCTE-35.

<SCTE35_protocol_version>0</SCTE35_protocol_version> is a normal field in a 104 multiple_operation_message (the splice op is SCTE-35 protocol version 0). It does not mean PLAYDECK is sending SCTE-35 on SDI. <protocol_version>1</protocol_version> is the 104 message version.

SCTE-104 Out (splice request, opID 257)

Typical on block starttime_type 0 = immediate (no pre-roll clock).

<SCTE104 line=12>
  <multiple_operation_message>
    <protocol_version>1</protocol_version>
    <AS_index>0</AS_index>
    <message_number>1</message_number>
    <DPI_PID_index>1</DPI_PID_index>
    <SCTE35_protocol_version>0</SCTE35_protocol_version>
    <timestamp>
      <time_type>0</time_type>
    </timestamp>
    <ops>
      <op>
        <opID>257</opID>
        <data>02 {eventidhex} 00010000 {blockduration10hex} 010101</data>
      </op>
    </ops>
  </multiple_operation_message>
</SCTE104>
SCTE-104 In

Block end. Same ID, no duration in the data.

<SCTE104 line=12>
  <multiple_operation_message>
    <protocol_version>1</protocol_version>
    <AS_index>0</AS_index>
    <message_number>1</message_number>
    <DPI_PID_index>1</DPI_PID_index>
    <SCTE35_protocol_version>0</SCTE35_protocol_version>
    <timestamp>
      <time_type>0</time_type>
    </timestamp>
    <ops>
      <op>
        <opID>257</opID>
        <data>04 {eventlastidhex} 00010000 0000 010100</data>
      </op>
    </ops>
  </multiple_operation_message>
</SCTE104>


Adjust line=AS_indexDPI_PID_index and the <data> layout to whatever your inserter documents. Placeholders are listed on Sending SCTE-35 to Streams & Servers.


Detect and log

Open the SCTE Event Log (Logs → SCTE).

  • >> = marker sent on that channel
  • << = marker detected on a receiving playlist (e.g. SDI input playing in another channel)

Logging both directions is the fastest way to verify a loop without external analyzers.


SDI loop test

  1. Channel 1: SDI output active.
  2. Physical loop (or second port) into an SDI input; enable VANC Data on that input.
  3. Channel 2: play that input in the playlist.
  4. Channel 1: Action button with SCTE-104 sample; both channels playing.
  5. Event Log: >> on Ch1 and << SCTE-104 on Ch2.

You can add a second SDI hop (Ch2 → Ch3) to confirm forwarding on SDI.


Forwarding 

PLAYDECK can forward incoming SCTE-104 from an SDI input to an SDI output when that input is played through a channel that drives SDI out.

Forwarding SDI (104) UDP/SRT (35) does not happen automatically. Use SCTE-35 on the streaming channel instead.


Important limit (CC / ASS track)

If Channel 1 is playing a clip with an active Closed Caption or ASS text track, SCTE-104 on SDI may only be received intermittently (>> still looks fine; << on the loop is unreliable).

Workaround: turn the text track off when SCTE-104 on SDI must be reliable.

This conflict was not observed for SCTE-35 on MPEG-TS streams in the same way.

Related

ArticleTopic
Closed Captions & SCTE — OverviewFull matrix, domains, embed flags
Sending SCTE-35 to a stream serverUDP/SRT/DVB, Nimble, HLS
Closed Captions & SubtitlesCC burn-in / pass-through
Recording CC & SCTEMKV vs TS, sidecars, playback checks

Closed Captions & Subtitles

PLAYDECK supports Closed Captions (CEA-608 / CEA-708) and Subtitles (ASS / SRT). They look similar on screen, but they behave differently.

  • Subtitles always end up burned into the picture.
  • Closed Captions can be burned in or passed through in the signal (SDI VANC, or embedded in supported video streams).

For the full from→to matrix (SDI, NDI, UDP/SRT/DVB, RTMP, HLS, recording), start here:
Closed Captions & SCTE — Overview

In this article:
Subtitles vs Closed Captions
Subtitles (ASS / SRT)
Closed Captions sources
Burn-in vs Pass-Through
Enable CC on inputs and outputs
Quick test
Related


Subtitles vs Closed Captions

SubtitlesClosed Captions
Typical sourcesASS embedded, external SRTCC embedded, SCC/MCC/ANC sidecars, SDI VANC, streams, NDI (PLAYDECK loop)
On outputsAlways in the pictureBurn-in or pass-through in the signal
Styling in PLAYDECKFont etc. in settingsPreview/burn-in style in settings; position/animation often fixed inside the CC data
Same as SCTE?NoNo — SCTE is separate signaling (overview)

Subtitles (ASS / SRT)

Subtitles can only come from video files and are always burned onto the frames.

  1. Add the clip to a playlist.
  2. Right-click the clip and select the subtitle track (disabled by default).


Embedded: shown as ASS Embedded.
External SRT: same base filename as the video (.srt), in the same folder or in a Subs / Subtitles subfolder.

Wherever you send the channel (SDI, NDI, stream, desktop), the subtitle text is already in the image. Adjust font and related options in settings.

PLAYDECK does not include an editor to type new subtitle/CC text into files. Use an external tool if you need to author captions.


Closed Captions sources

From files

Right-click the clip → select the CC track (e.g. CC Embedded).

Also supported as sidecars (same base name, same folder): SCC, MCC, ANC.

When recording with scc_capture / anc_capture, PLAYDECK can write .scc / .anc next to the media file; playback can pick them up again. See the overview recording notes.

From live inputs / streams

PLAYDECK can read, preview, and forward CC with:

  • SDI (if the device supports VANC; enable VANC Data on the input)
  • Streams with MPEG-2 or H.264 (also MPEG-4 Part 2 in our tests) — UDP, SRT, DVB-compatible, etc., with embed_cc='true' on the sender
  • NDI in a PLAYDECKPLAYDECK loop (many third-party NDI tools do not show CC)
  • RTMP to YouTube with embed_cc='true' (YouTube can display CC)


Not for CC pass-through: HEVC with embed_cc (no usable pass-through in our tests).


Burn-in vs Pass-Through

In settings (Closed Captions):

  • Burn-in (default): CC text is rendered onto the channel output frames. Every destination sees the text in the picture (including Desktop Output).
  • Pass-Through (always active): CC is not burned into the output picture. PLAYDECK still shows CC in the channel preview. Downstream players/decoders (YouTube, another PLAYDECK, etc.) are responsible for displaying the captions.

Use Desktop Output (window mode) to check whether text is in the picture or only in the preview.

Tip: If you loop a burn-in channel into a second channel that also pass-through-previews CC, you can see double text (pixels + overlay). Switch the first channel to Pass-Through to avoid that.

CC data often includes fixed position and mode (e.g. roll-up / pop-on). PLAYDECK does not restyle that for preview/burn-in beyond its CC display settings.


Enable CC on inputs and outputs

Full matrix: Closed Captions & SCTE — Overview.

SDI input

Enable VANC Data → Enable Closed Captions and SCTE-104 Triggers.
Required to capture CC (and SCTE-104) from SDI. Opt-in because VANC capture adds processing.

SDI / NDI output

With a Closed Captions license, SDI/NDI output is prepared to carry CC when present in the channel pipeline.

Streams + Recordings

In Parameter, add:

embed_cc='true'


Without this, pass-through CC will not be embedded in the outgoing elementary stream (burn-in still works if enabled).

UDP target: use your LAN IP, not 127.0.0.1.


Quick test

  1. Load a sample clip with embedded CC; select the CC track; loop the block. Confirm CC in the channel preview.
  2. Enable SDI and/or NDI output; optionally loop SDI/NDI back into an input (VANC on for SDI).
  3. Add a UDP (or SRT) stream with H.264 and embed_cc='true'; play that URL on another channel.
  4. Confirm Desktop Output vs preview behaviour.

Sample clip:
https://downloads.playdeck.tv/assets/Sample Video_QTCC.mov

Related

ArticleWhat you will find
Closed Captions & SCTE — OverviewFull matrix, SCTE domains, limits
SCTE on SDISCTE-104
SCTE-35 to a stream serverSCTE-35, Nimble, HLS cues
Recording CC & SCTEMKV vs TS, sidecars, playback checks

Closed Captions & SCTE — Overview

PLAYDECK can carry Closed Captions (CEA-608 / CEA-708) and SCTE ad/splice markers through many inputs and outputs. They are different signals:

  • Closed Captions travel with the video (SDI VANC, or embedded in MPEG-2 / MPEG-4 / H.264 elementary streams).
  • SCTE-104 is used on SDI (VANC).
  • SCTE-35 is used in MPEG-TS (UDP, SRT, DVB-compatible streams, TS recordings, HLS segments).

This page is the map: what works from where to where, what you must enable, and where the limits are. Step-by-step setup lives in the linked articles below.

Note: Soft Subtitles (SRT / ASS) are always burned into the picture. They are not the same as Closed Captions. See Closed Captions & Subtitles.

In this article:
Quick rules
How to enable CC and SCTE
Closed Captions matrix
SCTE matrix
Known limits
Related articles


Quick rules

  1. SDI ↔ IP are different SCTE worlds
    SDI = SCTE-104. Streams / TS files = SCTE-35. PLAYDECK does not convert 104 ↔ 35 automatically.
  2. Streams need embed flags
    Unlike the SDI “VANC Data” checkbox for Inputs, stream and recording options are easy to miss. You must set them in the stream/recording Parameter / config string (embed_ccembed_scte35).
  3. Codec vs protocol
    • CC pass-through (embed_cc): depends on video codec (MPEG-2, MPEG-4 Part 2, H.264 — not HEVC).
    • SCTE-35 (embed_scte35): depends on MPEG-TS transport, not on the video codec.
  4. Pass-through vs burn-in (CC)
    • Pass-through: caption data stays in the signal; PLAYDECK can preview it; downstream devices decode it. Needs VANC / embed_cc as applicable.
    • Burn-in: text is drawn into the video pixels; no embed flag required for the text to be visible on outputs.
  5. UDP loopback
    Prefer your machine’s LAN IP (e.g. udp://192.168.x.x:5000?pkt_size=1316). udp://127.0.0.1:… is unreliable in current setups.

How to enable CC and SCTE

SDI
DirectionWhat to do
InputEnable VANC Data → Enable Closed Captions and SCTE-104 Triggers on that input. This turns on VANC/CC/ANC capture (there is some processing cost — that is why it is opt-in).
OutputWith a Closed Captions license, PLAYDECK enables CC/VANC on the SDI renderer automatically.

Streams and Recordings

Open Parameter on the stream or recording and set the flags in the config string (examples):

embed_cc='true'
embed_scte35='true'


FlagUse for
embed_cc='true'CC pass-through into MPEG-2 / MPEG-4 / H.264 (UDP, SRT, DVB, HLS segments, TS/MKV record, RTMP/FLV, etc.)
embed_scte35='true'SCTE-35 into MPEG-TS only (UDP, SRT, DVB, TS file record, HLS segments). Not for MKV or RTMP/FLV.

Without these flags, pass-through CC / SCTE-35 will not leave PLAYDECK on that output — even if the UI looks “ready”.


Injecting SCTE

Attach SCTE commands to clips, blocks, overlays, or Action buttons. Choose SCTE-104 when targeting SDI, SCTE-35 when targeting MPEG-TS streams or TS files. Details and XML samples: SCTE-104 on SDI · SCTE-35 to servers.


Closed Captions matrix

Verified PLAYDECK behaviour (pass-through unless noted).

PathResultNotes
File → SDI → SDI (loop)YesEnable VANC on the receiving input.
File → UDP / SRT / DVB → Stream inYesembed_cc='true'; MPEG-2, MPEG-4 Part 2, or H.264 (e.g. NVEnc / Quick Sync). HEVC: no.
File → RTMP → YouTubeYesembed_cc='true'; YouTube shows CC.
File → NDI → NDI (PLAYDECK loop)YesPLAYDECK↔PLAYDECK only. NDI Studio Monitor / vMix do not show CC.
File → HLS (.m3u8)Yes*CC in segments; PLAYDECK can play the m3u8 and show CC. (*Not as separate tags in the playlist file.)
Recording MKVYesembed_cc; optional sidecars via scc_capture / anc_capture (.scc / .anc).
Recording MPEG-TSYesembed_cc; MediaInfo shows EIA-608/708 muxed in video.
SDI → Stream (chain)YesVANC capture in + embed_cc on the stream.
Stream without embed_ccNo (pass-through)Burn-in still works (pixels).

Burn-in works on SDI, NDI, streams, and desktop outputs whenever CC is rendered into the frame (channel pass-through option off).

More UI detail: Closed Captions & Subtitles.


SCTE matrix

PathResultNotes
SCTE-104 → SDI → SDIYesUse SCTE-104 commands. Check Event Log >> / <<.
SCTE-35 → UDP / SRT / DVB → StreamYesRequires embed_scte35='true'. Codec does not matter.
SCTE-35 stream → stream forwardYese.g. Ch1 → UDP → Ch2 → UDP → Ch3; << on both receivers.
SCTE-104 on SDI, then stream that channel to IP104 on SDI yes; not on IPNo automatic 104→35. Fire SCTE-35 on the stream-sending channel if the IP side needs markers.
SCTE-35 toward SDI outputNoWrong domain for SDI.
SCTE-104 toward UDP/SRT/DVBNoWrong domain for MPEG-TS.
NDI loop (104 or 35)NoNo << on NDI receive in PLAYDECK.
Record MPEG-TS + SCTE-35 while recordingYesVisible in DVB Inspector; PLAYDECK playback shows << SCTE-35.
Record / play MKVNo SCTEMKV has no embed_scte35.
HLSPartialNo SCTE/CUE tags in the .m3u8. PLAYDECK playback of the m3u8 can still show << SCTE-35 from segments. External packagers that only read manifest cues need another tool (e.g. Nimble).

DVB-compatible streaming in PLAYDECK behaves like UDP/SRT for CC and SCTE-35 once the embed flags are set (format='dvb', still udp:// or SRT URL).


Known limits

SCTE-104 together with an active CC/ASS track (SDI)

If a clip is playing with an active Closed Caption or ASS text track, SCTE-104 may only arrive intermittently on an SDI loop (>> send is stable, << receive is not). Disable the text track if SCTE-104 reliability on SDI is critical.
This conflict was not seen on MPEG-TS streams when using SCTE-35 (with or without embed_cc).

NDI
  • CC: works in a PLAYDECK↔PLAYDECK loop; not shown in NDI Studio Monitor or vMix.
  • SCTE: not received back over NDI in PLAYDECK.

HEVC

embed_cc does not deliver usable CC pass-through with HEVC in our tests. Use MPEG-2, MPEG-4 Part 2, or H.264 for CC pass-through.

HLS manifests

PLAYDECK does not write SCTE/CUE tags into the .m3u8. Caption and SCTE-35 data can still be present in the underlying segments.


Related articles

ArticleWhat you will find
Closed Captions & SubtitlesTracks, burn-in vs pass-through, preview, SRT/ASS
SCTE on SDI (SCTE-104)VANC, commands, SDI loop testing
Sending SCTE-35 to a stream serverXML samples, placeholders, Nimble / HLS workflows
Recording CC & SCTEMKV vs TS, sidecars, playback checks

Event Log tips

Use Logs → SCTE:

  • >> = marker applied on the sending channel
  • << = marker detected on a receiving playlist/stream

For TS files, DVB Inspector (or TSDuck) is useful to confirm SCTE-35 inside the file; MediaInfo often shows CC clearly but not SCTE-35.

Mastering Program Flow & Playlist Automation

Welcome to the PLAYDECK Playlist Automation and Program Flow guide. While PLAYDECK serves as an excellent manual clip player for live operators, it also features a highly advanced automation engine for continuous broadcasting and structured event schedules. This guide will show you how to transition from basic manual playout to sophisticated automation—allowing you to control precise playback down to the exact second, keep your timeline perfectly readable, and build self-running, smart playlist logic.

In this article:
Fulfilling Factual Timelines (Time-of-Day Scheduling)
The Smart “Planned” Column: Predictive vs. Real Playout
Structuring Program Flow (Block End Methods & Auto-Shuffle)
Advanced Playout Control: Marker Cues & Command Actions
Automated Advertising: Managing Scheduled Break Blocks
Visual Organization & Operator Prompts (Colors, Notes & Pauses)
Broadcasting Exports & EPG Integration (Day Planner & XMLTV)
Enterprise Automation: Custom Playout Logic via PLAYDECK API


Fulfilling Factual Timelines (Time-of-Day Scheduling)

Many broadcasting environments, corporate events, and digital signage installations require strict compliance with real-world clock times. PLAYDECK solves this through individual block schedules.

  • The Concept: Instead of scheduling single clips, you organize your media into Playback Blocks and apply an absolute time constraint to the entire block.
  • The Setup:
    • Select your target Playback Block in the timeline.
    • Click the Clock Icon on the block header toolbar.
    • Enter your target start time down to the exact second (e.g., 11:02:48 AM).
  • Auto-Trigger Engine: Once you enable the auto-trigger flag, PLAYDECK continuously checks the system clock. The moment the scheduled time arrives, the block fires automatically. To keep operators perfectly prepared, a live, frame-accurate countdown timer to the next (earliest) upcoming scheduled block is displayed right at the top of the interface next to the Preview window.


The Smart “Planned” Column: Predictive vs. Real Playout

One of PLAYDECK’s most powerful features is its real-time mathematical timeline engine, visible in the Planned column of your playlist view.

  • Predictive Calculation: The moment you assign a schedule to a block, PLAYDECK instantly calculates the exact airtime for every single clip within that block. This engine is highly intelligent: it automatically factors in custom clip trims (In/Out points), loop configurations, and transition durations. You will see exactly when Clip #5 will go on air before the block even starts. Planned times and block duration only include clips that can play in this take. Inactive clips and gray clips (Shuffle leftover or Limit Playout) are omitted.
  • Dynamic Reality Update: The moment the block goes LIVE, the “Planned” column instantly adapts. If a live event ran long and your block started 45 seconds later than scheduled, the column dynamically stops showing the theoretical schedule. Instead, it instantly updates to reflect the actual, real-world execution times for all remaining clips based on the current playout reality.


Structuring Program Flow (Block End Methods & Auto-Shuffle)

Automation is not just about when a block starts, but how PLAYDECK behaves after a block finishes playing. By opening the Block End behavior settings (the list icon on the block header), you define the automatic transition logic between different program segments.

  • Jump to next Block & PLAY next Block: This is the standard linear broadcasting rule. Once the current block finishes its last take clip, PLAYDECK automatically skips to the next block in the list and immediately triggers playback. You can even define a custom delay in seconds before the next block fires off.
  • Loop Block & Clip Shuffle: The block repeats until a manual command or a scheduled block overrides it. Open Clip Shuffle / Sync on the Block to shuffle all clips, only N clips, or fill a time budget (Shuffle time). Optional Sync clips alone (No Shuffle) or together with Shuffle keeps the block matched to a folder while the Block is idle (not Current/Next; cooldown ~10s / ~30s when clips were added). PLAYDECK deals a take on block header CUE/PLAY/Fade, when the Block becomes Next, or when a Schedule / Break enters that Block — not when you CUE a clip inside the Block. Leftover clips stay gray (↷). Looping keeps the same take. Details: Playout Rules.


Advanced Playout Control: Marker Cues & Command Actions

For advanced show control and complex broadcasting logic, PLAYDECK provides internal triggers that extend far beyond standard linear video playback.

  • Clip Timeline Markers: Within the individual clip timeline, you can set dedicated Markers to act as precise jump points for separate CUE triggers. These markers can be jumped to manually by an operator or targeted automatically via system commands.
  • Playout Overrides via Commands: Commands represent a deeper method of structuring your program flow. You can attach execution commands to individual clips or entire blocks at any position—including timestamps relative to the end of a clip. These commands can fully remote-control PLAYDECK, enabling your timeline to automatically trigger external events, change channel states, or jump directly to a targeted clip based on complex programming needs.


Automated Advertising: Managing Scheduled Break Blocks

Integrating commercials or commercial breaks into an automated schedule is built directly into the program flow engine.

  • The Break Block Concept: If you want ads to seamlessly interrupt your active playout, you can format a block as a dedicated Break Block.
  • Automatic Resuming: Set the block end behavior to Break Block and configure it to Return to last Clip/Position. When the break ends, PLAYDECK cuts back to your main playlist, resuming the exact frame of the video clip that was playing before the interruption.
  • Interval Scheduling: These ad breaks can be tightly scheduled. You can time them to fire off at absolute real-world clock times or configure them to execute periodically on a fixed interval, such as every 15 minutes. For more information, check out the specialized Ad Breaks Documentation.


Visual Organization & Operator Prompts (Colors, Notes & Pauses)

When managing complex broadcast schedules, keeping the user interface readable and providing reminders for operators is key to a flawless production.

  • Color Coding: You can visually group your program items by right-clicking any clip or group of clips and selecting Color. Use this to instantly separate commercials (e.g., Red) from your main content (e.g., Green), making long playlists highly scannable.
  • Text Notes for Segmenting: You can drag and drop text Notes directly into the playlist just like normal clips. These notes act as visual separators to segment your program within a block. They appear prominently as an INFO banner in the UI Preview window to remind an operator of crucial tasks (e.g., “Switch audio mixer now!” or “Prepare graphic overlay”), but they are completely invisible to your master output signal.
  • EPG Programme Descriptions: The same Notes can also supply the programme description (<desc>) when you export XMLTV. Place a Note inside the scheduled block (after the first clip, before the block end). If you use Notes as live operator prompts, keep those separate from EPG text — every Note in the block is concatenated into one description.
  • Playout Rules: The pause icon on a clip opens Playout RulesAfter Clip Action is pause, stop, or continue after the clip (with optional delay). Limit Playout restricts a clip by weekdays, primetime, campaign dates, and max playouts per day. Gray clips (↷) are skipped by automation; inactive clips (checkbox off) cannot be started at all. Full guide: Playout Rules.


Broadcasting Exports & EPG Integration (Day Planner & XMLTV)

To hand over your automated schedule to management teams or external broadcasting networks, PLAYDECK offers industry-standard export tools located under the File menu.

  • Export Project as Day Planner: This tool generates a clean, highly visual PDF overview of your schedule. It provides a macro-view of your program structure and clearly highlights scheduled Ad Breaks and playlist GAPs. Ideal for production managers who need to verify gapless program planning.
  • Export Project as XMLTV: Essential for formal broadcasting workflows. This exports an XML file with programme start/stop times from your scheduled playlist blocks. The format is widely used by IPTV servers, set-top boxes, and TV guide / EPG apps to show live programme information to viewers.


How to create a working EPG (step by step)

  1. Schedule your programmes
    Only blocks with an active Schedule (time-of-day / weekday / date) become XMLTV programmes. The block name becomes the programme <title>. Unscheduled or inactive blocks are skipped. Break blocks are also skipped — they are interruptions, not stand-alone TV programmes.
  2. Set channel names
    In Settings → Channel, set each channel’s Channel Name. These names appear as <display-name> in the XMLTV file. Channel IDs are always playdeck.1playdeck.2, …
  3. Add programme descriptions (optional)
    Insert a playlist Note inside the block with the viewer-facing synopsis. On export, that text becomes <desc>.
    • Put the Note inside the block (safest: after the first clip, before the block end).
    • Multiple Notes in the same block are merged into one description (separated by spaces).
    • Do not mix live operator reminders into the same Notes if you care about a clean EPG.
  4. Export
    File → Export Project as XMLTV…
    PLAYDECK writes programmes for the near schedule window (about two weeks ahead). Channels must be licensed and started to appear in the export.
  5. Publish & map in your IPTV / EPG system
    Host the .xml file on a URL your IPTV panel, middleware, or guide app can fetch (or copy it into the system). Then map each XMLTV channel id to your stream:
    • playdeck.1 → Channel 1 stream
    • playdeck.2 → Channel 2 stream
      Without this mapping, the guide often looks “empty” even though the file contains data.
  6. Refresh when the schedule changes
    XMLTV is a snapshot. After playlist or schedule edits, export again and update the file on your server / panel.

Day Planner vs XMLTV — important differences

Day Planner (PDF)XMLTV (EPG)
PurposeInternal planning overviewViewer-facing TV guide
Gaps / empty timeShown as GAP rowsNot exported
Ad BreaksVisible in the PDFNot exported as programmes
Programme titleBlock nameBlock name → <title>
Programme descriptionPlaylist Notes → <desc>

If the PDF looks “full” but the guide looks empty, check: correct calendar day, channel mapping (playdeck.N), and that you are looking at real programmes — not GAPs.

Minimal example

<programme start="20260810200000 +0000" stop="20260810210000 +0000" channel="playdeck.1">
  <title lang="en">Evening News</title>
  <desc lang="en">The latest national and international news stories of the day.</desc>
</programme>

(Category and icon are optional and currently not exported.)



Enterprise Automation: Custom Playout Logic via PLAYDECK API

If your broadcasting workflow requires deeply customized automation logic, proprietary scheduling databases, or integration with external master control switchers, you can bypass the standard user interface entirely.

  • Full Remote Architecture: PLAYDECK features a comprehensive, open programming interface.
  • Custom Playout Scripts: By using the PLAYDECK API, you can write your own custom scripts and external software logic to control, update, override, and drive your entire playout engine according to your custom rules.
1 2 3 4 6