# 🎬 Commandes FFmpeg - Documentation technique **Date**: 2025-01-27 **Version**: 0.2.0 --- ## Vue d'ensemble Ce document décrit les commandes FFmpeg générées par le `FfmpegCommandBuilder` pour chaque codec et format de sortie. --- ## Format HLS (HTTP Live Streaming) ### Structure générale Toutes les commandes HLS suivent cette structure: ```bash ffmpeg -y \ -hide_banner \ -nostats \ -i {input_file} \ -c:a {codec} \ -b:a {bitrate} \ -ar {sample_rate} \ -ac {channels} \ -f hls \ -hls_time {segment_duration} \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename {segment_pattern} \ {output_playlist} ``` ### Options HLS - `-f hls`: Format de sortie HLS - `-hls_time {seconds}`: Durée de chaque segment (défaut: 6 secondes) - `-hls_playlist_type vod`: Type VOD (Video On Demand) - liste complète - `-hls_list_size 0`: Liste complète des segments (0 = tous) - `-hls_segment_filename {pattern}`: Pattern de nommage des segments --- ## Codecs supportés ### AAC (Advanced Audio Coding) **Commande complète**: ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a aac \ -b:a 192000 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` **Paramètres**: - Codec: `aac` (encodeur natif FFmpeg) - Bitrate: 64-320 kbps (selon profil) - Sample rate: 22.05-48 kHz - Channels: 1 (mono) ou 2 (stéréo) **Avantages**: - Compatibilité maximale (iOS, Safari, Chrome, Firefox) - Bonne qualité à bas débit - Support HE-AAC pour très bas débit --- ### MP3 (MPEG-1 Audio Layer 3) **Commande complète**: ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a libmp3lame \ -b:a 192000 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` **Paramètres**: - Codec: `libmp3lame` (encodeur LAME) - Bitrate: 64-320 kbps - Sample rate: 44.1 kHz (standard) - Channels: 2 (stéréo) **Avantages**: - Compatibilité universelle - Support VBR (Variable Bitrate) - Qualité acceptable à 192+ kbps **Limitations**: - Pas de support natif dans certains navigateurs modernes - Qualité inférieure à AAC à même bitrate --- ### Opus **Commande complète**: ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a libopus \ -b:a 192000 \ -ar 48000 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` **Paramètres**: - Codec: `libopus` (encodeur Opus) - Bitrate: 64-320 kbps - Sample rate: 48 kHz (recommandé) - Channels: 2 (stéréo) **Avantages**: - Excellente qualité à bas débit - Latence très faible - Support natif dans Chrome, Firefox, Edge **Limitations**: - Pas de support natif dans Safari/iOS (nécessite WebM) - HLS avec Opus nécessite container WebM (non standard) **Note**: Pour HLS standard, Opus n'est pas recommandé. Utiliser AAC à la place. --- ### FLAC (Free Lossless Audio Codec) **Commande complète**: ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a flac \ -compression_level 5 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` **Paramètres**: - Codec: `flac` (lossless) - Compression level: 0-8 (5 = équilibre vitesse/compression) - Sample rate: 44.1-96 kHz - Channels: 2 (stéréo) **Avantages**: - Qualité lossless (sans perte) - Compression efficace - Support métadonnées **Limitations**: - Taille de fichiers importante - Pas de support natif dans tous les navigateurs - HLS avec FLAC non standard (utiliser MP4/FLAC à la place) **Note**: Pour HLS, FLAC n'est pas recommandé. Utiliser AAC haute qualité ou MP3 à la place. --- ## Patterns de nommage ### Segments Le pattern `segment_%05d.ts` génère: - `segment_00001.ts` - `segment_00002.ts` - `segment_00003.ts` - ... **Format**: `%05d` = 5 chiffres avec zéros à gauche ### Playlist Le fichier playlist est toujours nommé `index.m3u8` dans le répertoire de sortie. --- ## Options globales ### `-y` Écrase les fichiers existants sans demander confirmation. ### `-hide_banner` Masque la bannière d'information FFmpeg. ### `-nostats` Désactive l'affichage des statistiques (on parse manuellement si besoin). ### `-i {input_file}` Fichier d'entrée (WAV, MP3, FLAC, etc.). --- ## Options audio ### `-c:a {codec}` Codec audio à utiliser. ### `-b:a {bitrate}` Bitrate audio en bps (bits par seconde). **Exemples**: - `-b:a 64000` = 64 kbps - `-b:a 128000` = 128 kbps - `-b:a 192000` = 192 kbps - `-b:a 320000` = 320 kbps ### `-ar {sample_rate}` Sample rate (fréquence d'échantillonnage) en Hz. **Valeurs courantes**: - `22050` = 22.05 kHz (qualité téléphone) - `44100` = 44.1 kHz (qualité CD) - `48000` = 48 kHz (qualité professionnelle) ### `-ac {channels}` Nombre de canaux. **Valeurs**: - `1` = Mono - `2` = Stéréo --- ## Validation et erreurs ### Vérification FFmpeg installé ```bash ffmpeg -version ``` ### Test de commande ```bash ffmpeg -y -hide_banner -nostats \ -i test.wav \ -c:a aac \ -b:a 192000 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` ### Erreurs communes 1. **Codec non disponible**: Installer les codecs manquants ```bash # Ubuntu/Debian sudo apt-get install ffmpeg libavcodec-extra ``` 2. **Fichier d'entrée invalide**: Vérifier le format et l'intégrité ```bash ffprobe input.wav ``` 3. **Répertoire de sortie inaccessible**: Vérifier les permissions ```bash chmod 755 output_dir ``` --- ## Optimisations ### Qualité vs Vitesse - **Vitesse**: `-preset fast` (non utilisé actuellement, à ajouter) - **Qualité**: Multi-pass encoding (non implémenté P0) ### Parallélisation FFmpeg utilise automatiquement tous les cores disponibles pour l'encodage. ### Mémoire - **Buffer size**: Ajustable via `-bufsize` (non utilisé actuellement) - **Threads**: Ajustable via `-threads` (auto par défaut) --- ## Exemples par profil ### Profil "high" (192 kbps AAC) ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a aac \ -b:a 192000 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` ### Profil "medium" (128 kbps AAC) ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a aac \ -b:a 128000 \ -ar 44100 \ -ac 2 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` ### Profil "low" (64 kbps AAC mono) ```bash ffmpeg -y -hide_banner -nostats \ -i input.wav \ -c:a aac \ -b:a 64000 \ -ar 22050 \ -ac 1 \ -f hls \ -hls_time 6 \ -hls_playlist_type vod \ -hls_list_size 0 \ -hls_segment_filename segment_%05d.ts \ index.m3u8 ``` --- ## Références - [FFmpeg Documentation](https://ffmpeg.org/documentation.html) - [HLS Specification](https://tools.ietf.org/html/rfc8216) - [AAC Encoding Guide](https://trac.ffmpeg.org/wiki/Encode/AAC) - [MP3 Encoding Guide](https://trac.ffmpeg.org/wiki/Encode/MP3) --- **Note**: Pour des optimisations avancées (multi-pass, hardware acceleration), voir la roadmap P1/P2.