import os
import cv2
import time
# --- НАСТРОЙКИ FFMPEG (Делаем OpenCV похожим на VLC) ---
# rtsp_transport;tcp - жестко форсируем TCP (надежная доставка)
# stimeout;5000000 - тайм-аут сокета (5 секунд), чтобы не отваливался сразу
# max_delay;500000 - даем буферу время на сборку кадра
os.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp|stimeout;5000000|max_delay;500000"
camera_url = "rtsp://admin:PKQEEY@192.168.0.101:8000/H.264"
print("Подключение к камере...")
cap = cv2.VideoCapture(camera_url, cv2.CAP_FFMPEG)
if not cap.isOpened():
print("[ОШИБКА] Не удалось открыть поток вообще.")
exit()
print("Поток открыт. Нажмите 'q' на окне с видео для выхода.")
empty_count = 0
while True:
ret, frame = cap.read()
if not ret:
empty_count += 1
print(f"[ОШИБКА] Пустой кадр ({empty_count}). Объект VideoCapture сломался.")
# Если OpenCV поймал пустой кадр, ждать бессмысленно - надо пересоздавать подключение
print("Перезапускаем подключение к камере...")
cap.release()
time.sleep(2) # Даем камере "отдохнуть"
cap = cv2.VideoCapture(camera_url, cv2.CAP_FFMPEG)
continue
# Если кадр есть - сбрасываем счетчик ошибок
empty_count = 0
# Уменьшаем для предпросмотра, чтобы влезло на экран
frame_preview = cv2.resize(frame, (640, 480))
cv2.imshow("VLC Style Test", frame_preview)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()