I strongly suggest using the xml+binary format for DASH, it is very straight forward, very compact, and the SCTE-35 data is exactly the same as regular SCTE-35. use xml+bin for DASH
- SCTE-35 xml and SCTE-35 xmlbin can be encoded to base64, bytes, hex, int, or json.
-
parse mpegts video and display scte-35 in xmlbin format.
threefive xmlbin sixed.ts -
convert to xmlbin format
threefive '/DAgAAAAAAAAAP/wDwUAAAABf0/+AFJlwAABAAAAALQOZyE=' xmlbin
<scte35:Signal xmlns="https://scte.org/schemas/35">
<scte35:Binary>/DAgAAAAAAAAAP/wDwUAAAABf0/+AFJlwAABAAAAALQOZyE=</scte35:Binary>
</scte35:Signal>-
write to a file in xmlbin format
a@fu:~$ threefive '/DAgAAAAAAAAAP/wDwUAAAABf0/+AFJlwAABAAAAALQOZyE=' xmlbin 2> xmlbin.xml -
read from the file and convert to bytes
a@fu:~$ threefive bytes < xmlbin.xml b'\xfc0\x00\x00\x00\x00\x00\x00\x00\xff\xf0\x0f\x05\x00\x00\x00\x01\x7fO\xfe\x00Re\xc0\x00\x01\x00\x00\x00\x00\xb4\x0eg!' -
read from a file and convert to base64
a@fu:~$ threefive base64 < xmlbin.xml /DAgAAAAAAAAAP/wDwUAAAABf0/+AFJlwAABAAAAALQOZyE= -
read from a file and convert to hex
a@fu:~$ threefive hex < xmlbin.xml 0xfc302000000000000000fff00f05000000017f4ffe005265c0000100000000b40e6721 -
read from a file and convert to plain xml
a@fu:~$ threefive xml < xmlbin.xml
<scte35:SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
<scte35:SpliceInsert spliceEventId="1" spliceEventCancelIndicator="false" spliceImmediateFlag="false" eventIdComplianceFlag="true" availNum="0" availsExpected="0" outOfNetworkIndicator="false" uniqueProgramId="1">
<scte35:Program>
<scte35:SpliceTime ptsTime="5400000"/>
</scte35:Program>
</scte35:SpliceInsert>
</scte35:SpliceInfoSection>- Xml to Base64
threefive < xml.xml
/DAsAAAAAAAAAP/wBQb+7YaD1QAWAhRDVUVJAADc8X+/DAVPVkxZSSIAAJ6Gk2Q=- Xml to hex
threefive hex < xml.xml
0xfc302c00000000000000fff00506feed8683d500160214435545490000dcf17fbf0c054f564c59492200009e869364- Xml to int
threefive int < xml.xml
151622312799635087445131038116901140411521203255173124307448868984487395583746158940007186416525810106184013091684- the cli can convert SCTE-35 base64, hex, or json to xml
a@fu:~/build/SCTE35_threefive$ threefive xml '0xfc302c00000000000000fff00506feed8683d500160214435545490000dcf17fbf0c054f564c59492200009e869364'
```xml
<scte35:SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
<scte35:TimeSignal>
<scte35:SpliceTime ptsTime="3985015765"/>
</scte35:TimeSignal>
<!-- Break Start -->
<scte35:SegmentationDescriptor segmentationEventId="56561" segmentationEventCancelIndicator="false" segmentationEventIdComplianceIndicator="true" segmentationTypeId="34" segmentNum="0" segmentsExpected="0">
<!-- MPU -->
<scte35:SegmentationUpid segmentationUpidType="12" segmentationUpidFormat="hexbinary" formatIdentifier="1331055705" privateData="73">4f564c5949</scte35:SegmentationUpid>
</scte35:SegmentationDescriptor>
</scte35:SpliceInfoSection>- MPEGTS streams can be parsed for SCTE-35 and the output encoded in Xml
threefive xml sixed.ts<scte35:SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="207000" protocolVersion="0" sapType="3" tier="4095">
<scte35:SpliceInsert spliceEventId="1" spliceEventCancelIndicator="false" spliceImmediateFlag="false" eventIdComplianceFlag="true" availNum="1" availsExpected="1" outOfNetworkIndicator="true" uniqueProgramId="39321">
<scte35:Program>
<scte35:SpliceTime ptsTime="6554297154"/>
</scte35:Program>
<scte35:BreakDuration autoReturn="true" duration="10798788"/>
</scte35:SpliceInsert>
<!-- Provider Placement Opportunity Start -->
<scte35:SegmentationDescriptor segmentationEventId="0" segmentationEventCancelIndicator="false" segmentationEventIdComplianceIndicator="true" segmentationTypeId="52" segmentNum="0" segmentsExpected="0" subSegmentNum="0" subSegmentsExpected="0" segmentationDuration="10800000">
<scte35:DeliveryRestrictions webDeliveryAllowedFlag="false" noRegionalBlackoutFlag="false" archiveAllowedFlag="false" deviceRestrictions="0"/>
<!-- Deprecated -->
<scte35:SegmentationUpid segmentationUpidType="1" segmentationUpidFormat="hexbinary">10100000</scte35:SegmentationUpid>
</scte35:SegmentationDescriptor>
</scte35:SpliceInfoSection>
- threefive prints output to stderr, stdout is used for piping data.
- To save the output of the cli tool redirect 2.
threefive xmlbin sixed.ts 2> fu.xmla@fu:~/build/SCTE35_threefive$ pypy3
Python 3.9.16 (7.3.11+dfsg-2+deb12u2, May 20 2024, 22:08:06)
[PyPy 7.3.11 with GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>> from threefive import Cue
>>>> cue=Cue('/DA4AAAAAAAA///wBQb+AKpFLgAiAiBDVUVJAAAAA3//AAApPWwDDEFCQ0QwMTIzNDU2SBAAABZE5vg=')
>>>> cue.decode()
True
>>>> cue.xml(xmlbin=False)<scte35:SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
<scte35:TimeSignal>
<scte35:SpliceTime ptsTime="11158830"/>
</scte35:TimeSignal>
<!-- Program Start -->
<scte35:SegmentationDescriptor segmentationEventId="3" segmentationEventCancelIndicator="false" segmentationEventIdComplianceIndicator="true" segmentationTypeId="16" segmentNum="0" segmentsExpected="0" segmentationDuration="2702700">
<!-- AdID -->
<scte35:SegmentationUpid segmentationUpidType="3" segmentationUpidFormat="text">ABCD0123456H</scte35:SegmentationUpid>
</scte35:SegmentationDescriptor>
</scte35:SpliceInfoSection>- By default, the Cue class returns xml in the xml+bin format
>>>> cue.xml()<Signal xmlns="https://scte.org/schemas/35">
<scte35:Binary>/DA4AAAAAAAA///wBQb+AKpFLgAiAiBDVUVJAAAAA3//AAApPWwDDEFCQ0QwMTIzNDU2SBAAABZE5vg=</scte35:Binary>
</Signal>- xml can now be passed in to a Cue instance when initialized
- both xml and xml+bin formats can be used.
x="
<Signal xmlns="https://scte.org/schemas/35">
<Binary>/DA4AAAAAAAA///wBQb+AKpFLgAiAiBDVUVJAAAAA3//AAApPWwDDEFCQ0QwMTIzNDU2SBAAABZE5vg=</Binary>
</Signal>
">>>> cue2=Cue(x)
>>>> cue2.xml(xmlbin=False)<scte35:SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
<scte35:TimeSignal>
<scte35:SpliceTime ptsTime="11158830"/>
</scte35:TimeSignal>
<!-- Program Start -->
<scte35:SegmentationDescriptor segmentationEventId="3" segmentationEventCancelIndicator="false" segmentationEventIdComplianceIndicator="true" segmentationTypeId="16" segmentNum="0" segmentsExpected="0" segmentationDuration="2702700">
<!-- AdID -->
<scte35:SegmentationUpid segmentationUpidType="3" segmentationUpidFormat="text">ABCD0123456H</scte35:SegmentationUpid>
</scte35:SegmentationDescriptor>
</scte35:SpliceInfoSection>- the namespace can be removed or changed in either the xml or xml+bin format
- to remove the scte35 namespace, set the optional ns arg to an empty string
>>>> cue.xml(xmlbin=False,ns='')<SpliceInfoSection xmlns="https://scte.org/schemas/35" ptsAdjustment="0" protocolVersion="0" sapType="3" tier="4095">
<TimeSignal>
<SpliceTime ptsTime="11158830"/>
</TimeSignal>
<!-- Program Start -->
<SegmentationDescriptor segmentationEventId="3" segmentationEventCancelIndicator="false" segmentationEventIdComplianceIndicator="true" segmentationTypeId="16" segmentNum="0" segmentsExpected="0" segmentationDuration="2702700">
<!-- AdID -->
<SegmentationUpid segmentationUpidType="3" segmentationUpidFormat="text">ABCD0123456H</SegmentationUpid>
</SegmentationDescriptor>
</SpliceInfoSection>