241 lines
8.8 KiB
Markdown
241 lines
8.8 KiB
Markdown
|
|
# 🔍 AUDIT STRUCTURÉ - Moteur d'encodage audio veza-stream-server
|
||
|
|
|
||
|
|
**Date**: 2025-01-27
|
||
|
|
**Mission**: P0 - Rendre le stream-server fonctionnel (encodage audio & pipeline FFmpeg)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. FONCTIONNALITÉS ACTUELLES
|
||
|
|
|
||
|
|
### 1.1 Ce qui est réellement implémenté
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/pipeline/queue.rs`
|
||
|
|
- **File d'attente prioritaire** avec 3 niveaux (Urgent, Normal, Background)
|
||
|
|
- Utilise `tokio::sync::mpsc` avec capacité configurable (défaut: 100)
|
||
|
|
- Méthode `submit()` avec backpressure (retourne `QueueFull` si saturée)
|
||
|
|
- Méthode `next_job()` avec stratégie de priorité stricte (Urgent > Normal > Background)
|
||
|
|
- **État**: ✅ **Fonctionnel**
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/pipeline/job.rs`
|
||
|
|
- Structure `TranscodingJob` complète avec:
|
||
|
|
- ID, track_id, input_path, output_dir
|
||
|
|
- QualityProfile, priority, status
|
||
|
|
- Timestamps (created_at, started_at, completed_at)
|
||
|
|
- Retry logic (retry_count, can_retry)
|
||
|
|
- Progress tracking (progress_percent)
|
||
|
|
- États: `Pending`, `Processing`, `Completed`, `Failed(String)`, `Cancelled`
|
||
|
|
- Méthodes: `mark_started()`, `mark_completed()`, `mark_failed()`
|
||
|
|
- **État**: ✅ **Fonctionnel**
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/pipeline/worker.rs`
|
||
|
|
- Structure `TranscodingWorker` avec ID
|
||
|
|
- Méthode `process()` qui:
|
||
|
|
- Construit la commande FFmpeg via `FfmpegCommandBuilder`
|
||
|
|
- Exécute avec timeout (5 minutes)
|
||
|
|
- Gère les erreurs et retry
|
||
|
|
- **État**: ⚠️ **Partiellement fonctionnel** (TODOs présents)
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/ffmpeg/command_builder.rs`
|
||
|
|
- Builder pattern pour commandes FFmpeg
|
||
|
|
- Support: input, output, codec, bitrate, sample_rate, channels, container
|
||
|
|
- Support HLS basique: `-f hls`, `-hls_time`, `-hls_playlist_type vod`
|
||
|
|
- Génération de noms de segments: `segment_%05d.ts`
|
||
|
|
- **État**: ⚠️ **Partiellement fonctionnel** (HLS incomplet)
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/engine.rs`
|
||
|
|
- `TranscodingEngine` avec:
|
||
|
|
- Queue prioritaire (capacité 1000)
|
||
|
|
- Worker pool (configurable)
|
||
|
|
- Méthode `start()` qui lance les workers en arrière-plan
|
||
|
|
- Méthode `submit()` pour enqueue un job
|
||
|
|
- **État**: ⚠️ **Partiellement fonctionnel** (pas de notification de résultats)
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/codecs/profiles.rs`
|
||
|
|
- `QualityProfile` avec profils prédéfinis:
|
||
|
|
- `hi_res()`: 320kbps, 48kHz, Stereo, AAC
|
||
|
|
- `high()`: 192kbps, 44.1kHz, Stereo, AAC
|
||
|
|
- `medium()`: 128kbps, 44.1kHz, Stereo, AAC
|
||
|
|
- `low()`: 64kbps, 22.05kHz, Mono, AAC
|
||
|
|
- Tous configurés pour HLS avec `hls_segment_time: Some(6)`
|
||
|
|
- **État**: ✅ **Fonctionnel**
|
||
|
|
|
||
|
|
#### ✅ `src/transcoding/codecs/mod.rs`
|
||
|
|
- Enum `AudioCodec`: MP3, AAC, OPUS, FLAC, WAV
|
||
|
|
- Enum `ContainerFormat`: MP3, MP4, OGG, FLAC, WAV, HLS
|
||
|
|
- Implémentation `Display` pour conversion en noms FFmpeg
|
||
|
|
- **État**: ✅ **Fonctionnel**
|
||
|
|
|
||
|
|
### 1.2 Ce qui est déclaré comme TODO
|
||
|
|
|
||
|
|
#### ❌ `src/core/encoder.rs` (ligne 253)
|
||
|
|
```rust
|
||
|
|
// TODO: Implémentation réelle des encodeurs
|
||
|
|
```
|
||
|
|
- Pool d'encodeurs initialisé mais **vide**
|
||
|
|
- Aucun encodeur réel (Opus, AAC, MP3, FLAC) n'est instancié
|
||
|
|
|
||
|
|
#### ❌ `src/core/encoder.rs` (ligne 459)
|
||
|
|
```rust
|
||
|
|
// TODO: Implémenter le thread de traitement en temps réel
|
||
|
|
```
|
||
|
|
- `EncoderPipeline::start_processing()` ne fait rien
|
||
|
|
- Aucun traitement audio réel
|
||
|
|
|
||
|
|
#### ⚠️ `src/transcoding/pipeline/worker.rs` (ligne 74)
|
||
|
|
```rust
|
||
|
|
// TODO: Kill process ? Command::status() wait for completion.
|
||
|
|
```
|
||
|
|
- En cas de timeout, le processus FFmpeg n'est pas tué
|
||
|
|
- Risque de fuite de processus
|
||
|
|
|
||
|
|
#### ⚠️ `src/transcoding/engine.rs` (ligne 38)
|
||
|
|
```rust
|
||
|
|
// TODO: Notifier le résultat via EventBus ou Callback
|
||
|
|
```
|
||
|
|
- Les résultats des jobs ne sont pas notifiés
|
||
|
|
- Pas de callback pour mettre à jour l'état
|
||
|
|
|
||
|
|
### 1.3 Ce qui est incorrect ou incohérent
|
||
|
|
|
||
|
|
#### 🔴 Problème majeur: Routes API manquantes
|
||
|
|
- **Aucune route** `/v1/stream/transcode` dans `main.rs`
|
||
|
|
- **Aucune route** `/v1/stream/job/{id}` pour récupérer l'état
|
||
|
|
- **Aucune route** `/v1/stream/hls/{job_id}/index.m3u8` pour servir HLS
|
||
|
|
- La route `/internal/jobs/transcode` existe mais utilise `compression_engine` au lieu de `transcoding_engine`
|
||
|
|
|
||
|
|
#### 🔴 Problème: TranscodingEngine non intégré dans AppState
|
||
|
|
- `AppState` ne contient **pas** de `TranscodingEngine`
|
||
|
|
- Impossible d'accéder au moteur depuis les routes
|
||
|
|
|
||
|
|
#### 🔴 Problème: Command Builder HLS incomplet
|
||
|
|
- Le builder génère `segment_%05d.ts` mais ne configure pas correctement:
|
||
|
|
- Le pattern de nommage des segments
|
||
|
|
- La structure du répertoire de sortie
|
||
|
|
- Le manifest HLS (`index.m3u8`) n'est pas correctement configuré
|
||
|
|
|
||
|
|
#### ⚠️ Problème: Pas de stockage d'état des jobs
|
||
|
|
- Les jobs sont traités mais leur état n'est **pas persisté**
|
||
|
|
- Impossible de récupérer l'état d'un job après soumission
|
||
|
|
- Pas de base de données ou de cache pour stocker les jobs
|
||
|
|
|
||
|
|
#### ⚠️ Problème: Worker ne met pas à jour le job correctement
|
||
|
|
- Le worker retourne un `TranscodingJob` modifié mais:
|
||
|
|
- Il n'est pas stocké nulle part
|
||
|
|
- L'appelant ne peut pas récupérer le résultat
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. MANQUES FONCTIONNELS CRITIQUES (P0)
|
||
|
|
|
||
|
|
### 2.1 FFmpeg non utilisé correctement
|
||
|
|
- ❌ Le command builder génère des commandes mais:
|
||
|
|
- Le format HLS n'est pas complet (manque `-hls_list_size 0` pour VOD)
|
||
|
|
- Pas de gestion des segments existants
|
||
|
|
- Pas de validation que FFmpeg est installé
|
||
|
|
|
||
|
|
### 2.2 Pipeline inactif
|
||
|
|
- ❌ Le `TranscodingEngine` n'est **jamais démarré** dans `main.rs`
|
||
|
|
- ❌ Aucun job n'est jamais soumis
|
||
|
|
- ❌ Les workers tournent mais ne traitent rien
|
||
|
|
|
||
|
|
### 2.3 Absence de retour asynchrone
|
||
|
|
- ❌ Pas de mécanisme pour:
|
||
|
|
- Récupérer l'état d'un job après soumission
|
||
|
|
- Recevoir une notification quand un job est terminé
|
||
|
|
- Gérer les erreurs de manière centralisée
|
||
|
|
|
||
|
|
### 2.4 Absence d'événements d'état
|
||
|
|
- ❌ Pas de transitions d'état visibles:
|
||
|
|
- `Queued → Processing → Done`
|
||
|
|
- `Queued → Processing → Error`
|
||
|
|
- ❌ Pas de logs structurés pour suivre les jobs
|
||
|
|
|
||
|
|
### 2.5 Dossier d'output HLS non structuré
|
||
|
|
- ❌ Pas de structure claire pour les outputs:
|
||
|
|
- Où sont stockés les segments `.ts`?
|
||
|
|
- Où est le manifest `index.m3u8`?
|
||
|
|
- Comment servir les fichiers via HTTP?
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. CONTRAT MANQUANT
|
||
|
|
|
||
|
|
### 3.1 API REST incomplète
|
||
|
|
|
||
|
|
#### ❌ POST `/v1/stream/transcode`
|
||
|
|
**Manquant**: Route pour upload + paramètres de transcodage
|
||
|
|
- Input: `file` (multipart), `codec`, `bitrate`, `quality_profile`
|
||
|
|
- Output: `{ "job_id": "uuid", "status": "queued" }`
|
||
|
|
|
||
|
|
#### ❌ GET `/v1/stream/job/{id}`
|
||
|
|
**Manquant**: Route pour récupérer l'état d'un job
|
||
|
|
- Output: `{ "id": "uuid", "status": "processing", "progress": 45.5, ... }`
|
||
|
|
|
||
|
|
#### ❌ GET `/v1/stream/hls/{job_id}/index.m3u8`
|
||
|
|
**Manquant**: Route pour servir le manifest HLS
|
||
|
|
- Output: Contenu du fichier `index.m3u8`
|
||
|
|
|
||
|
|
#### ❌ GET `/v1/stream/hls/{job_id}/{segment}`
|
||
|
|
**Manquant**: Route pour servir les segments `.ts`
|
||
|
|
- Output: Contenu binaire du segment
|
||
|
|
|
||
|
|
### 3.2 Absence d'API pour récupérer l'état du transcodage
|
||
|
|
- Pas de mécanisme pour:
|
||
|
|
- Lister tous les jobs
|
||
|
|
- Filtrer par statut
|
||
|
|
- Récupérer l'historique
|
||
|
|
|
||
|
|
### 3.3 Manque de dossier d'output structuré HLS
|
||
|
|
- Structure attendue:
|
||
|
|
```
|
||
|
|
output_dir/
|
||
|
|
{job_id}/
|
||
|
|
index.m3u8 # Master playlist
|
||
|
|
segment_00001.ts
|
||
|
|
segment_00002.ts
|
||
|
|
...
|
||
|
|
```
|
||
|
|
- Actuellement: **Non défini**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. RÉSUMÉ DES BLOQUANTS P0
|
||
|
|
|
||
|
|
| Bloquant | Fichier | Description | Impact |
|
||
|
|
|----------|---------|------------|--------|
|
||
|
|
| 🔴 **P0** | `main.rs` | TranscodingEngine non initialisé dans AppState | Aucun transcodage possible |
|
||
|
|
| 🔴 **P0** | `main.rs` | Routes API `/v1/stream/transcode` et `/v1/stream/job/{id}` manquantes | Impossible de soumettre/récupérer des jobs |
|
||
|
|
| 🔴 **P0** | `src/transcoding/engine.rs` | Pas de stockage d'état des jobs | Impossible de suivre l'état |
|
||
|
|
| 🔴 **P0** | `src/transcoding/pipeline/worker.rs` | FFmpeg timeout ne tue pas le processus | Fuite de ressources |
|
||
|
|
| 🔴 **P0** | `src/transcoding/ffmpeg/command_builder.rs` | Configuration HLS incomplète | Segments mal générés |
|
||
|
|
| 🟠 **P1** | `src/core/encoder.rs` | Pool d'encodeurs vide | Pas d'encodage natif (mais FFmpeg fonctionne) |
|
||
|
|
| 🟠 **P1** | `src/transcoding/engine.rs` | Pas de notification de résultats | Pas de callback/EventBus |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. RECOMMANDATIONS
|
||
|
|
|
||
|
|
### 5.1 Actions immédiates (P0)
|
||
|
|
1. ✅ Intégrer `TranscodingEngine` dans `AppState`
|
||
|
|
2. ✅ Créer routes API `/v1/stream/transcode` et `/v1/stream/job/{id}`
|
||
|
|
3. ✅ Implémenter stockage d'état des jobs (HashMap en mémoire pour P0)
|
||
|
|
4. ✅ Compléter command builder HLS
|
||
|
|
5. ✅ Fixer timeout FFmpeg (kill process)
|
||
|
|
|
||
|
|
### 5.2 Actions secondaires (P1)
|
||
|
|
1. Implémenter notification de résultats (EventBus ou callback)
|
||
|
|
2. Ajouter validation FFmpeg installé
|
||
|
|
3. Structurer dossier output HLS
|
||
|
|
4. Ajouter logs structurés
|
||
|
|
|
||
|
|
### 5.3 Actions futures (P2)
|
||
|
|
1. Implémenter encodeurs natifs (Opus, AAC) dans `encoder.rs`
|
||
|
|
2. Ajouter support multi-bitrate adaptatif
|
||
|
|
3. Persister jobs en base de données
|
||
|
|
4. Ajouter métriques Prometheus pour jobs
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Prochaine étape**: Phase 2 - Design du pipeline minimal mais robuste
|
||
|
|
|