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.
splice_insert · break starts · at 21514.559089 s · break 60.294 s, auto-return
splice_info_section
| table_ | 0xFC | |
|---|---|---|
| section_ | false | |
| private_ | false | |
| sap_ | 0x3 (Not specified) | |
| section_ | 47 | 50 bytes in all |
| protocol_ | 0 | |
| encrypted_ | false | |
| encryption_ | 0 (None) | |
| pts_ | 0.000000 s | 0 ticks |
| cw_ | 0xFF | |
| tier | 0xFFF | All tiers |
| splice_ | 20 | 20 bytes |
| splice_ | 0x05 (splice_insert) | |
| descriptor_ | 10 | 10 bytes |
| CRC_ | 0x62DBA30A | Matches the bytes |
splice_insert
| splice_ | 0x4800008F (1207959695) | |
|---|---|---|
| splice_ | false | |
| out_ | true | Leaves the network: the break starts |
| program_ | true | The whole programme splices together |
| duration_ | true | |
| splice_ | false | |
| event_ | true | |
| time_ | true | |
| pts_ | 21514.559089 s | 1936310318 ticks · 05:58:34.559 |
| auto_ | true | Returns to the network by itself when the break ends |
| break_ | 60.293567 s | 5426421 ticks · 00:01:00.294 |
| unique_ | 0 | |
| avail_ | 0 | |
| avails_ | 0 |
Descriptor 1: avail_descriptor
| splice_ | 0x00 (avail_descriptor) | |
|---|---|---|
| descriptor_ | 8 | |
| identifier | CUEI | |
| provider_ | 309 |
What the decoder reads
- Every splice command:
splice_insert,time_signal,splice_schedule,splice_null,bandwidth_reservationandprivate_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.