SCTE-35 markers travel in MPEG transport streams. In PLAYDECK that means UDP, SRT, DVB-compatible streaming, MPEG-TS recordings, and HLS segments — not SDI and not MKV/RTMP.
On SDI, use SCTE-104 instead: Using SCTE-104 on SDI.
Full from→to matrix: Closed Captions & SCTE — Overview.
PLAYDECK lets you author your own SCTE-35 XML (flexible for any receiver). Placeholders fill in clip/block timing and IDs.
In this article:
→ Enable SCTE-35
→ Where to attach markers
→ XML examples & placeholders
→ Local stream loop test
→ Forwarding between streams
→ HLS output
→ Test with Nimble Streamer
→ Logging & tools
→ Related
Enable SCTE-35
SCTE-35 is not on by default for streams/recordings. Open Parameter and set:
embed_scte35='true'
| Works with | Does not apply |
|---|---|
UDP, SRT, DVB-compatible (format mpegts/dvb), MPEG-TS file record, HLS segments | SDI, NDI, MKV, RTMP/FLV |
The video codec does not matter for SCTE-35 (unlike Closed Captions / embed_cc).
UDP URL tip: use your LAN IP (e.g. udp://192.168.x.x:5000?pkt_size=1316). Prefer not 127.0.0.1.
You can combine with captions when needed:
embed_scte35='true' embed_cc='true'
No conflict was found between SCTE-35 and embed_cc on MPEG-TS streams (unlike SCTE-104 + active CC/ASS track on SDI — see overview limits).
Where to attach markers
Attach SCTE commands to:
- Clips (any play position)
- Blocks (start / end)
- Overlays (show / hide)
- Action buttons
Set the command type to SCTE-35 (not SCTE-104) when the target is a stream or TS file.
XML examples & placeholders
Formats vary by receiver. The samples below match the SCTE-35 Out / In buttons in the Commands dialog and work for typical splice_insert / SSAI workflows (including Nimble). Ask your provider if they need a different XML shape.
One ad break airing = one spliceEventId. The marker that opens the break ({eventid}) and the marker that closes it ({eventlastid}) must carry the same number. The next break gets a new ID. PLAYDECK increments a per-channel counter when {eventid} / {eventidhex} is in the XML; {eventlastid} / {eventlastidhex} reuse the last value and do not increment. The counter is not stored on the playlist row (a loop or the next day must not reuse yesterday’s ID). It resets when PLAYDECK restarts.
Do not put {timestamp} into spliceEventId — parsers often read the year (e.g. 2026) as the event ID.
Duration placeholders fill only while the channel is playing. For a block break use {blockduration} (90 kHz ticks: seconds × 90000). {clipduration} is the current clip, not the whole break.
Splice with duration (auto-return)
Use on block start (or an Action that opens the break). autoReturn="1" lets the receiver return after the duration; you can still fire an In with {eventlastid} if your chain wants an explicit CUE-IN.
<SpliceInfoSection>
<SpliceInsert
spliceEventId="{eventid}"
outOfNetworkIndicator="1"
spliceImmediateFlag="1">
<Program />
<BreakDuration
autoReturn="1"
duration="{blockduration}" />
</SpliceInsert>
</SpliceInfoSection>
Splice In (return)
Same break, block end (or a second Action). No duration. Same ID via {eventlastid}.
<SpliceInfoSection>
<SpliceInsert
spliceEventId="{eventlastid}"
outOfNetworkIndicator="0"
spliceImmediateFlag="1">
<Program />
</SpliceInsert>
</SpliceInfoSection>
outOfNetworkIndicator 1 = leave program (CUE-OUT), 0 = return (CUE-IN). Close </SpliceInsert> — missing end tags break many parsers.
Placeholders
| Token | What you get |
|---|---|
{eventid} | New event ID (decimal). Increments once per command that contains {eventid} / {eventidhex}. |
{eventlastid} | Last event ID, no increment. Use on In. |
{eventidhex} / {eventlastidhex} | Same IDs as 8-digit hex (SCTE-104 <data>). |
{blockduration} | Block length, 90 kHz decimal (SCTE-35). |
{clipduration} | Current clip length, 90 kHz. |
{blockduration10} / {clipduration10} | Same length in tenths of a second (SCTE-104). |
{blockduration10hex} | Tenths as 4-digit hex, max FFFF. |
{blockduration+6} / {blockduration10hex+6} | Add/subtract whole seconds (e.g. opener/closer). Spaces allowed inside { }. |
{timestamp} {timestampunix} {airtimenext} {plannednext} {clipid} {blockid} | Timing / playlist IDs — not for spliceEventId. |
Command type must be SCTE-35 (not SCTE-104) when the target is a stream or TS file.
Local stream loop test
- Channel 1: start UDP or SRT with
embed_scte35='true'. - Channel 2: play the same URL as a stream clip.
- Action on Ch1 with SCTE-35 XML → Event Log:
>>on Ch1,<<SCTE-35 on Ch2.
Optional: record to a .ts file with embed_scte35='true', fire markers while recording, then confirm in DVB Inspector and by playing the file in PLAYDECK (<<). See Recording CC & SCTE.
Forwarding between streams
PLAYDECK can forward SCTE-35 across stream inputs/outputs (e.g. SRT → UDP or Ch1 → Ch2 → Ch3 over UDP).
Receivers show << on each hop when embed_scte35 is enabled on each outgoing MPEG-TS stream.
Not supported: automatic SCTE-104 → SCTE-35 when an SDI source is streamed to IP. Send SCTE-35 on the streaming channel instead.
HLS output
If you select Apple HLS, PLAYDECK writes a local .m3u8 (+ segments), not a live CDN publish by itself.
- PLAYDECK does not write SCTE/CUE tags into the
.m3u8manifest. - SCTE-35 / CC can still be present in segments. Playing the m3u8 in PLAYDECK can show CC and
<<SCTE-35. - For manifest-based ad markers (e.g.
#EXT-X-CUE-OUT), use a server such as Nimble (below) or another packager that converts SCTE-35 → HLS cues.
Test with Nimble Streamer
Typical path: PLAYDECK UDP + embed_scte35 → Nimble → HLS with cue tags.
- Install Nimble; enable SCTE in
nimble.conf(example):
Restart the Nimble service after editing.
scte35_processing_enabled = true
scte35_forwarding_enabled = true
hls_ad_scte35_forwarding_enabled = true
hls_ad_marker_format = cue
hls_ad_splice_out_cont_marker_enabled = true
- In WMSPanel: MPEG-TS In (UDP) matching PLAYDECK’s target; MPEG-TS Out / HLS as needed.
- PLAYDECK stream URL → that UDP port; video codec free (e.g. H.264);
embed_scte35='true'. - Attach SCTE-35 to clip start (or Action); start stream; verify cues in Nimble logs and in HLS chunk playlists (browser Network tab).
Logging & tools
- PLAYDECK SCTE Event Log:
>>sent,<<received. - DVB Inspector / TSDuck: inspect SCTE-35 inside
.tsfiles or captures. - MediaInfo: great for CC tracks; often does not list SCTE-35 clearly.
Related
| Article | Topic |
|---|---|
| Closed Captions & SCTE — Overview | Full matrix, domains, limits |
| Using SCTE-104 on SDI | SDI VANC markers |
| Closed Captions & Subtitles | CC burn-in / pass-through |
| Recording CC & SCTE | MKV vs TS, sidecars, playback checks |