# Guide d'accès aux flux caméra — DWARF Mini Ce document décrit comment accéder aux flux vidéo des caméras du télescope DWARF Mini (et DWARF II/3), que ce soit pour capturer une image unique, afficher un flux continu, ou enregistrer une vidéo. --- ## 1. Architecture du flux caméra Le télescope possède **deux caméras** accessibles via des protocoles distincts : | Caméra | Canal RTSP | Usage | |--------|-----------|-------| | **Tele** | `ch0` | Caméra principale (longue focale) | | **Wide** | `ch1` | Caméra grand angle (repérage) | Le flux vidéo est accessible via le protocole **RTSP** sur le port **554** : ``` rtsp://:554/ch0/stream0 # Téléobjectif (Tele) rtsp://:554/ch1/stream0 # Grand angle (Wide) ``` ### Caractéristiques techniques - **Codec** : MJPEG (Motion JPEG) - **Résolution** : 1920×1080 (les deux caméras) - **Transport** : TCP (`rtsp_transport=tcp` obligatoire) - **FPS** : Variable (généralement 15-30 FPS selon l'éclairage) ### ⚠️ Prérequis absolu : ouvrir la caméra via WebSocket **Le flux RTSP n'est actif qu'après avoir ouvert la caméra via l'API de contrôle WebSocket** (port 9900). Sans cette étape, le serveur RTSP accepte la connexion TCP mais n'envoie **aucune frame vidéo**. La procédure complète est : 1. Se connecter au WebSocket `ws://:9900/?client_id=mon_client` 2. Envoyer la commande `CMD_CAMERA_TELE_OPEN_CAMERA` (10000) ou `CMD_CAMERA_WIDE_OPEN_CAMERA` (12000) via le protocole `WsPacket` 3. Attendre ~2 secondes que le serveur RTSP démarre 4. Se connecter au flux RTSP avec `ffmpeg`, `mpv`, `VLC` ou tout lecteur RTSP --- ## 2. Accès avec `dwarfctl` (le plus simple) Le CLI `dwarfctl` inclut une commande `preview grab` qui automatise toute la séquence (ouverture caméra + capture RTSP) : ```bash # Capturer une frame de la caméra grand angle dwarfctl --ip 192.168.88.1 preview grab --cam wide /tmp/wide.jpg # Capturer une frame du téléobjectif dwarfctl --ip 192.168.88.1 preview grab --cam tele /tmp/tele.jpg ``` --- ## 3. Accès avec `ffmpeg` (capture manuelle) ### Capture d'une seule image (frame) ```bash # 1. Ouvrir la caméra via WebSocket dwarfctl --ip 192.168.88.1 camera open --cam wide # 2. Attendre 2 secondes sleep 2 # 3. Capturer une frame ffmpeg -rtsp_transport tcp \ -i "rtsp://192.168.88.1:554/ch1/stream0" \ -frames:v 1 -q:v 2 \ -y wide_frame.jpg ``` ### Capture de plusieurs frames (time-lapse) ```bash # Capturer 1 frame par seconde pendant 60 secondes ffmpeg -rtsp_transport tcp \ -i "rtsp://192.168.88.1:554/ch1/stream0" \ -r 1 -t 60 \ -q:v 2 \ wide_timelapse_%03d.jpg ``` ### Enregistrement vidéo (MP4) ```bash # Enregistrer 30 secondes de vidéo ffmpeg -rtsp_transport tcp \ -i "rtsp://192.168.88.1:554/ch1/stream0" \ -t 30 -c:v libx264 -preset fast \ wide_video.mp4 ``` --- ## 4. Accès avec `mpv` (flux continu) `mpv` est idéal pour afficher le flux en direct avec faible latence : ```bash # 1. Ovrir la caméra dwarfctl --ip 192.168.88.1 camera open --cam wide # 2. Afficher le flux en plein écran mpv --rtsp-transport=tcp "rtsp://192.168.88.1:554/ch1/stream0" ``` ### Options utiles pour mpv ```bash # Faible latence mpv --rtsp-transport=tcp --profile=low-latency \ "rtsp://192.168.88.1:554/ch1/stream0" # Double flux (Tele + Wide côte à côte) dwarfctl --ip 192.168.88.1 camera open --cam tele & dwarfctl --ip 192.168.88.1 camera open --cam wide & sleep 2 mpv --rtsp-transport=tcp "rtsp://192.168.88.1:554/ch0/stream0" & mpv --rtsp-transport=tcp "rtsp://192.168.88.1:554/ch1/stream0" ``` --- ## 5. Accès avec VLC ```bash # Ouvrir depuis la ligne de commande vlc "rtsp://192.168.88.1:554/ch1/stream0" --rtsp-tcp # Ou depuis l'interface VLC : # Média → Ouvrir un flux réseau → rtsp://192.168.88.1:554/ch1/stream0 # (Cliquer sur "Afficher les options" → ajouter :rtsp-tcp) ``` --- ## 6. Accès programmatique (Python / Go) ### Python (avec OpenCV) ```python import cv2 import subprocess import time # 1. Ouvrir la caméra via dwarfctl subprocess.run(["dwarfctl", "--ip", "192.168.88.1", "camera", "open", "--cam", "wide"]) time.sleep(2) # 2. Ouvrir le flux RTSP avec OpenCV cap = cv2.VideoCapture("rtsp://192.168.88.1:554/ch1/stream0") cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) while True: ret, frame = cap.read() if not ret: break cv2.imshow("DWARF Wide", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` ### Go (avec `gortsplib` ou `ffmpeg` exec) ```go // Voir la commande `preview grab` dans: // dwarfctl/cmd/dwarfctl/main.go → func cmdPreview() // Elle utilise exec.Command("ffmpeg", ...) pour capturer une frame. ``` --- ## 7. Comparatif des modes de preview Le télescope supporte deux modes de preview selon les modèles : | Mode | Protocole | Port | DWARF Mini | DWARF II/3 | |------|-----------|------|:----------:|:----------:| | **RTSP** | `rtsp://` | 554 | ✅ Actif | ✅ Actif | | **MJPEG** | HTTP multipart | 8092 | ❌ Inactif | ⚠️ Non testé | - **RTSP (streamType=1)** : flux MJPEG encapsulé en RTSP, port 554, channel `ch0` (tele) ou `ch1` (wide), path `/stream0`. - **MJPEG HTTP (streamType=2)** : flux multipart/x-mixed-replace sur port 8092, endpoints `/mainstream` (tele) et `/secondstream` (wide). Le DWARF Mini n'envoie pas de frames sur ce port — le mode RTSP est utilisé. Le choix entre RTSP et MJPEG est décidé par le télescope via la notification `CMD_NOTIFY_STREAM_TYPE` (15234) qui transporte `StreamType{stream_type, cam_id}`. L'app Android s'y adapte automatiquement. --- ## 8. Dépannage ### Le flux RTSP ne donne aucune image **Cause** : la caméra n'est pas ouverte via WebSocket. **Solution** : ```bash dwarfctl --ip 192.168.88.1 camera open --cam wide sleep 2 ffmpeg -rtsp_transport tcp -i "rtsp://192.168.88.1:554/ch1/stream0" -frames:v 1 test.jpg ``` ### ffmpeg affiche "Connection refused" sur le port 554 **Cause** : le télescope vient de démarrer, le serveur RTSP n'est pas encore prêt. **Solution** : attendre 10-15 secondes après l'allumage du télescope. ### L'image est noire **Cause** : le télescope pointe vers le sol ou dans l'obscurité. **Solution** : vérifier la position du télescope, ou augmenter le gain/exposure : ```bash dwarfctl --ip 192.168.88.1 camera exp --cam wide 200 # exposition longue dwarfctl --ip 192.168.88.1 camera gain --cam wide 100 # gain élevé ``` ### VLC met très longtemps à afficher l'image **Cause** : VLC utilise UDP par défaut pour RTSP. **Solution** : forcer TCP — ajouter `:rtsp-tcp` dans les options ou utiliser `--rtsp-transport=tcp` en ligne de commande.