A Fast SCTE 35 Decoder for Mpeg-TS Video, and Base64 or Hex Encoded Messages.
Project description
threefive
SCTE35 Decoder
-
- Using threefive with HLS Manifests
- Splice Insert
- Splice Insert Too
- Splice Null
- Time Signal Blackout Override Program End
- Time Signal Placement Opportunity Start
- Time Signal Placement Opportunity End
- Time Signal Program Overlap
- Time Signal Program Start End
- Parsing SCTE-35 from a Multicast Source
- StreamProxy Example
- Upids with Custom Output
Changes
- Splice class has been renamed Cue. See Cue
- Stream, StreamPlus, and StreamProxy classes have been consolidated. See Stream
Splice Commands
- source command.py
- Splice Null
- Splice Schedule
- Splice Insert
- Time Signal
- Bandwidth Reservation
Splice Descriptors
- source descriptor.py
- DTMF Descriptor
- Segmentation Descriptor (all segmentation Upids)
- Segmentation Types and Messages
- Time Descriptor
- Audio Descriptor
Fast Start Directions
Dependencies
- Python 3 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
Processing threefive-2.1.39-py3.8.egg
Copying threefive-2.1.39-py3.8.egg to /usr/local/lib/python3.8/dist-packages
Adding threefive 2.1.39 to easy-install.pth file
Installed /usr/local/lib/python3.8/dist-packages/threefive-2.1.39-py3.8.egg
Processing dependencies for threefive==2.1.39
Searching for bitn==0.0.27
Best match: bitn 0.0.27
Processing bitn-0.0.27-py3.8.egg
bitn 0.0.27 is already the active version in easy-install.pth
Using /usr/local/lib/python3.8/dist-packages/bitn-0.0.27-py3.8.egg
Finished processing dependencies for threefive==2.1.39
git pypy3 install
git clone https://github.com/futzu/SCTE35-threefive.git
cd SCTE-threefive
# you need root to install for the system
make pypy3
pip3
pip3 install threefive
pip3 and pypy3
- If you don't have pip installed, try this.
pypy3 -mensurepip install pip
- install threefive
a@fuhq:~/SCTE35-threefive$ pypy3 -mpip install threefive
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')
Binary
threefive.decode('/mnt/build/file.bin')
Base64 Encoded Strings
mesg='/DBUAAAAAAAA///wBQb+AAAAAAA+AjxDVUVJAAAACn+/Dy11cm46dXVpZDphYTg1YmJiNi01YzQzLTRiNmEtYmViYi1lZTNiMTNlYjc5OTkRAAB2c6LA'
threefive.decode(mesg)
Hex Encoded Strings
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"
scte35 = Cue(b64)
JSON Pretty Print SCTE 35 Message
scte35.show()
Return SCTE 35 Message
scte35.get()
JSON Pretty Print Splice Info Section
scte35.show_info_section()
Return Splice Info Section
scte35.get_info_section()
JSON Pretty Print Splice Command
scte35.show_command()
Return Splice Command
scte35.get_command()
JSON Pretty Print Splice Descriptors
scte35.show_descriptors()
Return Splice Descriptors
scte35.get_descriptors()
Stream Class
-
source stream.py
-
The threefive.Stream class parses SCTE35 messages from a file or stream.
threefive.Stream(tsdata, show_null = False)
- tsdata is an open file handle or sys.stdin.buffer to read 'piped' in data.
- show_null if set to True, enables showing SCTE 35 null commands.
Stream.decode()
- Calls Cue.show() when a SCTE-35 message is found
Parse a Local File with a Stream Instance
import sys
from threefive import Stream
'''
if __name__ =='__main__':
with open(sys.argv[1],'rb') as tsdata:
Stream(tsdata).decode()
Pipe a Video to Stream
curl -s https://futzu.com/xaa.ts -o - \
| python3 -c 'import sys;import threefive; threefive.Stream(sys.stdin.buffer).decode()'
Stream.decode_until_found()
- Use the Stream.decode_until_found() method instead of Stream.decode().
- Returns Cue instances when SCTE-35 packets are found.
- Allows for customized SCTE-35 message handling.
Customized SCTE-35 Message Handling
import sys
from threefive import Stream
def do():
with open(sys.argv[1],'rb') as tsdata:
while True:
cuep = Stream(tsdata).decode_until_found()
if not cuep :
sys.exit()
else:
# Customized output
print('pid :',cuep.header.pid, 'command:',
cuep.command.name,'@',cuep.command.pts_time,
'Out of Network:',
cuep.command.out_of_network_indicator)
if __name__ == '__main__':
do()
- Output:
pid : 1055 command: Splice Insert @ 21951.133267 Out of Network: True
pid : 1015 command: Splice Insert @ 22516.907656 Out of Network: True
pid : 1055 command: Splice Insert @ 22026.133267 Out of Network: False
pid : 1045 command: Splice Insert @ 22864.350067 Out of Network: True
pid : 1015 command: Splice Insert @ 22696.907656 Out of Network: False
pid : 1045 command: Splice Insert @ 22960.350067 Out of Network: False
pid : 1015 command: Splice Insert @ 23516.827656 Out of Network: True
pid : 1015 command: Splice Insert @ 23696.827656 Out of Network: False
Stream.proxy(func=None)
- Writes all packets to sys.stdout.
- Writes scte35 data to sys.stderr.
- The optional func arg allows a function to be used for custom handling of the SCTE-35 cue instance.
- If func is not set, threefive.Cue.show() is called.
import threefive
# Name this proxy.py
with open('vid.ts','rb') as tsdata:
sp = threefive.Stream(tsdata)
sp.proxy()
- Pipe to mplayer
python3 proxy.py | mplayer -
- the function should match the interface
func(cuep)
- cuep is an instance of threefive.Cue
Stream.Proxy with custom function
import sys
import threefive
import json
def display(cuep):
print(f'\033[92m{json.dumps(vars(cuep.header))}\033[00m', file=sys.stderr,end='\r')
print(f'\033[92m{json.dumps(cuep.get_command(),indent=2)}\033[00m', file=sys.stderr)
def do():
with open(sys.argv[1],'rb') as tsdata:
sp = threefive.Stream(tsdata)
cue = sp.proxy(func = display)
if not cue :
sys.exit()
if __name__ == '__main__':
do()
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.1.77.tar.gz.
File metadata
- Download URL: threefive-2.1.77.tar.gz
- Upload date:
- Size: 15.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.4.2 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.8.0 tqdm/4.48.1 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71625809dcdef80359b3a0ff2e05156d09bb7a417d0facdb2f1859266a5bdeb5
|
|
| MD5 |
ed540cc05a6a902b94ea17b3dcd20312
|
|
| BLAKE2b-256 |
1570483f4add39a4327d0746cdcd833e510648b74949d914aee1a8a259e244bb
|
File details
Details for the file threefive-2.1.77-py3-none-any.whl.
File metadata
- Download URL: threefive-2.1.77-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.4.2 requests/2.23.0 setuptools/46.1.3 requests-toolbelt/0.8.0 tqdm/4.48.1 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e11b1cffd3cc7ebad7b70adb976c4a005e16ce60d6fba0021d34f9a8d998b81
|
|
| MD5 |
527d1b0753d151d9a34035828d5e9d01
|
|
| BLAKE2b-256 |
2692d3ab8afdf2c320b35a23b500f8a0fb0ee209605f9db2ddc250c43a4672d7
|