Поток QGraphicsView Flask портится при поступлении нескольких запросовPython

Программы на Python
Ответить
Anonymous
 Поток QGraphicsView Flask портится при поступлении нескольких запросов

Сообщение Anonymous »

Я хочу транслировать свое QApplication, использующее QGraphicsScene. Я захватываю окно и транслирую его с помощью Flask. На заднем плане сцены есть несколько веб-тайлов и добавлены некоторые элементы QPixmap. Однако когда больше зрителей начинают смотреть поток в браузере, поток искажается. Иногда представление в QWindow также повреждается.
Изображение

Изображение

Коррупция на QWindow — это
Изображение

Дополнительная информация о повреждении область: На заднем плане есть несколько изображений с названиями веб-плиток. Каждый квадрат, который выглядит поврежденным, представляет собой паутину.

class TrafficSimulationView(QGraphicsView):
def __init__(self, car_data, center_coordinates):
super().__init__()
self.scene = QGraphicsScene(self)
self.center_coordinates = center_coordinates

def capture_view(self):
# Ensure capturing the whole scene
img = QImage(self.scene.sceneRect().size().toSize(), QImage.Format_RGB32)
painter = QPainter(img)
self.scene.render(painter) # Render the scene, not the viewport
painter.end()

# Convert QImage to numpy array
img_data = img.bits().asstring(img.width() * img.height() * 4)
img_np = np.frombuffer(img_data, np.uint8).reshape((img.height(), img.width(), 4))

return img_np
...

class FlaskThread(QThread):
new_frame_requested = pyqtSignal() # Signal to request a new frame from the PyQt window

def __init__(self, app, junction_id):
super().__init__()
self.app = app
# self.app.debug = True
self.junction_id = junction_id

def run(self):
"""Run the Flask app in this thread."""
self.app.run(host='0.0.0.0', port=5000, threaded=True)

class TrafficSimulationApp:
def __init__(self):
self.app = Flask(__name__)
...
self.qt_app = QApplication(sys.argv)
self.window = TrafficSimulationView(self.car_data, self.initial_coords)
self.__define_flask_routes()
self.flask_thread = FlaskThread(self.app, self.junction_id)
self.flask_thread.new_frame_requested.connect(self.window.capture_view)

def __define_flask_routes(self):
"""Define Flask route for video feed."""
@self.app.route(f'/video_feed/{self.junction_id}')
def video_feed():
return Response(self.generate_frames(),
mimetype='multipart/x-mixed-replace; boundary=frame')

def generate_frames(self):
"""Generate frames from the PyQt view for video streaming."""
while True:
# Capture the frame from the PyQt window (main thread handles this)
frame = self.window.capture_view() # Capture and return the current frame directly

# Resize and process the frame as needed
frame = cv2.resize(frame, (640, 480))

# Encode frame as JPEG
ret, buffer = cv2.imencode('.jpg', frame)
frame_bytes = buffer.tobytes()

# Yield as multipart data
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')

time.sleep(0.1) # Adjust the frame rate

def run(self):
"""Run the PyQt application and start Flask server in a separate thread."""
# Show the PyQt window
self.window.show()

# Start the Flask server in a separate QThread
self.flask_thread.start()
self.qt_app.exec_()
self.flask_thread.wait()

if __name__ == '__main__':
...
app = TrafficSimulationApp()
app.run()


Подробнее здесь: https://stackoverflow.com/questions/792 ... t-has-come
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»