11 KiB
7. Radio live
7.1 Démarrage d'un live
Décision : Buffer 15s + notification abonnés + limite 8h
Processus de démarrage :
- Créateur appuie "Démarrer live" dans l'app
- Vérification pré-live :
- Connexion ≥1 Mbps upload (warning si insuffisant)
- Micro autorisé
- Zone diffusion déjà définie (ville, département, région, national)
- Buffer initial 15 secondes avant diffusion publique
- Créateur parle pendant 15s → accumulation buffer serveur
- Message créateur : "Live démarre dans 15s... Testez votre micro"
- Permet vérifier qualité audio avant diffusion
- Après 15s → Live public, auditeurs peuvent rejoindre
Notification abonnés :
- ✅ Push notification immédiate à tous les abonnés dans la zone géographique
- Message : "🔴 [Nom créateur] est en direct : [Titre live]"
- Tap notification → ouverture app + lecture live immédiate
- Filtrage géographique : si abonné hors zone, pas de notif (évite frustration)
Limite de durée :
- Maximum 8 heures par session live
- Warning créateur à 7h30 : "Votre live se terminera dans 30 min"
- Si besoin continuer → arrêt + redémarrage nouveau live (évite abus ressources serveur)
Métadonnées obligatoires :
| Champ | Format | Validation |
|---|---|---|
| Titre | 5-100 caractères | Ex: "Discussion politique en direct" |
| Tags | 1-3 centres d'intérêt | Sélection liste prédéfinie |
| Classification âge | Enum | Tout public / 13+ / 16+ / 18+ |
| Zone diffusion | Geo | Ville / Département / Région / National |
Contenus interdits en live :
| Type | Description | Sanction |
|---|---|---|
| Concert/spectacle | Diffusion concert en direct depuis la salle | Strike 2 immédiat + suspension 7 jours |
| Événement sportif payant | Match, compétition avec droits TV | Strike 2 immédiat + suspension 7 jours |
| Œuvre protégée | Film, série, musique en fond sans droits | Strike 1 + suspension 3 jours + suppression live |
| Contenu violent | Agression, violence physique | Strike 3 immédiat + suspension 30 jours |
| Contenu illégal | Apologie terrorisme, pédopornographie | Strike 4 (ban définitif) + signalement autorités |
Exemple usecase interdit :
❌ Utilisateur dans salle de concert diffuse live performance
→ Violation droits d'auteur + droits de diffusion
→ Détection : modération réactive (signalements) + IA audio fingerprint
→ Sanction : Strike 2 (suspension 7 jours) + suppression live + suppression replay
Détection violations :
- Signalement utilisateurs : bouton "Signaler" accessible pendant live
- IA audio fingerprint : détection musique protégée en arrière-plan (post-MVP, voir Section 18)
- Modération réactive : modérateurs peuvent écouter lives signalés en temps réel
- Coupure immédiate : modérateur peut arrêter live si contenu illégal évident
Justification :
- Buffer 15s : équilibre entre test qualité et friction minimale
- Notification abonnés : engagement maximal, valeur ajoutée live
- 8h max : couvre 99% cas usage (podcasts longs, émissions radio) sans abus
- Interdictions strictes : protection juridique plateforme (DSA EU, droits d'auteur)
- Coût : WebRTC ingestion + HLS distribution (réutilise infra existante)
7.2 Arrêt du live
Décision : Compte à rebours 5s + tolérance déconnexion 60s + enregistrement auto
Fin manuelle créateur :
- Créateur appuie "Arrêter live"
- Compte à rebours 5 secondes affiché
- Message audio : "Ce live se termine dans 5... 4... 3... 2... 1"
- Permet au créateur de faire un outro propre
- Annulable pendant décompte (bouton "Annuler")
- Timer atteint 0 → arrêt diffusion
- Traitement post-live automatique démarre (voir ci-dessous)
Fin automatique si déconnexion :
| Durée coupure | Comportement |
|---|---|
| <60 secondes | Message auditeurs : "Connexion créateur perdue, reconnexion en cours..." |
| ≥60 secondes | Arrêt automatique live + message : "Le live est terminé suite à une coupure de connexion" |
Enregistrement automatique :
✅ Obligatoire et automatique (valeur ajoutée énorme)
Processus :
- Pendant live : enregistrement continu serveur (format Opus raw)
- Fin live → job asynchrone (worker Go + FFmpeg) :
- Conversion MP3 256 kbps (qualité optimale)
- Génération segments HLS (comme contenu classique)
- Normalisation volume -14 LUFS
- Détection silences prolongés (nettoyage)
- Publication automatique du replay :
- Titre : "[REPLAY] [Titre live original]"
- Même zone diffusion, tags, classification
- Disponible sous 5-10 minutes après fin live
- Type géo : automatiquement "Géo-neutre" (replay = contenu pérenne)
Options créateur :
| Option | Défaut | Description |
|---|---|---|
| Publier replay automatiquement | ✅ OUI | Désactivable avant démarrage live |
| Supprimer replay après coup | ✅ Possible | Suppression standard contenu |
| Modifier replay | ❌ Non | Intégrité enregistrement |
Conservation fichier source :
- Opus raw conservé 7 jours après fin live (backup)
- Suppression automatique après 7j (économie stockage)
- Si replay supprimé par créateur → fichier raw supprimé immédiatement
Justification :
- Compte à rebours 5s : outro propre, pas de coupure brutale
- Tolérance 60s : évite arrêts intempestifs (tunnel, changement cellule)
- Enregistrement auto : valorisation contenu éphémère, génération contenu pérenne
- MP3 256 kbps : qualité optimale pour replay (vs 48 kbps live)
- Coût : stockage minimal (Opus → MP3 1× par live, puis suppression raw après 7j)
7.3 Comportement auditeur
Décision : Buffer 15s + continuation hors zone + reconnexion au live actuel + écoute passive uniquement
Buffer de synchronisation :
- 15 secondes entre créateur et auditeurs
- Raisons :
- Stabilité réseau mobile (3G/4G fluctuant)
- Synchronisation approximative acceptable (pas besoin temps réel strict)
- Permet buffering anticiper coupures courtes (tunnels)
Comparaison buffers :
| Buffer | Avantages | Inconvénients | Décision |
|---|---|---|---|
| 5s | Quasi temps réel | Instable 3G, coupures fréquentes | ❌ |
| 10s | Bon compromis | Légèrement juste pour 3G | ❌ |
| 15s | Stabilité optimale 3G/4G | Léger décalage acceptable | ✅ |
| 20s+ | Très stable | Décalage trop perceptible | ❌ |
Zone géographique pendant live :
- ✅ Continuation si sortie de zone
- Scénario : auditeur écoute live régional → sort du département → live continue
- Raisons :
- Pas de coupure brutale (mauvaise UX)
- Écoute engagée = terminer naturellement
- Après fin live → algo normal (pas de contenus hors zone)
Reconnexion après coupure réseau :
| Durée coupure | Comportement |
|---|---|
| <90 secondes | Reprend au live actuel (pas au buffer ancien) + saut temporel transparent |
| ≥90 secondes | Message : "Live en cours perdu, passage au contenu suivant" + algo propose contenu normal |
Interactions disponibles :
Décision ferme : ❌ Aucun chat en direct, ni maintenant ni dans le futur
Raisons :
- Sécurité routière : pas de distraction en voiture (focus UX)
- Harcèlement : évite contenu haineux, insultes, trolling
- Modération : pas de coût modération temps réel (impossible à scale)
- Simplicité : écoute passive = expérience uniforme
Actions autorisées pendant live :
| Action | Disponible | Effet |
|---|---|---|
| Like | ✅ | Bouton cœur interface mobile (véhicule arrêté) |
| Abonnement créateur | ✅ | Bouton profil créateur (interface mobile) |
| Skip | ✅ | Passe au contenu suivant, sort du live |
| Précédent | ❌ | Pas de sens sur live (flux temps réel) |
| Chat | ❌ | Jamais implémenté (décision définitive) |
| Réactions emoji | ❌ | Jamais implémenté (décision définitive) |
Messages utilisateur :
- "💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement."
Justification décision définitive :
- UX cohérente : RoadWave = écoute en conduisant, pas réseau social interactif
- Bien-être : évite toxicité, harcèlement, haine (fléau réseaux sociaux)
- Juridique : pas de risque contentieux modération chat (DSA EU)
- Coût : 0€ infra chat, 0€ modération temps réel
- Différenciation : positionnement "audio safe" vs plateformes toxiques
7.4 Architecture technique
Stack :
Créateur (App mobile)
↓ WebRTC (OPUS 48 kbps)
Serveur Ingestion (Go + Pion WebRTC)
↓ Conversion temps réel
Serveur HLS (segments .ts)
↓ NGINX Cache (OVH VPS)
Auditeurs (App mobile, HLS natif)
Flux détaillé :
- Créateur → WebRTC OPUS 48 kbps vers serveur Go
- Serveur Go → Conversion temps réel OPUS → segments HLS (.m3u8 + .ts)
- NGINX Cache (OVH VPS) → Distribution HLS avec cache
- Auditeurs → Lecture HLS native iOS/Android (buffer 15s)
- Enregistrement parallèle → Opus raw stocké temporairement
- Post-live → Job async : Opus → MP3 256 kbps → Publication replay
Dépendances :
- ✅ Pion WebRTC (Go library, open source, MIT license)
- ✅ FFmpeg (conversion audio, LGPL/GPL)
- ✅ NGINX (cache et distribution HLS, open source)
- ✅ OVH Object Storage (stockage origin, compatible S3)
- ✅ PostgreSQL + Redis (métadonnées live + cache)
Avantages :
- ✅ Pas de dépendance Google/Facebook/Cloudflare (souveraineté)
- ✅ WebRTC standard ouvert (Pion = lib Go pure)
- ✅ Réutilise infra HLS existante (pas de doublon)
- ✅ NGINX Cache (OVH VPS) optimise la distribution (coût réduit)
- ✅ Scalable horizontalement (workers Go)
Coût estimé infrastructure :
| Phase | Utilisateurs | Infra live | Coût/mois |
|---|---|---|---|
| MVP | 0-100K | 1 instance Go (ingestion 100 lives simultanés) | +50€ (serveur) + bande passante |
| Growth | 100K-1M | 3-5 instances Go (500 lives simultanés) | +200€ + bande passante |
| Scale | 1M-10M | Kubernetes auto-scale (2000+ lives) | +1K€ + bande passante |
Bande passante :
- Live : 48 kbps × nb_auditeurs (via NGINX Cache, segments)
- Exemple : 100 auditeurs = 4.8 Mbps = ~2 Go/heure via cache
- Coût estimé : ~0.02€/heure pour 100 auditeurs