Import / Export Show Package

Export show package puts your current show into one .7z file: project, media, and the background settings that belong with it. Typical use: prep on a laptop, copy the package to a stick, Import show package on the show PC — without relying on the same drive letters or shared storage.


Export

BBuild and save your project as usual, then:

  • File → Export show package…
  • Choose where to save the .7z. The suggested name is your project name plus _pack (for example MyShow_pack.7z).
  • Confirm overwrite if that file already exists.

PLAYDECK collects the media, writes a copy of your project XML under its original name, and builds the archive. Large shows take a moment; there is no “done” popup when the export succeeds. Missing media files are reported and skipped.


Import

On the show PC (or any machine that should run the show):

  • File → Import show package…
  • Select the .7z.
  • Choose the destination folder.
  • When asked, confirm whether to load the project now.

PLAYDECK extracts the files into the destination folder. Paths inside the project XML stay as they were when exported. If you load the project, PLAYDECK checks for missing media next to the XML and under the last Locate folder you used. You can Locate a media root if anything is still missing. Channel background settings from the package are applied when you load. Again, no success popup.


Confirm dialog

Confirm dialog (only if the exported settings file is present — a hand-made .7z without it skips this and only extracts):

When the package contains a project XML → Apply channel backgrounds (and related settings) now and load this project?
 Yes: load the project, then overwrite channel backgrounds (and related exported settings) on this PC.

If the package has no project XML → Apply channel backgrounds (and related settings) now?
 Yes: overwrite channel backgrounds (and related exported settings) only.


What is included

  • Playlist file clips and overlay media (graphics, video overlays, text/crawler sources, HTML templates)
  • Your project XML with the same filename you exported from
  • Channel backgrounds — exported and, on import + load, written over your current channel background settings (type, color, file, keep-audio). Defaults for stream / audio-only clips are updated the same way when they were part of the export.
  • Input device background files are copied into the package only; import does not change your input background settings

Website / YouTube entries and live sources stay as references — they are not downloaded into the package.

Start Ad Breaks from Incoming SCTE

PLAYDECK can send SCTE markers with clip and block commands. It can also listen for incoming SCTE-35 or SCTE-104 and jump into a Break Block when a marker matches.

That is useful when an upstream encoder, automation, or another PLAYDECK channel fires the OUT cue — and you want your ad block to start automatically, then return when the break is over.

You need an SCTE license. The block must be a Break Block (Block End → Break), so PLAYDECK knows where to return after the ads.

In this article:
→ Open the SCTE Trigger editor
→ How matching works
→ Start Time
→ Block Duration modes
→ Quick recipe (typical FAST / server cue)
→ Related


Open the SCTE Trigger editor

Select the Break Block header and open Edit SCTE Trigger (playlist shows a small SCTE hint when triggers are saved).

Each trigger has:

  • SCTE OUT — Play this Block — pattern(s) that start the Break
  • SCTE IN — Return — optional pattern(s) that end the Break early (depending on duration mode)
  • Start Time — when the Break starts after an OUT match
  • Block Duration — how long the Break runs before return


Use SCTE Logs in the dialog (or Logs → SCTE) while testing.


How matching works

Put one match string per line in the OUT and IN memos. Every non-empty line must appear in the incoming marker text (All lines = AND). Spaces and quotes are ignored. Samples for SCTE-35 / SCTE-104 (and duration variants) are in the dialog — use them as a starting point, then trim to what your feed really sends.

The OUT pattern must match what PLAYDECK actually receives. Open Logs → SCTE while testing. Lines starting with << show the inbound cue — copy distinctive fragments into your match lines.

Examples of fragments people often match:

  • SCTE-35 immediate OUT: SpliceInfoSection, SpliceInsert, outOfNetworkIndicator=”1″, spliceImmediateFlag=”1″
  • SCTE-35 IN: SpliceInfoSection, SpliceInsert, outOfNetworkIndicator=”0″
  • SCTE-104 OUT (decoded inbound, not raw hex data): SCTE-104, multiple_operation_message, opID 257, splice_insert_type 2
  • SCTE-35 timed start with ptsTime (for example TimeSignal): SpliceInfoSection, TimeSignal, ptsTime


If your OUT pattern still requires spliceImmediateFlag="1", a cue with Flag="0" or a TimeSignal-only marker will never fire. Always align the pattern with a real << line from your log.

Triggers react only to inbound << cues, not to >> send lines alone. For a loopback test, the listening input must see the stream that carries the marker.


Start Time

When the OUT pattern matches, Start Time decides when the Break Block actually starts.

ModeWhat happens
Immediately after arrivalStart the Break as soon as the OUT pattern matches (default).
Delay from SCTE cue (pre-roll / PTS / timestamp)Read a start delay from the cue (see below). If nothing usable is found, PLAYDECK starts now and writes a note in the SCTE log.
Fixed Delay (MM:SS:FF)Wait this long after the match, then start. FF is handled like show duration, then applied using the channel frame rate.

Delay from SCTE cue — what is read

SCTE-104

  • pre_roll_time in milliseconds
  • and/or <timestamp>: time_type 0 = process now; 1 = UTC (NTP); 2 = VITC-style wall-clock (hours / minutes / seconds / frames)
  • Effective delay = time until that moment (if still in the future) plus pre-roll


SCTE-35

  • spliceImmediateFlag="1" → delay 0 (same as immediate for start)
  • otherwise ptsTime / pts_time (90 kHz program clock), compared to the stream clock on the same frame that carried the cue → delay until that point (with a safety cap)


If the target time is already in the past (VITC or PTS), the Break starts immediately.

Not every send path preserves ptsTime on every cue type. What matters in production is whether your << inbound log still contains ptsTime (or 104 pre-roll / timestamp). TimeSignal markers that include ptsTime are a common case for timed SCTE-35 starts.


Block Duration modes

ModeWhat happens
Wait for SCTE INOUT starts the Break (after Start Time). Return when an IN pattern matches. You must set Pattern IN.
Duration from SCTE OUT (break duration)OUT starts the Break. Return after the break duration carried in that OUT marker: SCTE-35 BreakDuration / duration (90 kHz ticks), or SCTE-104 break_duration (tenths of a second). If no duration is found, PLAYDECK falls back to waiting for IN (if you set one).
Fixed DurationOUT starts the Break. Return after the time you enter (HH:MM:SS).
Play until Block endOUT starts the Break. Return when the Break Block finishes normally (same idea as a scheduled/action Break reaching its end).

An IN match always returns early and cancels a running timer.

Cues without a break duration (for example many TimeSignal-only markers) need Fixed Duration, Wait for SCTE IN, or Play until Block end — otherwise PLAYDECK has no return path and will log that.

When OUT fires, PLAYDECK remembers the clip that was playing and jumps into the Break. Return uses that saved position (via the Break’s After Break setting / normal return path).


Quick recipe (typical FAST / server cue)

  • Commands on clips/blocks/Actions = send SCTE (>> in the log). See SCTE-35 / SCTE-104 articles.
  • SCTE Triggers on a Break Block = react to incoming markers (<<) and drive playout.


Both can live in the same project. A Break can still carry outbound SCTE commands at start/end if your packager also needs markers from PLAYDECK.

For live ingest that must survive the Break, use a permanent Channel Input (not a playlist stream URL) — see Ad Breaks.

Typical setups

  • Server sends immediate SCTE-35 OUT → Start Time: Immediately after arrival; Duration: from SCTE OUT, or Fixed / Wait for IN
  • SCTE-104 with pre-roll or timestamp → Start Time: Delay from SCTE cue; Duration as needed
  • SCTE-35 with ptsTime in the inbound cue → Start Time: Delay from SCTE cue; OUT pattern must match that cue (not only Flag="1"); Duration often Fixed or Wait for IN if the marker has no break duration


While testing

  • >> in the log = something was sent
  • << = PLAYDECK received a cue
  • OUT/DELAY, OUT/PLAY, START/PLAY, IN/RETURN, TIMER/RETURN = trigger actions

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
Using SCTE-104 on SDISDI VANC markers

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 Playout. Default 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 — each new loop cycle deals a fresh take when that lap starts (the clip that just became Current stays put; the rest of the block is reshuffled). While the last clip of the old lap is still playing, Next already points at the first clip of the current order — PLAYDECK does not reshuffle under the playhead.
  • Loop Clips — keeps the same take for the looped clip range.
  • 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.

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 (*.mp4, mp4, .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.mov. Reset 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).

A 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 / shuttleField/frame scrub (speed = how fast the panel sends steps; a firm twist is often only about play speed). Shuttle rate commands (if the panel sends them) = slow-mo to fast fwd/rev. Release = still. Play = 1×. Scrub feels smoother with more keyframes; reverse is heavier.
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 speedClip cued or paused; after release it stays still (press Play for 1×). Soft scrub is normal for field-jog — not a fast shuttle.
Cue failsUse the exact ID shown in the clip list (8-character or full long name on Carbonite/Tria-style)
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.xml, 14-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 start. time_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_index, DPI_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.

Incoming SCTE-104 is not only for logging and forwarding. You can match markers on a Break Block (Edit SCTE Trigger) so PLAYDECK jumps into ads when the OUT cue arrives, then returns on IN, after a fixed time, or at Block end. See Start Ad Breaks from Incoming SCTE.


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
Start Ad Breaks from Incoming SCTEMatch inbound SCTE → play Break Block

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 PLAYDECK ↔ PLAYDECK 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

1 2 3 4 … 6