Skip to main content

Secure Reliable Transport in Python

Project description

Heads up: s/SRTKabuki/SRTfu/g

SRTKabuki has been renamed SRTfu

SRTfu

Pythonic Secure Reliable Transport

Call libsrt C functions from python.


NEWS

  • 12/01/2025 : Release v0.0.5 aka 'everything is working?'
  • 11/29/2025 : Renaming project to SRTfu, SRTKabuki does not work well with search engines.
  • 11/29/2025 : Released v0.0.3
  • 11/28/2025 : Fixed datagramer, tested for 8 hours straight parsing SCTE35, 513 cues out of 513 cues parssed correctly.
  • 11/25/2025 : Release v0.0.1 is now available via pip (..and the crowd goes wild!)
  • 11/25/2025 : added datagramer, pythonic fast datagam generator live srt stream parsing.
  • 11/20/2025 : SRTfu is working.
  • 11/19/2025 : cyclomatic complexity A (1.2790697674418605)
  • 11/18/2025 : rewrote examples sendfile.cpp and recvfile.cpp with SRTfu, both are working.
  • 11/17/2025 : Of course SRTfu runs on OpenBSD
  • 11/16/2025 : libsrt now builds correctly and builds the srt apps correctly with clang++ on OpenBSD
  • 11/14/2025 : added methods SRTfu.livecc() and SRTfu.filecc() to set congestion control algorithm.
  • 11/12/2025 : Parsing SCTE-35 from SRT is now working.
  • 11/08/2025 : Boom goes the dynamite, reading srt output from srt-live-transmit now works.
  • 11/05/2025 : It's porting pretty smooth, cyclomatic complexity so far is 1.09, that is sweet..
  • 11/04/2025 : started on epoll stuff. it's really started coming together, a couple more weeks to a release I think.
  • 11/01/2025 : rewrote examples test-c-server.c and test-c-client.c, using SRTfu and they both work.
  • 10/30/2025 : Today I got basic downloading files over a network using SRT working,cleaning up code for a new commit.
  • 10/29/2025 : I've been stuck on setting SRTO_TRANSTYPE and SRT_SOCKOPT correctly ,but I figured it out today.Super jazzed

My goal here is to be able to use the SRT protocol in python

and to do so with just a few lines of code.


Docs


Install

Install libsrt
  • if you have libsrt already installed, you can skip this step

  • Check if your os has a libsrt package and install it. SRTfu is built with libsrt v1.5.5.

  • or run the the install-libsrt.sh script in this repo.

Install SRTfu

python3 -mpip install srtfu --break-system-packages

Usage

  • srtfu is meant be easy to use.
  • use fetch to retrieve files over srt. Use datagramer to parse live streams.
  • All other functionality is built into the srtfu.SRTfu class

fetch

If you just want to retrieve files over SRT, use the fetch function.

 fetch(srt_url , remote_file, local_file, flags=None)
  • Complete working example
from srtfu import fetch

srt_url = srt://206.170.125.43:9000
remote_file = /home/a/video.ts
local_file = video.ts

fetch(srt_url , remote_file, local_file)

datagramer

Use the datagramer function to parse an srt stream.

datagramer(srt_url,flags=None)
  • datagramer takes an srt_url as an arg and returns a generator of raw datagram payloads.

  • Complete working example

import sys
from srtfu import datagramer

srt_url = srt://10.0.0.1:9000

for datagram in datagramer(srt_url):
    sys.stdout.buffer.write(datagram)

smoketest

The smoketest from the libsrt docs.

  • create the file livekabuki.py
#!/usr/bin/env python3

import sys
from  srtfu import datagramer

srt_url = sys.argv[1]
for datagram in datagramer(srt_url):
    sys.stdout.buffer.write(datagram)
  • In a terminal window run
ffmpeg -f lavfi -re -i smptebars=duration=300:size=1280x720:rate=30\
-f lavfi -re -i sine=frequency=1000:duration=60:sample_rate=44100\
-pix_fmt yuv420p -c:v libx264 -b:v 1000k -g 30 -keyint_min 120\
-profile:v baseline -preset veryfast -f mpegts "udp://127.0.0.1:1234?pkt_size=1316"
  • In another terminal run
srt-live-transmit udp://127.0.0.1:1234 srt://:4201 
  • In yet another window run
python3 livekabuki.py srt://127.0.0.1:4201 | ffplay -

SCTE35

parsing SCTE-35 from an srt stream with threefive

  • install threefive

    python3 -mpip install threefive --break-system-packages
    
  • datagramer is great when you need to add srt support to a parser like threefive.

  • threefive doesn't directly support srt, so datagramer reads the srt stream and passes data to threefive.

  • Run srtscte35.py in examples directory.


low level

  • Most of libsrt is available in SRTfu, the ctypes conversions are handled for you.
  • If you've used sockets, this will all seem very similar.
  • One note, the socket is an optional arg in methods, it only needs to be used when a server accepts a socket connection.
  • init SRTfu instance, just provide a srt_url
  • a socket is created for you, but not connected.
  • the srt_url sets host and port to bind for servers (0.0.0.0 works), and host and port to connect for clients
from srtfu import SRTfu

srtf = SRTfu(srt_url)
  • next you can set sock flags
    from srtfu import SRTO_TRANSTYPE,SRT_LIVE,SRTO_RCVSYN,SRTO_RCVBUF

    srtf.setsockflag(SRTO_TRANSTYPE,SRT_LIVE)
    srtf.setsockflag(SRTO_RCVSYN,1)
    srtf.setsockflag(SRTO_RCVBUF,32768)
  • for clients call connect
srtf.connect()
  • for servers call bind and listen
  srtf.bind()
  srtf.listen()
  • to accept a connection on a server
    fhandle = srtf.accept() 
  • to receive from a client
  • Note the socket is always the last arg
 smallbuff = srtf.mkbuff(1456)
 srtf.recv(smallbuff, fhandle)
  • If you need a buffer to receive into
  smallbuff = srtf.mkbuff(1456)
  • if you need to send data in a buffer
message = 'message can be strings, bytes, or ints'
new_message= srtf.mkmsg(message)
  • to receive from a client
  • Note the socket is always the last arg
 smallbuff = srtf.mkbuff(1456)
 srtf.recv(smallbuff, fhandle)

SRTfu

Help on class SRTfu in module srtfu.srtfu:

class SRTfu(builtins.object)
 |  SRTfu(srturl, flags=None)
 |  
 |  SRTfu Pythonic Secure Reliable Transport
 |  
 |  Methods defined here:
 |  
 |  __init__(self, srturl, flags=None)
 |  
 |  accept(self)
 |      accept srt_accept
 |  
 |  bind(self)
 |      bind  srt_bind
 |  
 |  chk_sock(self, sock=None)
 |      chk_sock if we don't have a sock, use self.sock
 |  
 |  cleanup(self)
 |      cleanup srt_cleanup
 |  
 |  close(self, sock=None)
 |      close srt_close
 |  
 |  confile(self)
 |      confile set congestion control to file
 |  
 |  congestion_control(self, algo)
 |      congestion_control set the congestion control
 |      algorithm. can also be set with livecc() and filecc()
 |      methods.
 |  
 |  conlive(self)
 |      conlive set congestion control to live
 |  
 |  connect(self)
 |      connect srt_connect
 |  
 |  create_socket(self)
 |      create_socket srt_create_socket
 |  
 |  epoll_add_usock(self, events)
 |      epoll_add_usock srt_epoll_add_usock
 |  
 |  epoll_create(self)
 |      epoll_create srt_epoll_create
 |  
 |  epoll_wait(self, readfds, writefds, ms_timeout, lrfds, lwfds)
 |      epoll_wait srt_epoll_wait
 |  
 |  fetch(self, remote_file, local_file)
 |      fetch fetch remote_file fron host on port
 |      and save it as local_file
 |  
 |  getlasterror(self)
 |      getlasterror srt_getlasterror_str
 |  
 |  getsockstate(self, sock=None)
 |      getsockstate srt_getsockstate
 |  
 |  ipv4int(self, addr)
 |      take a ipv4 string addr and make it an int
 |  
 |  listen(self)
 |      listen srt_listen
 |  
 |  load_libc(self)
 |      load_libc load getaddrinfo and freeaddrinfo from libc.so
 |  
 |  load_srt(self)
 |      load_srt load everything from libsrt.so
 |  
 |  mk_sockaddr_ptr(self, addr, port)
 |      mk_sockaddr_sa make a c compatible (struct sockaddr*)&sa
 |  
 |  mkbuff(self, buffsize, data=b'')
 |      mkbuff make a c  buffer
 |      to read into when receiving data.
 |  
 |  mkmsg(self, msg)
 |      mkmsg convert python byte string
 |      to a C string buffer when sending data
 |  
 |  new_val(self, val)
 |      new_val convert val into a ctypes type
 |  
 |  recv(self, buffer, sock=None)
 |      recv srt_recv
 |  
 |  recvfile(self, local_file, sock=None)
 |      recvfile srt_recvfile
 |  
 |  recvmsg(self, buffer, sock=None)
 |      recvmsg srt_recvmsg
 |   
 |  remote_file_size(self)
 |  
 |  request_file(self, remote_file)
 |      request_file request a file from a server
 |  
 |  send(self, msg, sock=None)
 |      send srt_send
 |  
 |  sendfile(self, filename, sock=None)
 |      sendfile srt_sendfile
 |  
 |  sendmsg2(self, msg, sock=None)
 |      sendmsg2 srt_sendmsg2
 |  
 |  setflags(self, flags)
 |      setflags set flags on an SRTfu instance
 |      
 |      flags  a dict of socket flags you want to have set.
 |                 ex. {SRTO_TRANSTYPE: SRT_LIVE,
 |                         SRTO_RCVSYN: 1, }
 |  
 |  setsockflag(self, flag, val)
 |      setsockflag  srt_setsockflag
 |  
 |  startup(self)
 |      startup  srt_startup()
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  split_url(url)
 |      split_url, split srt url into addr,port, path and args
 |  ----------------------------------------------------------------------

Socket Flags

  • Note: these are the flag number for the socket, not the value of the flag.
SRTO_MSS = 0  # the Maximum Transfer Unit
SRTO_SNDSYN = 1  # if sending is blocking
SRTO_RCVSYN = 2  # if receiving is blocking
SRTO_ISN = 3  # Initial Sequence Number
SRTO_FC = 4  # Flight flag size (window size)
SRTO_SNDBUF = 5  # maximum buffer in sending queue
SRTO_RCVBUF = 6  # UDT receiving buffer size
SRTO_LINGER = 7  # waiting for unsent data when closing
SRTO_UDP_SNDBUF = 8  # UDP sending buffer size
SRTO_UDP_RCVBUF = 9  # UDP receiving buffer size
# (some space left)
SRTO_RENDEZVOUS = 12  # rendezvous connection mode
SRTO_SNDTIMEO = 13  # send() timeout
SRTO_RCVTIMEO = 14  # recv() timeout
SRTO_REUSEADDR = 15  # reuse an existing port or create a new one
SRTO_MAXBW = 16  # maximum bandwidth (bytes per second) that the connection can use
SRTO_STATE = 17  # current socket state see SRT_SOCKSTATUS read only
SRTO_EVENT = 18  # current available events associated with the socket
SRTO_SNDDATA = 19  # size of data in the sending buffer
SRTO_RCVDATA = 20  # size of data available for recv
SRTO_SENDER = 21  # Sender mode
SRTO_TSBPDMODE = 22  # Enable/Disable TsbPd. Enable -> Tx set origin timestamp Rx deliver packet at origin time + delay
SRTO_LATENCY = 23  # NOT RECOMMENDED. SET: to both SRTO_RCVLATENCY and SRTO_PEERLATENCY. GET: same as SRTO_RCVLATENCY.
SRTO_INPUTBW = 24  # Estimated input stream rate.
SRTO_OHEADBW = 25  # MaxBW ceiling based on % over input stream rate. Applies when UDT_MAXBW=0 (auto).
SRTO_PASSPHRASE = 26  # Crypto PBKDF2 Passphrase (must be 10..79 characters or empty to disable encryption)
SRTO_PBKEYLEN = 27  # Crypto key len in bytes {162432} Default: 16 (AES-128)
SRTO_KMSTATE = 28  # Key Material exchange status (UDT_SRTKmState)
SRTO_IPTTL = 29  # IP Time To Live (passthru for system sockopt IPPROTO_IP/IP_TTL)
SRTO_IPTOS = 30  # IP Type of Service (passthru for system sockopt IPPROTO_IP/IP_TOS)
SRTO_TLPKTDROP = 31  # Enable receiver pkt drop
SRTO_SNDDROPDELAY = 32  # Extra delay towards latency for sender TLPKTDROP decision (-1 to off)
SRTO_NAKREPORT = 33  # Enable receiver to send periodic NAK reports
SRTO_VERSION = 34  # Local SRT Version
SRTO_PEERVERSION = 35  # Peer SRT Version (from SRT Handshake)
SRTO_CONNTIMEO = 36  # Connect timeout in msec. Caller default: 3000 rendezvous (x 10)
SRTO_DRIFTTRACER = 37  # Enable or disable drift tracer
SRTO_MININPUTBW = 38  # Minimum estimate of input stream rate.
# (some space left)
SRTO_SNDKMSTATE = 40  # (GET) the current state of the encryption at the peer side
SRTO_RCVKMSTATE = 41  # (GET) the current state of the encryption at the agent side
SRTO_LOSSMAXTTL = 42  # Maximum possible packet reorder tolerance (number of packets to receive after loss to send lossreport)
SRTO_RCVLATENCY = 43  # TsbPd receiver delay (mSec) to absorb burst of missed packet retransmission
SRTO_PEERLATENCY = 44  # Minimum value of the TsbPd receiver delay (mSec) for the opposite side (peer)
SRTO_MINVERSION = 45  # Minimum SRT version needed for the peer (peers with less version will get connection reject)
SRTO_STREAMID = 46  # A string set to a socket and passed to the listener's accepted socket
SRTO_CONGESTION = 47  # Congestion controller type selection
SRTO_MESSAGEAPI = 48  # In File mode use message API (portions of data with boundaries)
SRTO_PAYLOADSIZE = 49  # Maximum payload size sent in one UDP packet (0 if unlimited)
SRTO_TRANSTYPE = 50  # Transmission type (set of options required for given transmission type)
SRTO_KMREFRESHRATE = 51  # After sending how many packets the encryption key should be flipped to the new key
SRTO_KMPREANNOUNCE = 52  # How many packets before key flip the new key is annnounced and after key flip the old one decommissioned
SRTO_ENFORCEDENCRYPTION = 53  # Connection to be rejected or quickly broken when one side encryption set or bad password
SRTO_IPV6ONLY = 54  # IPV6_V6ONLY mode
SRTO_PEERIDLETIMEO = 55  # Peer-idle timeout (max time of silence heard from peer) in [ms]
SRTO_BINDTODEVICE = 56  # Forward the SOL_SOCKET/SO_BINDTODEVICE option on socket (pass packets only from that device)
SRTO_GROUPCONNECT = 57  # Set on a listener to allow group connection (ENABLE_BONDING)
SRTO_GROUPMINSTABLETIMEO = 58  # Minimum Link Stability timeout (backup mode) in milliseconds (ENABLE_BONDING)
SRTO_GROUPTYPE = 59  # Group type to which an accepted socket is about to be added available in the handshake (ENABLE_BONDING)
SRTO_PACKETFILTER = 60  # Add and configure a packet filter
SRTO_RETRANSMITALGO = 61  # An option to select packet retransmission algorithm
SRTO_CRYPTOMODE = 62  # Encryption cipher mode (AES-CTR AES-GCM ...).
SRTO_MAXREXMITBW = 63  # Maximum bandwidth limit for retransmision (Bytes/s)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

srtkabuki-0.0.5.tar.gz (12.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

srtkabuki-0.0.5-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file srtkabuki-0.0.5.tar.gz.

File metadata

  • Download URL: srtkabuki-0.0.5.tar.gz
  • Upload date:
  • Size: 12.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for srtkabuki-0.0.5.tar.gz
Algorithm Hash digest
SHA256 3ec2e7fa20708945de149fb38511284923591f3621a45048f413bb03eb32adf1
MD5 dafbc97377547b25c8c609c0987ae3ed
BLAKE2b-256 c455e0a069214a772b228f5b9b69ece21613159a6ec8a40c3e82170b911bdc7c

See more details on using hashes here.

File details

Details for the file srtkabuki-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: srtkabuki-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for srtkabuki-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 f0ca23011a82a858b81e6784a94829be1dccbe5eeb280035eb7baac8b3a31dc7
MD5 1ec7a713e0f0864255170d18b9daa390
BLAKE2b-256 33a91339a3d2f98eb25ca5542b279e0224b0050c974c852a4313cfc33efad1ad

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page