diff --git a/apps/mediamtx/.DS_Store b/apps/mediamtx/.DS_Store new file mode 100644 index 0000000..cdd8148 Binary files /dev/null and b/apps/mediamtx/.DS_Store differ diff --git a/apps/mediamtx/config.json b/apps/mediamtx/config.json new file mode 100644 index 0000000..c61f657 --- /dev/null +++ b/apps/mediamtx/config.json @@ -0,0 +1,45 @@ +{ + "name": "MediaMTX", + "id": "mediamtx", + "available": true, + "exposable": true, + "dynamic_config": true, + "port": 8889, + "tipi_version": 2, + "version": "1.15.6", + "categories": ["media", "utilities"], + "short_desc": "Serveur de streaming multimédia moderne supportant RTSP, RTMP, HLS, WebRTC, SRT.", + "description": "MediaMTX est un serveur de streaming multimédia prêt à l'emploi et performant qui supporte RTSP, RTMP, HLS, WebRTC, SRT et plus encore. Zero configuration nécessaire pour démarrer.", + "author": "bluenviron", + "source": "https://github.com/bluenviron/mediamtx", + "website": "https://mediamtx.org", + "form_fields": [ + { + "type": "text", + "env_variable": "MTX_API_USERNAME", + "label": "API Username (optionnel)", + "default": "", + "required": false, + "hint": "Nom d'utilisateur pour l'API REST (laisser vide pour désactiver l'authentification)" + }, + { + "type": "password", + "env_variable": "MTX_API_PASSWORD", + "label": "API Password (optionnel)", + "default": "", + "required": false, + "hint": "Mot de passe pour l'API REST" + }, + { + "type": "boolean", + "env_variable": "MTX_RECORD_ENABLED", + "label": "Activer l'enregistrement des streams", + "default": false, + "required": false + } + ], + "supported_architectures": [ + "amd64", + "arm64" + ] +} diff --git a/apps/mediamtx/docker-compose.json b/apps/mediamtx/docker-compose.json new file mode 100644 index 0000000..ce9814a --- /dev/null +++ b/apps/mediamtx/docker-compose.json @@ -0,0 +1,142 @@ +{ + "schemaVersion": 2, + "services": [ + { + "name": "mediamtx", + "image": "bluenviron/mediamtx:1.15.6", + "hostname": "mediamtx", + "isMain": true, + "internalPort": "8889", + "environment": [ + { + "key": "MTX_PROTOCOLS", + "value": "tcp" + }, + { + "key": "MTX_LOGLEVEL", + "value": "info" + }, + { + "key": "MTX_LOGDESTINATIONS", + "value": "stdout" + }, + { + "key": "MTX_RTSPADDRESS", + "value": ":8554" + }, + { + "key": "MTX_RTMPADDRESS", + "value": ":1935" + }, + { + "key": "MTX_HLSADDRESS", + "value": ":8888" + }, + { + "key": "MTX_WEBRTCADDRESS", + "value": ":8889" + }, + { + "key": "MTX_SRTADDRESS", + "value": ":8890" + }, + { + "key": "MTX_APIADDRESS", + "value": ":9997" + }, + { + "key": "MTX_METRICSADDRESS", + "value": ":9998" + }, + { + "key": "MTX_AUTHINTERNALUSERS", + "value": "${MTX_API_USERNAME:+${MTX_API_USERNAME}:${MTX_API_PASSWORD}}" + }, + { + "key": "MTX_PATHDEFAULTS_RECORD", + "value": "${MTX_RECORD_ENABLED:-false}" + }, + { + "key": "MTX_PATHDEFAULTS_RECORDPATH", + "value": "./recordings/%path/%Y-%m-%d_%H-%M-%S-%f" + }, + { + "key": "MTX_PATHDEFAULTS_RECORDFORMAT", + "value": "fmp4" + } + ], + "addPorts": [ + { + "containerPort": 8554, + "hostPort": 8554, + "tcp": true + }, + { + "containerPort": 8554, + "hostPort": 8554, + "udp": true + }, + { + "containerPort": 1935, + "hostPort": 1935, + "tcp": true + }, + { + "containerPort": 8888, + "hostPort": 8888, + "tcp": true + }, + { + "containerPort": 8890, + "hostPort": 8890, + "udp": true + }, + { + "containerPort": 8189, + "hostPort": 8189, + "udp": true + }, + { + "containerPort": 9997, + "hostPort": 9997, + "tcp": true + }, + { + "containerPort": 9998, + "hostPort": 9998, + "tcp": true + } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/recordings", + "containerPath": "/mediamtx/recordings" + }, + { + "hostPath": "${APP_DATA_DIR}/data/config", + "containerPath": "/mediamtx/config" + } + ], + "deploy": { + "resources": { + "limits": { + "cpus": "2.0", + "memory": "2G" + }, + "reservations": { + "cpus": "1.0", + "memory": "512M", + "devices": [] + } + } + }, + "healthCheck": { + "test": "wget --no-verbose --tries=1 --spider http://localhost:9997/v3/config/get || exit 1", + "interval": "30s", + "timeout": "10s", + "retries": 3, + "startPeriod": "10s" + } + } + ] +} diff --git a/apps/mediamtx/metadata/description.md b/apps/mediamtx/metadata/description.md new file mode 100644 index 0000000..f813f6d --- /dev/null +++ b/apps/mediamtx/metadata/description.md @@ -0,0 +1,558 @@ +# MediaMTX 1.15.6 pour Runtipi + +Serveur de streaming multimédia moderne, performant et prêt à l'emploi. + +**Version:** MediaMTX 1.15.6 +**Plateforme:** Runtipi +**Status:** ✅ Stable + +--- + +## 📖 Qu'est-ce que MediaMTX ? + +**MediaMTX** (anciennement rtsp-simple-server) est un serveur de streaming multimédia puissant et facile à utiliser qui supporte de multiples protocoles: + +### Protocoles Supportés + +- **RTSP** - Real-Time Streaming Protocol +- **RTMP** - Real-Time Messaging Protocol +- **HLS** - HTTP Live Streaming +- **WebRTC** - Web Real-Time Communication +- **SRT** - Secure Reliable Transport +- **MPEG-TS** - MPEG Transport Stream +- **UDP/RTP** - User Datagram Protocol / Real-time Transport Protocol + +### Caractéristiques Principales + +- ✅ **Zero Configuration** - Fonctionne immédiatement sans configuration +- ✅ **Conversion Automatique** - Conversion transparente entre tous les protocoles +- ✅ **Enregistrement Intégré** - Sauvegarde des streams en MP4 ou MPEG-TS +- ✅ **Performance Optimale** - Écrit en Go, faible consommation de ressources +- ✅ **API REST Complète** - Contrôle programmatique via HTTP +- ✅ **Metrics Prometheus** - Surveillance et monitoring intégrés +- ✅ **Multi-plateforme** - Linux, Windows, macOS, ARM + +### Cas d'Usage + +- **Surveillance vidéo** - Caméras IP (RTSP/ONVIF) +- **Streaming en direct** - Diffusion d'événements, conférences +- **Broadcasting** - OBS Studio, FFmpeg, GStreamer +- **Visioconférence** - WebRTC pour applications web +- **IoT et drones** - Transmission vidéo temps réel +- **Enregistrement DVR** - Sauvegarde de flux vidéo + +--- + +## 🏗️ Architecture + +MediaMTX fonctionne comme un serveur central qui accepte des connexions entrantes (publishers) et redistribue les streams aux clients (viewers): + +``` +┌──────────────────────────────────────────────────────────────┐ +│ Publishers │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ Caméra │ │ OBS │ │ FFmpeg │ │ Drone │ │ +│ │ IP │ │ Studio │ │ │ │ │ │ +│ │ (RTSP) │ │ (RTMP) │ │ (SRT) │ │ (WebRTC) │ │ +│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ +│ │ │ │ │ │ +└────────┼──────────────┼──────────────┼──────────────┼────────┘ + │ │ │ │ + ▼ ▼ ▼ ▼ +┌──────────────────────────────────────────────────────────────┐ +│ MediaMTX Server │ +│ │ +│ ┌────────────────────────────────────────────────────────┐ │ +│ │ Protocol Conversion & Stream Distribution │ │ +│ │ RTSP (8554) │ RTMP (1935) │ HLS (8888) │ WebRTC │ │ +│ │ SRT (8890) │ API (9997) │ Metrics (9998) │ │ +│ └────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌────────────────────────────────────────────────────────┐ │ +│ │ Enregistrement (optionnel) │ │ +│ │ Formats: fMP4, MPEG-TS │ │ +│ └────────────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────────────┘ + │ │ │ │ + ▼ ▼ ▼ ▼ +┌──────────────────────────────────────────────────────────────┐ +│ Viewers │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ VLC │ │Navigateur│ │ Mobile │ │ Lecteur │ │ +│ │ (RTSP) │ │ (HLS) │ │ (WebRTC) │ │ (RTMP) │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└──────────────────────────────────────────────────────────────┘ +``` + +--- + +## 🚀 Installation + +### Prérequis + +- **Runtipi** installé et fonctionnel +- **Ressources minimales:** + - **CPU:** 1 core (2+ recommandés) + - **RAM:** 512MB minimum (2GB recommandés pour production) + - **Disque:** 1GB + espace pour enregistrements (si activé) +- **Ports réseau** accessibles (voir tableau des ports) + +### Installation via Runtipi + +1. **Ouvrir l'interface Runtipi** dans votre navigateur +2. **Aller dans "App Store"** +3. **Rechercher "MediaMTX"** +4. **Cliquer sur "Install"** +5. **Configurer les options** (optionnel): + - Authentification API (username/password) + - Activer l'enregistrement des streams +6. **Cliquer sur "Installer"** + +L'application démarre automatiquement et est prête à recevoir des streams ! + +--- + +## 🔐 Configuration + +### Ports Exposés + +| Port | Protocole | Usage | Accès | +|------|-----------|-------|-------| +| **8554** | TCP/UDP | RTSP | Public | +| **1935** | TCP | RTMP | Public | +| **8888** | TCP | HLS | Public | +| **8889** | TCP | WebRTC (Signaling) | Public | +| **8890** | UDP | WebRTC/SRT Media | Public | +| **8189** | UDP | WebRTC ICE | Public | +| **9997** | TCP | API REST | Interne/Admin | +| **9998** | TCP | Metrics Prometheus | Interne/Monitoring | + +### Variables d'Environnement + +Configurables via l'interface Runtipi: + +| Variable | Description | Valeur par défaut | +|----------|-------------|-------------------| +| `MTX_API_USERNAME` | Nom d'utilisateur API | *(vide - auth désactivée)* | +| `MTX_API_PASSWORD` | Mot de passe API | *(vide)* | +| `MTX_RECORD_ENABLED` | Activer enregistrement | `false` | + +**Paramètres Automatiques** (pré-configurés): + +- `MTX_PROTOCOLS=tcp` - Protocoles Docker-friendly +- `MTX_LOGLEVEL=info` - Niveau de log +- `MTX_LOGDESTINATIONS=stdout` - Logs vers Docker +- Tous les ports configurés automatiquement + +### Authentification API + +Pour sécuriser l'API REST: + +1. **Aller dans Runtipi → Apps → MediaMTX → Paramètres** +2. **Définir `MTX_API_USERNAME`** (ex: `admin`) +3. **Définir `MTX_API_PASSWORD`** (ex: mot de passe fort) +4. **Redémarrer l'application** + +L'API nécessitera ensuite une authentification HTTP Basic: + +```bash +curl -u admin:PASSWORD http://localhost:9997/v3/config/get +``` + +### Enregistrement des Streams + +Pour activer l'enregistrement automatique: + +1. **Cocher "Activer l'enregistrement des streams"** lors de l'installation +2. Les enregistrements seront sauvegardés dans: + ``` + /opt/runtipi/app-data/*/mediamtx/data/recordings/ + ``` +3. **Format:** fMP4 (fragmenté MP4, compatible avec tous les lecteurs) +4. **Nom des fichiers:** `{stream-name}/{date}_{heure}.mp4` + +**Exemple de structure:** +``` +recordings/ +├── camera1/ +│ ├── 2025-01-06_14-30-00-000.mp4 +│ └── 2025-01-06_15-00-00-000.mp4 +└── stream2/ + └── 2025-01-06_14-45-00-000.mp4 +``` + +--- + +## 📹 Utilisation + +### 1. Publier un Stream (Publisher) + +#### Depuis OBS Studio (RTMP) + +1. **Ouvrir OBS Studio** +2. **Paramètres → Stream** +3. **Service:** Personnalisé +4. **Serveur:** `rtmp://VOTRE_IP:1935/` +5. **Clé de stream:** `nom_du_stream` +6. **Démarrer le streaming** + +#### Depuis FFmpeg (RTSP) + +```bash +ffmpeg -re -i video.mp4 -c copy -f rtsp rtsp://VOTRE_IP:8554/mon_stream +``` + +#### Depuis une Caméra IP (RTSP) + +Redirigez le stream de votre caméra: + +```bash +ffmpeg -i rtsp://camera_ip:554/stream \ + -c copy \ + -f rtsp rtsp://VOTRE_IP:8554/camera1 +``` + +#### Depuis FFmpeg (RTMP) + +```bash +ffmpeg -re -i video.mp4 -c copy -f flv rtmp://VOTRE_IP:1935/mon_stream +``` + +### 2. Lire un Stream (Viewer) + +#### Dans VLC (RTSP) + +1. **Ouvrir VLC** +2. **Média → Ouvrir un flux réseau** +3. **URL:** `rtsp://VOTRE_IP:8554/nom_du_stream` +4. **Lire** + +#### Dans un Navigateur (HLS) + +Créez un fichier HTML: + +```html + + +
+