# Enregistrement et stockage

SkyView enregistre localement en segments par défaut, avec la possibilité d'associer 115 Cloud pour une sauvegarde dans le cloud. Ce chapitre explique le mécanisme d'enregistrement, les politiques de rétention et l'intégration 115.

## Comment fonctionne l'enregistrement

SkyView découpe la vidéo de chaque caméra en fichiers MP4 standards selon le temps, **avec un segment fixe de 60 secondes**. MediaMTX écrit d'abord des segments fMP4 ; dès qu'un segment est terminé, le hook `runOnRecordSegmentComplete` se déclenche, et ffmpeg le remuxe sur place avec `-c copy` en un MP4 standard avec `faststart` (moov en tête), afin que tout lecteur puisse chercher directement dans la vidéo. Le chemin sur disque :

```text
data/recordings/
  <camera_id>/
    2026-05-18_14-30-00.mp4
    2026-05-18_14-31-00.mp4
    2026-05-18_14-32-00.mp4
    ...
```

> ℹ️ L'enregistrement segmenté permet à la lecture de chercher précisément n'importe quel point dans le temps. Si un segment est corrompu (coupure de courant, instabilité réseau), vous ne perdez au maximum que 60 secondes, sans affecter les segments voisins. L'horodatage dans le nom de fichier correspond à l'heure de début du segment (fuseau horaire local).

> **ℹ️ Chemin après archivage**
>
> En mode **stockage local**, une fois qu'un segment est enregistré en base de données et marqué `archived`, il est déplacé (`rename`) de façon atomique sous `data/recordings/_archive/<camera_id>/`, en reproduisant exactement la même arborescence et le même nom de fichier, afin de le distinguer des fichiers en cours d'écriture. Le préfixe `_archive/` est une convention : le balayage de découverte de l'uploader l'ignore pour éviter de retraiter les fichiers déjà archivés. En mode **115 Cloud**, la conservation de la copie locale dépend du paramètre `delete_after_upload` (par défaut : suppression après envoi réussi).

## Chemin de stockage local

Les enregistrements sont écrits dans `/app/data/recordings` (point de montage imbriqué, qui peut être redirigé séparément vers un grand disque / NAS) ; les petites données d'état comme la base de données, les cookies et les journaux résident dans `/app/data`, et les modèles d'IA sont intégrés à l'image plutôt que dans le répertoire de données. En production, dirigez toujours le répertoire d'enregistrements vers un disque disposant d'une capacité suffisante, et évitez de le placer sur la même partition que le disque système — un disque d'enregistrements plein empêcherait votre serveur de démarrer.

```bash
# Recommandé : montez les enregistrements sur un disque / NAS séparé et volumineux (les petites données restent dans data/)
sudo mkdir -p /mnt/recordings
# Script en une ligne : pointez --recordings-dir vers le grand disque
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash -s -- --recordings-dir /mnt/recordings
# Ou montez le volume d'enregistrements en mode imbriqué dans un docker run manuel
docker run -v $(pwd)/data:/app/data -v /mnt/recordings:/app/data/recordings ...
```

## Politique de rétention et espace disque

Web Admin → Paramètres → Rétention des enregistrements pour activer et configurer le nettoyage automatique (désactivé par défaut, à activer manuellement). Une fois activées, les deux règles ci-dessous **s'appliquent toutes les deux** et chacune peut déclencher une suppression ; **seuls les enregistrements archivés (envoyés avec succès, ou en mode local) sont nettoyés** ; les états en attente / en cours d'envoi / échoué ne sont jamais touchés :

- **Par jours** : les enregistrements plus anciens que le nombre de jours de rétention (30 par défaut) → sont supprimés ; mettez 0 pour ne pas déclencher par le temps
- **Par capacité** : lorsque l'utilisation du disque dépasse le seuil (90 % par défaut) → suppression en commençant par les plus anciens ; mettez 100 pour ne pas déclencher par l'espace

> **ℹ️ Désactivé par défaut**
>
> Sur une installation neuve, le service `[cleanup]` a enabled=false — si vous le laissez désactivé, tout est conservé ; quand le disque se remplit, les écritures échouent mais SkyView ne supprime rien de lui-même. Pour un déploiement domestique, nous recommandons vivement de l'activer et de laisser le système gérer ce souci via les deux règles ci-dessus.

| Résolution | Débit | Utilisation approximative par flux et par 24 heures |
| --- | --- | --- |
| 1080p H.264 | 2 Mbit/s | ~21 Go / jour |
| 1080p H.265 | 1 Mbit/s | ~10 Go / jour |
| 4K H.265 | 4 Mbit/s | ~42 Go / jour |

> **💡 Formule d'estimation de la capacité**
>
> **Disque total ≈ nombre de flux × utilisation quotidienne par flux × jours de rétention × 1,2 (marge pour les vignettes + la base de données)**. 10 flux en 1080p H.265 conservés 30 jours ≈ 3,6 To.

## Stockage Cloud 115 (optionnel)

Envoie de façon asynchrone les enregistrements locaux vers 115 Cloud, en somme un « NVR dans le cloud ». Grâce à la prise en charge de l'envoi instantané, les enregistrements déjà présents ne consomment pas de bande passante.

1. **Scanner pour se connecter**

   Web Admin → 115 → affichez le QR code et autorisez-le en le scannant avec l'application mobile 115. SkyView enregistre les informations de connexion chiffrées dans le répertoire de données.

2. **Choisir le dossier cible**

   Créez un dossier vide dans 115 (par ex. « Enregistrements SkyView »), revenez dans SkyView, puis sélectionnez-le comme destination d'envoi

3. **Changer le backend de stockage**

   Paramètres → Stockage → choisissez 115 → Enregistrer. Le changement se fait à chaud, **sans redémarrer le processus**, et prend effet dès le prochain envoi

4. **Vérifier que ça fonctionne**

   Le Web Admin ne dispose actuellement d'**aucune file d'attente d'envoi ni panneau de progression**. Pour vérifier que les enregistrements sont bien envoyés, trois méthodes possibles : ① la page **Paramètres → 115** pour vérifier que le statut VIP et l'espace restant semblent corrects ; ② la page **Journaux** (barre latérale → Journaux), sélectionnez le service `uploader` à gauche pour suivre en temps réel les lignes de démarrage / fin / échec de chaque segment ; ③ ouvrez l'application ou le site 115 et allez dans le dossier cible pour voir si de nouveaux enregistrements arrivent.

> **⚠️ Expiration de la connexion 115**
>
> Il faut rescanner environ tous les 30 jours. À l'expiration, SkyView envoie une notification push ; il suffit de rescanner rapidement, et les enregistrements continuent d'être écrits localement sans être perdus entre-temps.

> **ℹ️ Que faire si vous n'utilisez pas 115**
>
> Actuellement, seuls les backends local et 115 sont pris en charge. Aliyun Drive / S3 et d'autres seront ajoutés plus tard ; si vous avez un besoin spécifique de stockage cloud, ouvrez un ticket pour nous indiquer la priorité.

## Téléchargement / export

La page de lecture prend en charge l'« export par plage horaire » — choisissez une heure de début et de fin, et le backend réencode et découpe le tout en un seul fichier MP4 à télécharger, avec une **précision à l'image près** sur le début/la fin (erreur < 40 ms). Le matériel est **sélectionné automatiquement** : NVIDIA NVENC (50 à 200x le temps réel, quelques dizaines de secondes par heure sur une RTX) → VAAPI iGPU Intel (25 à 50x, une à deux minutes par heure sur un N100) → encodage logiciel libx264 (1,5 à 3x, une dizaine de minutes par heure). Si un palier échoue, il bascule automatiquement sur le suivant. **Pris en charge sur Web Admin, Android et iOS.**

1. **Ouvrir la page de lecture**

   Sélectionnez la caméra et la date à exporter. Faites glisser la frise chronologique près de la plage voulue afin que le repère central se place sur ce segment d'enregistrement.

2. **Cliquer sur le bouton d'export**

   Web Admin : l'icône ⬇ tout à droite de la barre de contrôle de lecture ; Android / iOS : « Exporter » à droite du bouton « Vitesse » sur la barre de contrôle. Un panneau de sélection de plage s'ouvre, préréglé sur la position de lecture actuelle ± 30 secondes.

3. **Ajuster le début/la fin → valider**

   Modifiez les heures de début/fin dans le panneau ; la taille estimée se calcule en temps réel (1080p H.264 ≈ 250 Ko/s). La durée maximale par export est de **1 heure** ; au-delà, la demande est rejetée. Cliquez sur « Démarrer l'export ».

4. **Suivre la progression**

   Une carte de progression apparaît en bas à droite (Web) / sous la barre de contrôle (Android/iOS). Le Web se rafraîchit en temps réel via SSE ; le mobile interroge toutes les 2 secondes. Une fois mise en file, une tâche se termine généralement en quelques secondes à quelques dizaines de secondes (selon le nombre de segments et si des segments cloud doivent être récupérés depuis 115).

5. **Télécharger**

   Lorsque la carte de progression se transforme en bouton « Télécharger », cliquez dessus : le Web télécharge directement via le navigateur ; Android utilise le DownloadManager système pour enregistrer dans `Downloads/SkyView/` avec une notification dans la barre d'état ; iOS ouvre une feuille de partage pour « Enregistrer dans Fichiers / Photos » ou partager vers WeChat.

> **ℹ️ Accélération matérielle sélectionnée automatiquement : NVENC > VAAPI > libx264**
>
> Détecté automatiquement au démarrage du processus, par ordre de priorité du plus rapide au plus lent :
>
> - **NVENC** (GPU dédié NVIDIA) : nécessite la variante d'image cuda + `--gpus all` ; ~30 à 60 secondes pour 1 h de vidéo sur une série RTX 30/40
> - **VAAPI** (iGPU Intel/AMD) : nécessite l'image openvino/all-in-one + le passthrough de `/dev/dri` ; ~1 à 2 minutes pour 1 h de vidéo sur un N100, etc.
> - **libx264** (CPU uniquement) : solution de repli en l'absence de GPU ; ~20 à 40 minutes pour 1 h de vidéo (selon le CPU)
>
> Si un palier échoue à l'exécution (pilote incompatible, limite de sessions, etc.), il bascule automatiquement sur le suivant. Pour en imposer un précisément, utilisez `recording.export.hwaccel = "nvenc" / "vaapi" / "none"`.

> **ℹ️ Les heures de début/fin sont précises à l'image près**
>
> Les trois chaînes d'encodage (NVENC / VAAPI / libx264) sont précises à l'image près sur le début/la fin (< 40 ms). Les paramètres de qualité sont alignés : NVENC `qp=23` / VAAPI `qp=23` / libx264 `crf=23` — le résultat est visuellement quasi identique quel que soit le matériel (les fichiers NVENC peuvent être légèrement plus volumineux, < 10 %). Configurez `recording.export.{nvenc,vaapi}_qp` pour ajuster la qualité séparément (0-51, plus bas = meilleure qualité).

> **ℹ️ Le mode de stockage Cloud 115 est également pris en charge**
>
> Si les enregistrements sont sur 115, le backend commence par transférer chaque segment de la plage depuis 115 vers un répertoire temporaire du serveur, puis les concatène, avant de nettoyer les fichiers temporaires. Selon la limite de débit de 115, 1 heure de segments cloud peut prendre quelques minutes — vous pouvez vaquer à autre chose ; la tâche d'export s'exécute indépendamment côté serveur, et fermer l'application n'y change rien.

> **💡 Les fichiers exportés sont conservés 24 heures**
>
> Le MP4 assemblé est déposé dans `data/recordings/_exports/<job_id>.mp4` sur le serveur et est automatiquement supprimé par le nettoyage au bout de 24 heures par défaut (pour éviter de saturer le disque). Pendant cette période, vous pouvez recliquer sur « Télécharger » depuis n'importe quel client, à tout moment, pour le même fichier. Une fois expiré, relancez l'export pour l'obtenir à nouveau.

> **ℹ️ Récupérer les segments bruts sans passer par l'interface**
>
> Les segments bruts de 60 secondes se trouvent dans `data/recordings/<camera_id>/<YYYY-MM-DD_HH-MM-SS>.mp4` (après archivage local, sous `data/recordings/_archive/<camera_id>/`), chacun étant un MP4 standard. Vous pouvez aussi faire un `GET /api/recordings/<id>/download` avec un JWT pour récupérer un seul segment.

---

来源:https://yun-kan.com/fr/docs/recording
