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
threefive-2.1.77.tar.gz
(15.5 kB
view hashes)
Built Distribution
threefive-2.1.77-py3-none-any.whl
(14.2 kB
view hashes)
Close
Hashes for threefive-2.1.77-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6e11b1cffd3cc7ebad7b70adb976c4a005e16ce60d6fba0021d34f9a8d998b81 |
|
MD5 | 527d1b0753d151d9a34035828d5e9d01 |
|
BLAKE2b-256 | 2692d3ab8afdf2c320b35a23b500f8a0fb0ee209605f9db2ddc250c43a4672d7 |