Threefive
threefive is SCTE-35. threefive Parses SCTE-35 in every available format. MPEGTS, HLS, DASH. Yes.
Install / Use
/learn @futzu/ThreefiveREADME
| cli | lib | examples | hls | encoding | sixfix | sidecar files | xml | iodisco.com/scte35 |
threefive is SCTE-35.
SCTE-35 Parser. SCTE-35 Decoder. SCTE-35 Encoder. MPEGTS SCTE-35 Packet Injection. HLS Manifest and Segment SCTE-35 Parser. HLS SCTE-35 Injection. SCTE-35 Xml and Xml+bin Decoder/ Encoder for DASH.
Latest version is v2.4.97
- Updated to latest version of new_reader for Zero packet loss Multicast (tested on OpenBSD and Debian).
- The cli has been Upgraded and tuned.
- Xml Node Namespaces and attribute namespaces are now configurable.
- Turned SegmentationDescriptor.segmentation_message back on.
- Fix UMID upid encoding
- Added a Super Amazing HLS SCTE-35 Parser to the threefive cli..
- Added a HLS SCTE-35 Encoder to the threefive cli..
- MPEGTS Packet Injection added to the threefive cli..
- sixfix : ffmpeg turns SCTE-35 streams to bin data (0x06), sixfix switches them back to SCTE-35 (0x86).
- Xml: Experimental support for SCTE-35 xml as an input and output ( DASH SCTE-214)
Documentation
- threefive is developed and tested on OpenBSD and Debian Sid.
Latest docs are always available in the python shell
>>>> from threefive import TimeSignal
>>>> help(TimeSignal)
install
- python3
python3 -mpip install threefive
- pypy3
pypy3 -mpip install threefive
Every time I fix a bug or add a feature, I do a new release. <br> This makes tracking down bugs and stuff much easier. <br> Keep up, I do releases for reasons.
a@slow:~/threefive$ threefive version
2.4.81
a@slow:~/threefive$
- Release versions are odd.
- Unstable testing versions are even.
cli
-
MPEGTS (proy,pts,sidecar,sixfix,show,xml)
lib
- New! threefive: more OO than you know
- Parse SCTE-35 programmatically with threefive </i>(write some code)</i>
- How to Use threefive.Cue
- Trigger on SCTE-35 Events using threefive.Stream
online parser
- iodisco.com/scte35 the only accurate online SCTE-35 parser (powered by threefive).
examples
- SCTE-35 code Examples
decryption
- Automatic AES decryption with threefive.Segment
webvtt
- Display SCTE-35 Data as WebVTT subtitles in Video
dash
- A minimal Dash SCTE-35 mpd parser
- Experimental Dash SCTE-214 Support Now available in threefive 2.4.81 (updated 10/15/2024)
encoding
</details> <details><summary>Cue Class</summary>- src cue.py
- The threefive.Cue class decodes a SCTE35 binary, base64, or hex encoded string.
class Cue(threefive.base.SCTE35Base)
| Cue(data=None, packet_data=None)
| __init__(self, data=None, packet_data=None)
| data may be packet bites or encoded string
| packet_data is a instance passed from a Stream instance
Cue.decode()
| decode(self)
| Cue.decode() parses for SCTE35 data
- After Calling cue.decode() the instance variables can be accessed via dot notation.
>>>> cue.command
{'calculated_length': 5, 'name': 'Time Signal', 'time_specified_flag': True, 'pts_time': 21695.740089}
>>>> cue.command.pts_time
21695.740089
>>>> cue.info_section.table_id
'0xfc'
Cue.get()
| get(self)
| Cue.get returns the SCTE-35 Cue
| data as a dict of dicts.
Cue.get() Example
>>> from threefive import Cue
>>> cue = Cue('0XFC301100000000000000FFFFFF0000004F253396')
>>> cue.decode()
True
>>> cue
{'bites': b'\xfc0\x11\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00O%3\x96',
'info_section': {'table_id': '0xfc', 'section_syntax_indicator': False, 'private': False, 'sap_type': '0x3',
'sap_details': 'No Sap Type', 'section_length': 17, 'protocol_version': 0, 'encrypted_packet': False,
'encryption_algorithm': 0, 'pts_adjustment_ticks': 0, 'pts_adjustment': 0.0, 'cw_index': '0x0', 'tier': '0xfff',
'splice_command_length': 4095, 'splice_command_type': 0, 'descriptor_loop_length': 0, 'crc': '0x4f253396'},
'command': {'command_length': None, 'command_type': 0, 'name': 'Splice Null'},
'descriptors': [], 'packet_data': None}
- Cue.get() omits cue.bites and empty values
>>> cue.get()
{'info_section': {'table_id': '0xfc', 'section_syntax_indicator': False,'private': False, 'sap_type': '0x3',
'sap_details': 'No Sap Type', 'section_length': 17, 'protocol_version': 0, 'encrypted_packet': False,
'encryption_algorithm': 0, 'pts_adjustment_ticks': 0, 'pts_adjustment': 0.0, 'cw_index': '0x0', 'tier': '0xfff',
'splice_command_length': 4095, 'splice_command_type': 0, 'descriptor_loop_length': 0, 'crc': '0x4f253396'},
'command': {'command_type': 0, 'name': 'Splice Null'},
'descriptors': []}
Cue.get_descriptors()
| get_descriptors(self)
| Cue.get_descriptors returns a list of
| SCTE 35 splice descriptors as dicts.
Cue.get_json()
| get_json(self)
| Cue.get_json returns the Cue instance
| data in json.
Cue.show()
| show(self)
| Cue.show prints the Cue as JSON
Cue.to_stderr()
| to_stderr(self)
| Cue.to_stderr prints the Cue
</details>
<details><summary>Stream Class</summary>
-
src stream.py
-
The threefive.Stream class parses SCTE35 from Mpegts.
-
Supports:
- File and Http(s) and Udp and Multicast protocols.
- Multiple Programs.
- Multi-Packet PAT, PMT, and SCTE35 tables.
-
threefive tries to include pid, program, anf pts of the SCTE-35 packet.
class Stream(builtins.object)
| Stream(tsdata, show_null=True)
|
| Stream class for parsing MPEG-TS data.
| __init__(self, tsdata, show_null=True)
|
| tsdata is a file or http, https,
| udp or multicast url.
|
| set show_null=False to exclude Splice Nulls
Stream.decode(func=show_cue)
| decode(self, func=show_cue)
| Stream.decode reads self.tsdata to find SCTE35 packets.
| func can be set to a custom function that accepts
| a threefive.Cue instance as it's only argument.
Stream.decode Example
import sys
from threefive import Stream
>>>> Stream('plp0.ts').decode()
-
Pass in custom function
-
func should match the interface
func(cue)
Stream.decode with custom function Example
import sys
import threefive
def display(cue):
print(f'\033[92m{cue.packet_data}\033[00m')
print(f'{cue.command.name}')
def do():
sp = threefive.Stream(tsdata)
sp.decode(func = display)
if __name__ == '__main__':
do()
Stream.decode_next()
| decode_next(self)
| Stream.decode_next returns the next
| SCTE35 cue as a threefive.Cue instance.
Stream.decode_next Example
"""
Stream.decode_next example.
decode_next returns the Cue every time a Cue is found.
This uses a while loop to pull the Cues from a mpegts stream.
When a Cue is found, if it's a Time Signal,
cue.command.command_type=6, print Cue.command.
You can filter on any var in the SCTE-35 Cue.
"""
im
