import cv2
import threading
import tkinter as tk
from tkinter import Label
from PIL import Image, ImageTk

# URL của các camera
camera_urls = {
    'bancan11': 'rtsp://admin:longson2016@192.168.15.99:554/Streaming/Channels/102',
    'bancan12': 'rtsp://admin:longson2016@192.168.15.99:554/Streaming/Channels/202',
    'bancan21': 'rtsp://admin:longson2016@192.168.15.99:554/Streaming/Channels/302',
    'bancan22': 'rtsp://admin:longson2016@192.168.15.99:554/Streaming/Channels/402',
}

# Khởi tạo giao diện Tkinter
root = tk.Tk()
root.title("RTSP Multi-Camera Viewer")

# Tạo các Label để hiển thị video
video_labels = {}
for camera_id in camera_urls.keys():
    label = Label(root)
    label.pack(side="left")
    video_labels[camera_id] = label

# Hàm để phát video từ RTSP cho từng camera
def stream_video(camera_id, rtsp_url):
    cap = cv2.VideoCapture(rtsp_url)
    if not cap.isOpened():
        print(f"Không thể kết nối tới camera {camera_id}.")
        return

    while True:
        ret, frame = cap.read()
        if not ret:
            print(f"Mất kết nối tới camera {camera_id}. Đang thử lại...")
            cap.release()
            cap = cv2.VideoCapture(rtsp_url)
            continue

        # Chuyển đổi frame OpenCV sang định dạng Tkinter
        frame = cv2.resize(frame, (320, 180))  # Kích thước khung hình
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(frame)
        imgtk = ImageTk.PhotoImage(image=img)

        # Hiển thị hình ảnh trên Label của camera tương ứng
        video_labels[camera_id].imgtk = imgtk
        video_labels[camera_id].configure(image=imgtk)
        cv2.waitKey(100)
# Tạo và chạy luồng cho mỗi camera
for camera_id, rtsp_url in camera_urls.items():
    thread = threading.Thread(target=stream_video, args=(camera_id, rtsp_url))
    thread.daemon = True
    thread.start()

# Bắt đầu giao diện Tkinter
root.mainloop()
