почему некоторые mp3-файлы на mime_content_type возвращают application / octet-stream - PullRequest
7 голосов
/ 02 мая 2010

почему в некоторых файлах mp3s, когда я вызываю mime_content_type ($ mp3_file_path), он возвращает приложение / октет-поток?

У меня есть это:

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: я нашел хороший класс здесь:

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

Ответы [ 2 ]

9 голосов
/ 03 мая 2010

MP3-файлы - странный зверь, когда дело доходит до их идентификации. Вы можете сохранить MP3 в контейнере .wav. В начале файла может быть заголовок ID3v2. Вы можете встроить MP3 по существу в любой файл.

Единственный способ их надежного обнаружения - это медленный анализ файла и попытка найти что-то, похожее на фрейм MP3. Кадр - это наименьшая возможная единица допустимых данных MP3, и он представляет (без памяти) 0,028 секунды звука. Размер кадра варьируется в зависимости от битрейта и частоты дискретизации, поэтому вы не можете просто получить битрейт / частоту дискретизации первого кадра и предположить, что все остальные кадры будут одинакового размера - VBR mp3 должен быть проанализирован полностью рассчитать общее время игры.

Все это сводится к тому, что идентификация MP3 с использованием PHP fileinfo и т. П. Не является надежной, поскольку фактические данные MP3 могут начинаться ВСЕГДА в файле. fileinfo просматривает только первый килобайт или два данных, поэтому, если он говорит, что это не MP3, он вполне может лежать, потому что данные начинаются немного дальше.

2 голосов
/ 02 мая 2010

application/octet-stream, вероятно, является mime_content_type резервным типом, когда он не может распознать файл.

В этом случае MP3 - это не настоящий файл MP3, или, что более вероятно, файл представляет собой настоящий файл MP3, но не содержит «магических байтов», которые функция PHP использует для распознавания формата - возможно, потому, что это другой подформат или имеет переменный битрейт или что-то еще.

Вы можете попробовать, дает ли getid3 лучшие результаты. Я никогда не работал с ним, но похоже, что это довольно полезная библиотека для получения большого количества информации из мультимедийных файлов.

Если у вас есть доступ к конфигурации PHP, вы также можете изменить mime.magic файл , который использует PHP, хотя я понятия не имею, существует ли лучший файл, способный обнаружить ваши MP3. (Файл mime.magic - это файл, содержащий все последовательности байтов, которые mime_content_type использует для распознавания определенных типов файлов.)

...