Sending SCTE-35 to Streams & Servers

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 withDoes not apply
UDP, SRT, DVB-compatible (format mpegts/dvb), MPEG-TS file record, HLS segmentsSDI, 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
TokenWhat 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

  1. Channel 1: start UDP or SRT with embed_scte35='true'.
  2. Channel 2: play the same URL as a stream clip.
  3. 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 .m3u8 manifest.
  • 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.

  1. 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

  1. In WMSPanel: MPEG-TS In (UDP) matching PLAYDECK’s target; MPEG-TS Out / HLS as needed.
  2. PLAYDECK stream URL → that UDP port; video codec free (e.g. H.264); embed_scte35='true'.
  3. 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 .ts files or captures.
  • MediaInfo: great for CC tracks; often does not list SCTE-35 clearly.

Related

ArticleTopic
Closed Captions & SCTE — OverviewFull matrix, domains, limits
Using SCTE-104 on SDISDI VANC markers
Closed Captions & SubtitlesCC burn-in / pass-through
Recording CC & SCTEMKV vs TS, sidecars, playback checks