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

  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