2010-05-02 47 views
7

爲什麼在某些mp3文件上當我調用mime_content_type($ mp3_file_path)時它返回application/octet-stream?爲什麼mime_content_type上的一些mp3會返回應用程序/ octet-stream

我有這樣的:

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"); 
    } 
} 

編輯: 我找到了一個不錯的類此:

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

+0

也許顯示一些代碼?或者這樣的文件的一些例子? – lbedogni 2010-05-02 19:50:14

回答

2

application/octet-stream可能是mime_content_type■當它無法識別文件後備式。

這種情況下的MP3要麼不是真正的MP3文件,要麼更可能 - 該文件是真正的MP3文件,但不包含PHP函數用來識別格式的「魔術字節」 - 可能是因爲它是一個不同的子格式或具有可變比特率或其他。

您可以試試getid3是否爲您提供更好的結果。我從來沒有使用它,但它看起來像一個非常健康的圖書館,從多媒體文件中獲取大量信息。

如果您有權訪問PHP的配置,您可能也可以使用change the mime.magic file PHP,儘管我不知道是否存在能夠檢測您的MP3的更好文件。 (mime.magic文件是包含mime_content_type用於識別某些文件類型的所有字節序列的文件。)

+1

我有機會深入挖掘getid3,如果我沒有記錯的話,事實證明它只是通過擴展來計算文件格式。 – jayarjo 2010-06-24 16:54:28

8

在識別它們時,MP3文件是一種奇怪的東西。您可以將MP3與.wav容器一起存儲。在文件的開頭可以有一個ID3v2頭。您可以在任何文件中嵌入MP3。

要可靠地檢測它們的唯一方法是通過文件緩慢解析並嘗試找到看起來像MP3幀的內容。幀是可能的有效MP3數據的最小單位,並表示(關閉內存)0.028秒的音頻。幀的大小根據比特率和採樣率而變化,因此您不能只抓取第一幀的比特率/採樣率,並假設所有其他幀都是相同的大小 - VBR mp3必須全部解析計算總播放時間。

所有這些歸結爲使用PHP的fileinfo等來識別MP3是不可靠的,因爲實際的MP3數據可以在任何地方在文件中開始。 fileinfo只會查看第一個或第二個數據,所以如果它說它不是MP3,它可能很好說謊,因爲數據開始稍微進一步。

+2

那麼解決方案是什麼? – 2016-03-31 08:09:07

相關問題