78 lines
2.7 KiB
Python

from os import name
import threading
import av, av.container
import cv2
from ipkvm import profile
from ipkvm.util import video
from ipkvm import logger
import time
class FrameBuffer(threading.Thread):
def __init__(self):
super().__init__()
self.buffer_lock = threading.Lock()
self.cur_frame = None
self.new_frame = threading.Event()
self.start()
def run(self):
self.capture_feed()
def capture_feed(self):
device = self.acquire_device()
while True:
# try:
# for frame in device.decode(video=0):
# frame = frame.to_ndarray(format='rgb24')
# ret, self.cur_frame = cv2.imencode('.jpg', frame)
# print(ret)
# cv2.imwrite("test.jpg", frame)
# except av.BlockingIOError:
# pass
success, frame = device.read()
if not success:
break
else:
ret, buffer = cv2.imencode('.jpg', frame)
self.cur_frame = buffer.tobytes()
self.new_frame.set()
# def acquire_device(self):
# device_list = video.create_device_list()
# device_path = ""
# for device in device_list:
# if device.friendly_name == profile["video_device"]["friendly_name"]:
# device_path = device.path
#
# if name == "posix":
# return av.open(device_path, format="video4linux2", container_options={
# "framerate": profile["video_device"]["fps"],
# "video_size": profile["video_device"]["resolution"],
# "input_format": profile["video_device"]["format"]
# })
#
# else:
# raise RuntimeError("We're on something other than Linux, and that's not yet supported!")
def acquire_device(self):
device_list = video.create_device_list()
device_path = ""
for device in device_list:
if device.friendly_name == profile["video_device"]["friendly_name"]:
device_path = device.path
if name == "posix":
device = cv2.VideoCapture(device_path) # Use default webcam (index 0)
else:
raise RuntimeError("We're on something other than Linux, and that's not yet supported!")
device.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"YUYV"))
device.set(cv2.CAP_PROP_FRAME_WIDTH, int(profile["video_device"]["resolution"].split('x')[0]))
device.set(cv2.CAP_PROP_FRAME_HEIGHT, int(profile["video_device"]["resolution"].split('x')[1]))
device.set(cv2.CAP_PROP_FPS, float(profile["video_device"]["fps"]))
return device