Siga
@invertexto
Home
Blog
API
Sobre
Contato
Notepad Online
Adicione uma senha
para proteger dados sensíveis ou o bloco de notas será excluído.
MOSTRAR LINKS CLICAVEIS aba de clipboards aba de prompts aba de atalhos aba de edicao de textos COPIAR E COLAR NO MESMO BOTAO mudar aparencia da gui faer tabela curso GAS @echo off cd "C:\Program Files\VideoLAN\VLC" :: Câmera 1: Sala (Canto Superior Esquerdo) start vlc.exe "rtsp://192.168.68.75:554/user=vinicius_password=oNvAsv1Q_channel=0_stream=0&onvif=0.sdp?real_stream" --width=640 --height=480 --video-x=50 --video-y=50 :: Câmera 2: Area (Canto Superior Direito) start vlc.exe "rtsp://192.168.68.83:554/user=admin_password=tlJwpbo6_channel=0_stream=0&onvif=0.sdp?real_stream" --width=640 --height=480 --video-x=720 --video-y=50 :: Câmera 3: Cozinha (Canto Inferior Esquerdo) start vlc.exe "rtsp://192.168.68.68:554/user=admin_password=tlJwpbo6_channel=0_stream=0&onvif=0.sdp?real_stream" --width=640 --height=480 --video-x=50 --video-y=560 :: Câmera 4: Corredor (Canto Inferior Direito + Rotação de 90 graus) start vlc.exe "rtsp://admin:@Jj3297033@192.168.68.81/cam/realmonitor?channel=1&subtype=0" --width=640 --height=480 --video-x=720 --video-y=560 --video-filter=transform --transform-type=90 exit import os import cv2 import threading import time from http.server import HTTPServer, BaseHTTPRequestHandler from socketserver import ThreadingMixIn # Força o transporte por TCP globalmente para evitar perda de pacotes os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp" CAMERAS = { "sala": "rtsp://192.168.68.75:554/user=vinicius_password=oNvAsv1Q_channel=0_stream=1&onvif=0.sdp?real_stream", "area": "rtsp://192.168.68.83:554/user=admin_password=tlJwpbo6_channel=0_stream=1&onvif=0.sdp?real_stream", "corredor": "rtsp://admin:@Jj3297033@192.168.68.81/cam/realmonitor?channel=1&subtype=1", "cozinha": "rtsp://192.168.68.68:554/user=admin_password=tlJwpbo6_channel=0_stream=1&onvif=0.sdp?real_stream", } class CameraStream: def __init__(self, name, url): self.name = name self.url = url self.cap = None self.frame = None self.ret = False self.running = True self.thread = threading.Thread(target=self.update, args=()) self.thread.daemon = True self.thread.start() def connect(self): cap = cv2.VideoCapture(self.url, cv2.CAP_FFMPEG) if cap.isOpened(): cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) return cap def update(self): self.cap = self.connect() while self.running: if self.cap.isOpened(): if self.cap.grab(): ret, frame = self.cap.retrieve() if ret: # Se for a Câmera 3, aplica a rotação de 90 graus para a direita if self.name == "corredor": frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) self.ret = ret self.frame = frame else: self.ret = False self.frame = None time.sleep(2) if self.cap is not None: self.cap.release() self.cap = self.connect() else: time.sleep(5) self.cap = self.connect() def get_frame_jpeg(self): if self.ret and self.frame is not None: # Redimensiona mantendo a proporção correta baseada no sentido do frame if self.name == "corredor": small_frame = cv2.resize(self.frame, (360, 640)) else: small_frame = cv2.resize(self.frame, (640, 360)) ret, jpeg = cv2.imencode('.jpg', small_frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70]) if ret: return jpeg.tobytes() return None class CamHandler(BaseHTTPRequestHandler): def log_message(self, format, *args): return def do_GET(self): if self.path == '/': self.send_response(200) self.send_header('Content-type', 'text/html; charset=utf-8') self.end_headers() # Novo layout HTML/CSS: Câmera 3 vertical na esquerda, as outras 3 empilhadas na direita html = """
Monitor de Câmeras RTSP
Câmera 3
Sala
Área
Câmera 4
""" self.wfile.write(html.encode('utf-8')) return for cam_nome in STREAMS.keys(): if self.path == f'/video/{cam_nome}': self.send_response(200) self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=frame') self.end_headers() try: while True: frame_bytes = STREAMS[cam_nome].get_frame_jpeg() if frame_bytes: self.wfile.write(b'--frame\r\n') self.wfile.write(b'Content-Type: image/jpeg\r\n') self.wfile.write(f'Content-Length: {len(frame_bytes)}\r\n\r\n'.encode()) self.wfile.write(frame_bytes) self.wfile.write(b'\r\n') time.sleep(0.04) except (ConnectionResetError, BrokenPipeError): return return self.send_error(404, 'File Not Found') class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): pass def run(server_class=ThreadedHTTPServer, handler_class=CamHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f"Servidor com rotação rodando em http://localhost:{port}") try: httpd.serve_forever() except KeyboardInterrupt: print("\nDesligando o servidor...") httpd.server_close() if __name__ == '__main__': STREAMS = {nome: CameraStream(nome, url) for nome, url in CAMERAS.items()} run() @echo off python "C:\ServidorCameras\monitor.py"
invertexto.com/viniciusmedina
Mudar URL
Adicionar Senha
Compartilhar
×
Mudar URL
×
Adicionar Senha
Senha
E-Mail
(utilizado para recuperação de senha)
×
Compartilhar