почему на некотором mp3s файле, когда я называю mime_content_type ($mp3_file_path), это - возврат application/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
Файлы MP3 - странный зверь, когда дело доходит до их идентификации. Вы можете хранить MP3 в контейнере .wav. В начале файла может быть заголовок ID3v2. Вы можете встроить MP3 практически в любой файл.
Единственный способ надежно их обнаружить - это медленно проанализировать файл и попытаться найти что-то похожее на фрейм MP3.Кадр - это наименьшая возможная единица достоверных данных MP3, представляющая (выходящая из памяти) 0,028 секунды звука. Размер кадра зависит от битрейта и частоты дискретизации, поэтому вы не можете просто получить битрейт / частоту дискретизации первого кадра и предположить, что все остальные кадры будут того же размера - VBR mp3 должен быть проанализирован полностью для расчета общего времени воспроизведения.
Все это сводится к тому, что идентификация MP3 с использованием PHP fileinfo и т.п. ненадежна, поскольку фактические данные MP3 могут начинаться в любом месте файла. fileinfo просматривает только первые или два килобайта данных, поэтому, если он говорит, что это не MP3, он вполне может лгать, потому что данные начинаются немного дальше.
application/octet-stream
, вероятно, является mime_content_type
запасным типом, когда он не может распознать файл.
MP3 в этом случае либо не является настоящим MP3 файлом, либо - что более вероятно - файл является настоящим MP3 файлом, но не содержит "волшебных байтов", которые функция PHP использует для распознавания формата - возможно, потому что это другой подформат или имеет переменный битрейт или что-то еще.
Вы можете попробовать, дает ли getid3 лучшие результаты. Я никогда не работал с ней, но она выглядит как довольно полезная библиотека для получения большого количества информации из мультимедийных файлов.
Если у вас есть доступ к конфигурации PHP, вы также можете изменить mime.magic
файл, который использует PHP, хотя я понятия не имею, существует ли лучший файл, способный определить ваши MP3. (Файл mime.magic
- это файл, содержащий все последовательности байтов, которые mime_content_type
использует для распознавания определенных типов файлов)