← Tutti gli articoliPHP e database

PHP e database

Come ottenere la durata di un mp3 con php

Matteo Galacci ·

Prerequisiti per la prova: PHP 8 CLI e FFmpeg. Su Debian/Ubuntu puoi installarli con sudo apt install php-cli ffmpeg. Controlla php -v e ffprobe -version.

Per ottenere una durata numerica puoi usare ffprobe, distribuito con FFmpeg. Questo esempio per PHP 8 e Linux accetta soltanto un file locale leggibile e avvia il programma senza una shell:

function mp3Duration(string $file): float
{
    $path = realpath($file);
    if ($path === false || !is_file($path) || !is_readable($path)) {
        throw new InvalidArgumentException('File non leggibile');
    }
    $process = proc_open(
        ['ffprobe', '-v', 'error', '-show_entries', 'format=duration',
         '-of', 'default=noprint_wrappers=1:nokey=1', $path],
        [0 => ['file', '/dev/null', 'r'], 1 => ['pipe', 'w'],
         2 => ['file', '/dev/null', 'w']], $pipes
    );
    if (!is_resource($process)) {
        throw new RuntimeException('Impossibile avviare ffprobe');
    }
    $value = trim(stream_get_contents($pipes[1]));
    fclose($pipes[1]);
    $exit = proc_close($process);
    if ($exit !== 0 || !is_numeric($value) || !is_finite((float) $value)
        || (float) $value < 0) {
        throw new RuntimeException('Durata non disponibile');
    }
    return (float) $value;
}

Il risultato è espresso in secondi, anche frazionari. Per file danneggiati o determinati MP3 può essere una stima. Il controllo del percorso non autorizza automaticamente l’accesso: in un’applicazione web limita i file a una directory consentita, verifica gli upload e imponi un timeout al processo. Non esporre questa funzione come esecutore di file arbitrari.

Esegui la funzione

Salva la funzione in durata.php, iniziando il file con <?php. Alla fine aggiungi:

try {
    printf("Durata: %.2f secondi\n", mp3Duration(__DIR__ . '/brano.mp3'));
} catch (Throwable $error) {
    fwrite(STDERR, $error->getMessage() . PHP_EOL);
    exit(1);
}

Metti un MP3 chiamato brano.mp3 accanto allo script ed esegui php durata.php. Confronta il valore con la durata del lettore audio. Se compare “Durata non disponibile”, prova ffprobe direttamente sul file: distinguerai un errore del media da un problema di avvio del programma.

Fonti e approfondimenti