| import cv2 |
| import numpy as np |
| from nes_py import NESEnv |
| from flask import Flask, Response, render_template_string |
| import time |
| import os |
|
|
| |
| app = Flask(__name__) |
|
|
| |
| running = False |
| reset_flag = False |
|
|
| |
| rom_path = "/home/ubuntu/mario/Super Mario Bros.nes" |
|
|
| |
| try: |
| env = NESEnv(rom_path) |
| obs = env.reset() |
| done = False |
| print("NES environment initialized successfully with ROM:", rom_path) |
| except Exception as e: |
| print("Error initializing NES environment:", e) |
| exit(1) |
|
|
| |
| def generate_frames(): |
| global running, reset_flag, done, obs |
| frame_time = 1 / 30.0 |
| print("Starting frame generation loop...") |
| while running: |
| start = time.time() |
| if reset_flag: |
| obs = env.reset() |
| reset_flag = False |
| done = False |
| print("Game reset to title screen") |
| if done: |
| obs = env.reset() |
| done = False |
| print("Game reset due to done state") |
| |
| obs, reward, done, info = env.step(0) |
| print("Step executed, Reward:", reward, "Done:", done) |
| |
| frame = env.get_image() |
| if frame is None: |
| print("Warning: Frame is None!") |
| time.sleep(frame_time) |
| continue |
| frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) |
| print("Captured frame shape:", frame.shape) |
| |
| ret, buffer = cv2.imencode('.jpg', frame) |
| if not ret: |
| print("Warning: Failed to encode frame!") |
| time.sleep(frame_time) |
| continue |
| frame_bytes = buffer.tobytes() |
| yield (b'--frame\r\n' |
| b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n') |
| elapsed = time.time() - start |
| if elapsed < frame_time: |
| time.sleep(frame_time - elapsed) |
| print("Frame sent, elapsed time:", elapsed) |
|
|
| |
| @app.route('/video_feed') |
| def video_feed(): |
| if not running: |
| return "Stream not running", 503 |
| return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') |
|
|
| |
| @app.route('/') |
| def index(): |
| return render_template_string(''' |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Mario Title Screen Stream</title> |
| <style> |
| body { background: #1e1e1e; color: white; font-family: Arial, sans-serif; text-align: center; } |
| img { border: 2px solid #00ff00; } |
| </style> |
| </head> |
| <body> |
| <h1>Mario Title Screen Live Stream</h1> |
| <img src="/video_feed" width="256" height="240"> |
| </body> |
| </html> |
| ''') |
|
|
| |
| if __name__ == "__main__": |
| print("Starting Flask server on http://0.0.0.0:5111...") |
| running = True |
| try: |
| app.run(host='0.0.0.0', port=5111, debug=True, use_reloader=False) |
| except KeyboardInterrupt: |
| print("Stopping the stream...") |
| running = False |