|
import threading |
|
import time |
|
import pyvirtualcam |
|
|
|
|
|
class StreamWriter(): |
|
FPS = 30 |
|
VCam = None |
|
Active = False |
|
THREAD_LOCK_STREAM = threading.Lock() |
|
time_last_process = None |
|
timespan_min = 0.0 |
|
|
|
def __enter__(self): |
|
return self |
|
|
|
def __exit__(self, exc_type, exc_value, traceback): |
|
self.Close() |
|
|
|
def __init__(self, size, fps): |
|
self.time_last_process = time.perf_counter() |
|
self.FPS = fps |
|
self.timespan_min = 1.0 / fps |
|
print('Detecting virtual cam devices') |
|
self.VCam = pyvirtualcam.Camera(width=size[0], height=size[1], fps=fps, fmt=pyvirtualcam.PixelFormat.BGR, print_fps=False) |
|
if self.VCam is None: |
|
print("No virtual camera found!") |
|
return |
|
print(f'Using virtual camera: {self.VCam.device}') |
|
print(f'Using {self.VCam.native_fmt}') |
|
self.Active = True |
|
|
|
|
|
def LimitFrames(self): |
|
while True: |
|
current_time = time.perf_counter() |
|
time_passed = current_time - self.time_last_process |
|
if time_passed >= self.timespan_min: |
|
break |
|
|
|
|
|
|
|
def WriteToStream(self, frame): |
|
if self.VCam is None: |
|
return |
|
with self.THREAD_LOCK_STREAM: |
|
self.LimitFrames() |
|
self.VCam.send(frame) |
|
self.time_last_process = time.perf_counter() |
|
|
|
|
|
def Close(self): |
|
self.Active = False |
|
if self.VCam is None: |
|
self.VCam.close() |
|
self.VCam = None |
|
|
|
|
|
|
|
|
|
|