Convertire MP3 in MP4 con PHP e FFmpeg (Esempio di Codice)
Utilizzo del wrapper PHP spatie/ffmpeg (pacchetto composer) per un controllo FFmpeg pulito e orientato agli oggetti.
Prerequisiti
- PHP 8.0+
- Composer
- FFmpeg installato sul server (
ffmpeg -versionfunziona in CLI). - Pacchetto composer:
composer require spatie/ffmpeg
Script di Conversione Base
<?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 "Conversione riuscita. Output: {$output->getPathname()}"; } catch (ConversionFailedException $e) { echo "Conversione fallita: {$e->getMessage()}"; // $e->getCommand() per debug } ?> Argomenti Chiave Spiegati
-c:v libx264: Codifica video come H.264 (standard MP4).-tune stillimage: Ottimizzato per immagine statica (copertina album) — file piccolo, codifica veloce.-c:a aac -b:a 192k: Ricodifica audio in AAC 192 kbps (standard MP4).-pix_fmt yuv420p: Garantisce ampia compatibilità con i lettori.-shortest: Si ferma quando termina lo stream più breve (audio).
Aggiungere Copertina Album (Traccia Video)
$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', // mantieni audio originale '-pix_fmt', 'yuv420p', '-shortest', '-disposition:v', 'attached_pic' // segna come copertina ]) ->convert(); Considerazioni per Produzione
- Valida percorsi: Assicurati che l'input esista, la directory di output sia scrivibile.
- Timeout: Imposta PHP
max_execution_timeo usa asincrono (coda/worker). - Sicurezza: Sanitizza nomi file; non passare mai input utente direttamente alla shell.
- Limiti risorse: FFmpeg usa CPU/RAM; monitora su hosting condiviso.
- Gestione errori: Cattura
ConversionFailedException; registra$e->getCommand().
Alternativa: Symfony Process (Senza 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(); // lancia eccezione in caso di fallimento Usa il wrapper per manutenibilità; Process puro per microservizi senza dipendenze.