2010-05-02 6 views
7

perché su alcuni file mp3 quando chiamo mime_content_type ($ mp3_file_path) è return application/octet-stream?perché alcuni mp3 su mime_content_type restituiscono application/octet-stream

ho questo:

if (!empty($_FILES)) { 
    $tempFile = $_FILES['Filedata']['tmp_name']; 
    $image = getimagesize($tempFile); 
    $mp3_mimes = array('audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio'); 

    if (in_array(mime_content_type($tempFile), $mp3_mimes)) { 
     echo json_encode("mp3"); 
    } elseif ($image['mime']=='image/jpeg') { 
     echo json_encode("jpg"); 
    } else{ 
     echo json_encode("error"); 
    } 
} 

EDIT: ho trovato qui una bella classe:

http://www.zedwood.com/article/127/php-calculate-duration-of-mp3

+0

Forse mostrare un po 'di codice? O alcuni esempi di tali file? – lbedogni

risposta

2

application/octet-stream è probabilmente mime_content_type s tipo di ripiego quando non riesce a riconoscere un file .

L'MP3 in questo caso non è un vero file MP3, o - più probabilmente - il file è un vero file MP3, ma non contiene i "magic byte" che la funzione PHP usa per riconoscere il formato - forse perché è un sotto-formato diverso o ha un bitrate variabile o altro.

Si può provare se getid3 offre risultati migliori. Non ho mai lavorato con esso, ma sembra una libreria abbastanza salutare per ottenere molte informazioni dai file multimediali.

Se si ha accesso alla configurazione di PHP, si può anche essere in grado di utilizzare change the mime.magic file PHP, anche se non ho idea se esista un file migliore che sia in grado di rilevare i tuoi MP3. (Il file mime.magic è il file contenente tutte le sequenze di byte utilizzate da mime_content_type per riconoscere determinati tipi di file)

+1

Ho avuto la possibilità di scavare in getid3 e, se ricordo bene, è emerso che calcola solo i formati di file per estensione. – jayarjo

8

I file MP3 sono una strana bestia quando si tratta di identificarli. È possibile avere un MP3 memorizzato con un contenitore .wav. Ci può essere un'intestazione ID3v2 all'inizio del file. È possibile incorporare un MP3 essenzialmente all'interno di qualsiasi file.

L'unico modo per rilevarli in modo affidabile è analizzare lentamente il file e cercare di trovare qualcosa che assomigli a un frame MP3. Una cornice è la più piccola unità di dati MP3 valida e rappresenta (spegnendo la memoria) 0,028 secondi di audio. La dimensione del fotogramma varia in base al bitrate e alla frequenza di campionamento, quindi non puoi semplicemente prendere il bitrate/frequenza di campionamento del primo fotogramma e assumere che tutti gli altri fotogrammi abbiano le stesse dimensioni - un VBR mp3 deve essere analizzato nella sua interezza per calcolare il tempo di riproduzione totale.

Tutto ciò si riduce a quello che identifica un MP3 utilizzando il fileinfo di PHP e simili non è affidabile, poiché i dati MP3 effettivi possono iniziare OVUNQUE in un file. fileinfo guarda solo il primo kilobyte o due di dati, quindi se dice che non è un MP3, potrebbe benissimo mentire perché i dati iniziarono leggermente più avanti.

+2

quindi qual è la soluzione? –