threefive is The Leading SCTE-35 Parsing Lib for Mpeg-TS Video Streams, and Base64 or Hex Encoded Messages. threefive is Used in Production By Three of The Largest Broadcast Networks in The World..
Project description
:rocket: threefive
threefive is a SCTE35 Parser library in Python3.
-
All 2019 SCTE-35 Splice Commands and Splice Descriptors are fully Supported.
-
threefive is simple and easy to use.
-
SCTE-35 can be parsed from strings or video with one function threefive.decode().
-
threefive automatically identifies and parses Base64, Hexidecimal, or Binary .
-
Multiple programs and multiple SCTE-35 streams are well supported.
Why so many releases?
- I generate a lot releases, however the interface to classes and functions rarely changes.
- Releases are made for incremental improvements. This keeps pip and the git repo in sync.
- Having several relases makes it much easier to resolve issues.
Issues and how to resolve them.
- Open an issue if you can meet these terms
- We're cool, you be cool too.
- We will only resolve threefive specific issues.
- We require the video to resolve video issues.
- We require your code to resolve code issues.
- We resolve issues very quickly.
Heads Up! Changes as of 10/23/2020
- threefive runs three times faster with pypy3
- Requires Python 3.6 +
- Latest Pip Version
- Fast Start
- Easy threefive
- Advanced threefive__
- Examples
- HLS
- Multicast
- Splice Insert
- Splice_Null
- Time Signal
- UPID
- Stream.decode_proxy() Example
Changes
- As of version 2.1.95, threefive.version returns a string for the current version.
>>> import threefive
>>> threefive.version
'2.1.95'
- Stream.decode, Stream.decode_pid, and Stream.decode_proxy now all take an optional function as an arg. See Stream
- Stream.decode_pid() is now Stream.decode_program()
Fast _Start
Dependencies
- Python 3.6+ or pypy3
- bitn
Install
- git
git clone https://github.com/futzu/SCTE35-threefive.git
cd SCTE-threefive
# you need root to install for the system
make install
# for pypy3
make pypy3
- pip
pip3 install threefive
# for pypy3
pypy3 -mpip install threefive
#If you don't have pip installed, try this.
pypy3 -mensurepip install pip
Easy threefive
The decode Function
- source decode.py
- threefive.decode is an all purpose function to decode SCTE 35 messages from a file or string.
import threefive
- MpegTS
threefive.decode('/path/to/mpegwithscte35.ts')
- Base64
mesg='/DBUAAAAAAAA///wBQb+AAAAAAA+AjxDVUVJAAAACn+/Dy11cm46dXVpZDphYTg1YmJiNi01YzQzLTRiNmEtYmViYi1lZTNiMTNlYjc5OTkRAAB2c6LA'
threefive.decode(mesg)
- Hex
hexed='0xFC302F000000000000FFFFF014054800008F7FEFFE7369C02EFE0052CCF500000000000A0008435545490000013562DBA30A'
threefive.decode(hexed)
Advanced threefive
Cue Class
- source cue.py
- The threefive.Cue class decodes a SCTE35 binary, base64, or hex encoded string.
- threefive.Cue provides several methods to access the parsed data.
from threefive import Cue
b64 = "/DBIAAAAAAAA///wBQb+ek2ItgAyAhdDVUVJSAAAGH+fCAgAAAAALMvDRBEAAAIXQ1VFSUgAABl/nwgIAAAAACyk26AQAACZcuND"
cue = Cue(B64)
Return cue as dict
cue.get()
# Splice Info Section
cue.get_info_section()
# Splice Command
cue.get_command()
# Splice Descriptors
cue.get_descriptors()
Return cue as JSON
jason = cue.get_json()
Print cue as JSON
cue.show()
Stream Class
threefive.Stream(tsdata, show_null = False)
-
source stream.py
-
The threefive.Stream class parses SCTE35 messages from a file or stream.
-
tsdata is an open file handle.
-
show_null if set to True, enables showing SCTE 35 null commands.
-
| Method | Description |
|---|---|
| Stream.show() | Prints all recognized Programs and streams by pid and type. |
| Stream.decode(func = show_cue) | Prints SCTE-35 cues for SCTE-35 packets. Accepts an optional function, func, as arg. |
| Stream.decode_program(the_program,func = show_cue) | Same as Stream.decode except only packets where program == the_program |
| Stream.decode_proxy(func = show_cue) | Same as Stream.decode except raw packets are written to stdout for piping to another program. |
Stream.show()
List programs and streams for a video.
# pypy3
>>>> from threefive import Stream, version
>>>> version
'2.2.09'
>>>> with open('video.ts','rb') as tsdata:
.... st = Stream(tsdata)
.... st.show()
....
Program: 1030 (pcr pid: 1031)
1031: [0x1b] Video
1032: [0x3] ISO/IEC 11172 Audio
1034: [0x6] ITU-T Rec. H.222.0 | ISO/IEC 13818-1 PES packets with private data
1035: [0x86] SCTE 35
Program: 1100 (pcr pid: 1101)
1101: [0x1b] Video
1102: [0x3] ISO/IEC 11172 Audio
1104: [0x6] ITU-T Rec. H.222.0 | ISO/IEC 13818-1 PES packets with private data
1105: [0x86] SCTE 35
Program: 1080 (pcr pid: 1081)
1081: [0x1b] Video
1082: [0x3] ISO/IEC 11172 Audio
1084: [0x6] ITU-T Rec. H.222.0 | ISO/IEC 13818-1 PES packets with private data
Stream.decode(func=show_cue)
import sys
from threefive import Stream
'''
if __name__ =='__main__':
with open(sys.argv[1],'rb') as tsdata:
sp = Stream(tsdata)
sp.decode()
-
Pass in custom function
-
func should match the interface
func(cue) -
example
import sys
import threefive
def display(cue):
print(f'\033[92m{cue.packet_data}\033[00m')
print(f'{cue.command.name}')
def do():
with open(sys.argv[1],'rb') as tsdata:
sp = threefive.Stream(tsdata)
sp.decode(func = display)
if __name__ == '__main__':
do()
Stream.decode_program(the_program, func = show_cue)
- Use Stream.decode_program() instead of Stream.decode() to decode SCTE-35 from packets where program == the_program
import threefive
with open('../35.ts','rb') as tsdata:
threefive.Stream(tsdata).decode_program(1)
Stream.decode_proxy(func = show_cue)
-
Writes all packets to sys.stdout.
-
Writes scte35 data to sys.stderr.
import threefive
with open('vid.ts','rb') as tsdata:
sp = threefive.Stream(tsdata)
sp.proxy_decode()
- Pipe to mplayer
python3 proxy.py | mplayer -
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file threefive-2.2.35.tar.gz.
File metadata
- Download URL: threefive-2.2.35.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.4.2 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.8.0 tqdm/4.51.0 CPython/3.8.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eec352d5311524193825f7a3411def923aa3bb3f41a49d462e1906717eb09a20
|
|
| MD5 |
422eb6552a85bc89ebcbfa73c280ef49
|
|
| BLAKE2b-256 |
49ef3d619940e674dcacb3e2ab1f2c9081e9889145e9863ba8e6f9cdd38c1184
|
File details
Details for the file threefive-2.2.35-py3-none-any.whl.
File metadata
- Download URL: threefive-2.2.35-py3-none-any.whl
- Upload date:
- Size: 20.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.4.2 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.8.0 tqdm/4.51.0 CPython/3.8.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8cdbfec55a156027c2d35514f795649ef249402f7434b4af722e4314ef708e34
|
|
| MD5 |
360a28e62eabdc6cdae992c0678b2fc4
|
|
| BLAKE2b-256 |
7bcba1a942c21f6b0e19720f68d55a8486a37325fa5106cbe0deb2df33feceaf
|