Convertir MP3 en MP4 avec PHP & FFmpeg (Exemple de Code)
Utilisation du wrapper PHP spatie/ffmpeg (package composer) pour contrôle FFmpeg propre et orienté objet.
Prérequis
- PHP 8.0+
- Composer
- FFmpeg installé sur serveur (
ffmpeg -versionfonctionne en CLI). - Package composer :
composer require spatie/ffmpeg
Script de Conversion Basique
<?php require 'vendor/autoload.php'; use Spatie\Ffmpeg\Ffmpeg; use Spatie\Ffmpeg\Exception\ConversionFailedException; try { $ffmpeg = Ffmpeg::create(); $output = $ffmpeg->input('/path/to/input.mp3') ->output('/path/to/output.mp4') ->addArguments(['-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'aac', '-b:a', '192k', '-pix_fmt', 'yuv420p', '-shortest']) ->convert(); echo "Conversion réussie. Sortie: {$output->getPathname()}"; } catch (ConversionFailedException $e) { echo "Échec conversion: {$e->getMessage()}"; // $e->getCommand() pour debug } ?>
Arguments Clés Expliqués
-c:v libx264: Encode vidéo en H.264 (standard MP4).-tune stillimage: Optimise pour image statique (pochette album) — fichier minuscule, encodage rapide.-c:a aac -b:a 192k: Ré-encode audio en AAC 192 kbps (standard MP4).-pix_fmt yuv420p: Assure compatibilité lecteurs large.-shortest: Stoppe quand flux le plus court se termine (audio).
Ajouter Pochette Album (Piste Vidéo)
$ffmpeg->input('/path/to/input.mp3') ->input('/path/to/cover.jpg') ->output('/path/to/output.mp4') ->addArguments([ '-map', '0:a', '-map', '1:v', '-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'copy', // garde audio original '-pix_fmt', 'yuv420p', '-shortest', '-disposition:v', 'attached_pic' // marque comme pochette ]) ->convert();
Considérations Production
- Validez chemins : Assurez existence entrée, dossier sortie accessible en écriture.
- Timeouts : Définissez PHP
max_execution_timeou utilisez asynchrone (file d'attente/worker). - Sécurité : Assainissez noms fichiers ; ne passez jamais entrée utilisateur direct au shell.
- Limites ressources : FFmpeg utilise CPU/RAM ; surveillez sur mutualisé.
- Gestion erreurs : Attrapez
ConversionFailedException; loggez$e->getCommand().
Alternative : Symfony Process (Sans Wrapper)
use Symfony\Component\Process\Process; $process = new Process([ 'ffmpeg', '-y', '-i', '/path/to/input.mp3', '-c:v', 'libx264', '-tune', 'stillimage', '-c:a', 'aac', '-b:a', '192k', '-pix_fmt', 'yuv420p', '-shortest', '/path/to/output.mp4' ]); $process->mustRun(); // lance exception si échec
Utilisez le wrapper pour maintenabilité ; Process brut pour microservices sans dépendance.
