import pygame import qrcode import cv2 import json import base64 import time import random import string from io import BytesIO def make_qr(data, size): qr = qrcode.QRCode(box_size=6, border=2) qr.add_data(data) qr.make(fit=True) img = qr.make_image(fill="black", back_color="white").convert("RGB") img = img.resize((size, size)) buf = BytesIO() img.save(buf, format="PNG") buf.seek(0) return pygame.image.load(buf) def chunk_string(s, n): return [s[i:i+n] for i in range(0, len(s), n)] pygame.init() screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN) w, h = screen.get_size() cap = cv2.VideoCapture(0) detector = cv2.QRCodeDetector() qr_size = h // 2 clock = pygame.time.Clock() # STREAM STATE (geen chat, geen protocol) counter = 0 rx_buffer = "" tx_qr = None last_frame = 0 running = True while running: for e in pygame.event.get(): if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: running = False # ===== TRANSMIT STREAM ===== now = time.time() if now - last_frame > 0.5: # stream rate last_frame = now payload = { "d": str(counter) } counter += 1 tx_qr = make_qr(json.dumps(payload), qr_size) # ===== RECEIVE STREAM ===== ret, frame = cap.read() if ret: data, _, _ = detector.detectAndDecode(frame) if data: try: obj = json.loads(data) if "d" in obj: rx_buffer = (rx_buffer + obj["d"])[-200:] except: pass # ===== RENDER ===== screen.fill((0,0,0)) if tx_qr: screen.blit(tx_qr, (w//4 - qr_size//2, h//4)) if ret: cam = cv2.cvtColor(cv2.flip(frame,1), cv2.COLOR_BGR2RGB) cam = pygame.surfarray.make_surface(cam.swapaxes(0,1)) screen.blit(pygame.transform.scale(cam, (w//2, h)), (w//2,0)) font = pygame.font.SysFont(None, 40) screen.blit(font.render("STREAM OUT: " + str(counter), True, (255,255,0)), (20,20)) screen.blit(font.render("STREAM IN BUFFER: " + rx_buffer[-30:], True, (0,255,0)), (20,80)) pygame.display.flip() clock.tick(30) cap.release() pygame.quit()