import signal
# import obspython as obs
import os
import subprocess
import http.server
import socketserver
import os
import threading
temp_dir = os.environ.get('TMPDIR', '/tmp') if os.name == 'posix' else os.environ.get('TMP', 'C:\\Windows\\Temp')
# region Settings
HTTP_SERVER_PORT = 8000
RTSP_SERVER_URI = "rtsp://127.0.0.1:554/live"
SNAPSHOT_PATH = os.path.join(temp_dir, 'obs-snapshot.jpg')
# endregion Settings
def capture_frame_rtsp():
image_path = SNAPSHOT_PATH # os.path.join(os.path.dirname(__file__), 'output.jpg')
print(image_path)
# cmd = ["ffmpeg", "-rtsp_transport", "tcp", "-i", "rtsp://127.0.0.1:554/live", "-frames:v", "1", '"'+image_path+'"']
cmd = ["ffmpeg","-y","-i",RTSP_SERVER_URI,"-vframes","1",'"'+image_path+'"']
print(" ".join(cmd))
subprocess.run(cmd)
return image_path
# obs.timer_add(capture_frame_rtsp, 10000) # Capture a frame every 1000 milliseconds (1 second)
# def capture_screenshot():
# obs.obs_frontend_trigger_hotkey_by_name("Screenshot") # Simulate pressing the 'S' key to trigger a screenshot capture
# obs.timer_add(capture_screenshot, 10000)
class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
print(f"GET {self.path}")
if self.path == "/":
image_path = capture_frame_rtsp()
if not os.path.exists(image_path):
self.send_error(404, "File not found")
return
# Serve the image file
with open(image_path, 'rb') as f:
self.send_response(200)
self.send_header('Content-type', 'image/jpeg')
self.end_headers()
self.wfile.write(f.read())
# self.path = screenshot_path
# else:
# self.path = 'screenshot.png' # Default file if no screenshot exists
elif self.path == "/stop":
exit(0)
return http.server.SimpleHTTPRequestHandler.do_GET(self)
class GracefulTCPServer(socketserver.TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
super().__init__(server_address, RequestHandlerClass, bind_and_activate)
self.shutdown_request = self.custom_shutdown_request
def custom_shutdown_request(self, request):
# This method is called for each request to be shut down
# Here you can add any custom behavior before shutting down
pass
def server_close(self):
# Override server_close to implement custom shutdown logic
self.shutdown()
super().server_close()
def start_http_server():
with GracefulTCPServer(("", HTTP_SERVER_PORT), Handler) as httpd:
print("Serving at port", HTTP_SERVER_PORT)
httpd.serve_forever()
# Signal handling
def signal_handler(sig, frame):
print("Signal received, shutting down server...")
# Here you can add any cleanup logic before shutting down
exit(0)
# Register signal handlers
signal.signal(signal.SIGINT, signal_handler)
# Start the server in a separate thread
server_thread = threading.Thread(target=start_http_server)
server_thread.start()