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 work well with many splice workflows (including Nimble). Ask your provider if unsure.
Splice with duration (auto-return)
<SpliceInfoSection>
<SpliceInsert
spliceEventId="4157"
outOfNetworkIndicator="1"
spliceImmediateFlag="1">
<Program />
<BreakDuration
autoReturn="1"
duration="{clipduration}" />
</SpliceInsert>
</SpliceInfoSection>
{clipduration} is filled by PLAYDECK (same idea as {blockduration}).
Manual duration: clip length in seconds × 90000, rounded (90 kHz timescale).
CUE-OUT / CUE-IN pair
<SpliceInfoSection>
<SpliceInsert
spliceEventId="4157"
outOfNetworkIndicator="1"
spliceImmediateFlag="1">
<Program />
</SpliceInsert>
</SpliceInfoSection>
<SpliceInfoSection>
<SpliceInsert
spliceEventId="4157"
outOfNetworkIndicator="0"
spliceImmediateFlag="1">
<Program />
</SpliceInsert>
</SpliceInfoSection>
outOfNetworkIndicator 1 = leave program (CUE-OUT), 0 = return (CUE-IN). Pair by spliceEventId.
Placeholders
{timestamp} {timestampunix} {airtimenext} {airtimenextunix} {plannednext} {plannednextunix} {clipid} {blockid} {blockduration} {clipduration}
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 |