Free tool

SCTE-35 decoder

Paste a SCTE-35 cue — base64, hex, or the whole HLS or DASH line — and see what it says: the splice command and its times, the break duration, every segmentation descriptor and UPID, and whether the CRC is right. Free, and it runs in your browser.

Examples from the SCTE 35 standard
CRC_32 OK50 bytes

splice_insert · break starts · at 21514.559089 s · break 60.294 s, auto-return

splice_info_section

table_id0xFC
section_syntax_indicatorfalse
private_indicatorfalse
sap_type0x3 (Not specified)
section_length4750 bytes in all
protocol_version0
encrypted_packetfalse
encryption_algorithm0 (None)
pts_adjustment0.000000 s0 ticks
cw_index0xFF
tier0xFFFAll tiers
splice_command_length2020 bytes
splice_command_type0x05 (splice_insert)
descriptor_loop_length1010 bytes
CRC_320x62DBA30AMatches the bytes

splice_insert

splice_event_id0x4800008F (1207959695)
splice_event_cancel_indicatorfalse
out_of_network_indicatortrueLeaves the network: the break starts
program_splice_flagtrueThe whole programme splices together
duration_flagtrue
splice_immediate_flagfalse
event_id_compliance_flagtrue
time_specified_flagtrue
pts_time21514.559089 s1936310318 ticks · 05:58:34.559
auto_returntrueReturns to the network by itself when the break ends
break_duration60.293567 s5426421 ticks · 00:01:00.294
unique_program_id0
avail_num0
avails_expected0

Descriptor 1: avail_descriptor

splice_descriptor_tag0x00 (avail_descriptor)
descriptor_length8
identifierCUEI
provider_avail_id309

Need cues checked inside your own workflow — every break in a playlist or a stream, automatically? 9eye Studio builds that.

What the decoder reads

  • Every splice command: splice_insert, time_signal, splice_schedule, splice_null, bandwidth_reservation and private_command.
  • Every descriptor: segmentation (all segmentation types, delivery restrictions, sub-segments), avail, DTMF, time and audio. Private descriptors are shown as bytes.
  • Every UPID type: Ad-ID, EIDR (with its check character), UMID, ISAN, TID, AiringID, ADI, MPU, URI, UUID, ATSC content ID and MID with several UPIDs inside.
  • Checks: the CRC_32, the section and command lengths, and cues that are cut short.
  • Input: base64, hex with or without 0x, or a whole line: #EXT-X-DATERANGE … SCTE35-OUT=0x…, #EXT-OATCLS-SCTE35:, #EXT-X-SCTE35 CUE="…" or DASH <Binary>.

Copy JSON gives the decoded fields with the standard's names, for a ticket or a test. Copy link gives a link that opens this page with the same cue, to send to a colleague.

SCTE-35 and SCTE-104

SCTE-104 is how the automation system tells the encoder about a break, on the SDI or IP side before compression. The encoder turns each SCTE-104 message into a SCTE-35 cue in the compressed stream: a splice request becomes a splice_insert, a time signal request becomes a time_signal, and segmentation descriptors carry over. When a break goes missing downstream, decoding the SCTE-35 cue shows whether the encoder got the right message.

Where the breaks come from

The cues mark breaks that someone planned. 9eye is broadcast scheduling and traffic software that places ad breaks and spots frame-accurately in every playlist, for linear and FAST channels. See TV traffic software or FAST channel scheduling. More free tools: the timecode calculator and the TV schedule template.

SCTE-35 questions

What is a SCTE-35 cue?

A short binary message inside a video stream that marks an event: an ad break starting or ending, a programme starting, a place where a local ad may go. Ad servers, packagers and playout systems act on it. In HLS and DASH it is carried as base64 or hex text, which is what this decoder reads.

What is the difference between splice_insert and time_signal?

splice_insert is the older, simpler command: it says "leave the network now (or at this time) for this long" and is mostly used for ad breaks. time_signal only gives a time; what happens at that time is described by segmentation descriptors (programme start, ad opportunity, chapter, and so on), which makes it the more flexible choice in current workflows.

Why is the time a large number like 21514.559089 seconds?

SCTE-35 times are PTS values on the 90 kHz clock of the video stream, not clock time. They count from an arbitrary start and wrap after about 26.5 hours. If the cue has a pts_adjustment, it is added to every pts_time; the decoder shows both.

Where do I find SCTE-35 cues in HLS or DASH?

In HLS, in #EXT-X-DATERANGE tags (SCTE35-OUT, SCTE35-IN, SCTE35-CMD in hex), #EXT-OATCLS-SCTE35 (base64) or #EXT-X-SCTE35 (CUE="…"). In DASH, in an EventStream inside <Signal><Binary>. Paste the whole line: the decoder finds the cue in it.

What does "CRC_32 does not match" mean?

Every cue ends with a checksum of its bytes. If it does not match, the cue was changed or damaged on the way — often by a tool that rewrote a field without updating the CRC. Equipment may drop such a cue, so the break never happens.

Is my data sent anywhere?

No. The decoder runs in your browser and nothing you paste leaves the page. A copied link keeps the cue after the # sign, which browsers do not send to the server.