2022-10-07 20:31:31 +02:00
|
|
|
import ffmpeg
|
2022-10-08 17:01:38 +02:00
|
|
|
from procmanager import ProcManager
|
2022-10-07 20:31:31 +02:00
|
|
|
|
|
|
|
class Streamer:
|
|
|
|
|
2022-10-08 17:25:20 +02:00
|
|
|
def __init__(self, screendef: str, screensize: str, videocodec: str, audioindex: int, protocol: str, target: str) -> None:
|
2022-10-07 20:31:31 +02:00
|
|
|
self.screendef = screendef
|
|
|
|
self.screensize = screensize
|
2022-10-08 17:25:20 +02:00
|
|
|
self.videocodec = videocodec
|
2022-10-07 22:54:27 +02:00
|
|
|
self.audioindex = audioindex
|
2022-10-07 21:21:00 +02:00
|
|
|
self.protocol = protocol # should be 'tcp' or 'udp'
|
2022-10-07 20:31:31 +02:00
|
|
|
self.target = target
|
2022-10-08 17:01:38 +02:00
|
|
|
self.process_manager = ProcManager()
|
2022-10-07 21:34:14 +02:00
|
|
|
|
|
|
|
def __del__(self) -> None:
|
|
|
|
self.stop()
|
2022-10-07 20:31:31 +02:00
|
|
|
|
|
|
|
def start(self):
|
2022-10-07 22:54:27 +02:00
|
|
|
streams = []
|
2022-10-08 17:01:38 +02:00
|
|
|
self.input = ffmpeg.input(self.screendef, f='x11grab', r=60, s=self.screensize, hide_banner='-y', loglevel='error')
|
2022-10-07 22:54:27 +02:00
|
|
|
streams.append(self.input)
|
|
|
|
|
|
|
|
if self.audioindex != -1:
|
|
|
|
self.audio = ffmpeg.input(str(self.audioindex), f='pulse')
|
|
|
|
streams.append(self.audio)
|
|
|
|
|
2022-10-08 17:25:20 +02:00
|
|
|
self.output = ffmpeg.output(*streams, self.protocol + '://' + self.target, f='mpegts', vcodec=self.videocodec, tune='zerolatency')
|
2022-10-08 17:01:38 +02:00
|
|
|
proc = ffmpeg.run_async(self.output, pipe_stderr=True)
|
|
|
|
self.process_manager.start(proc)
|
2022-10-07 20:31:31 +02:00
|
|
|
|
2022-10-07 21:34:14 +02:00
|
|
|
def stop(self):
|
2022-10-08 17:01:38 +02:00
|
|
|
self.process_manager.stop()
|
2022-10-07 21:34:14 +02:00
|
|
|
|
|
|
|
|