почему некоторые mp3s на mime_content_type возвращают application/octet-stream

почему на некотором 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

7
задан robertdd 2 May 2010 в 20:10
поделиться

2 ответа

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

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

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

9
ответ дан 6 December 2019 в 23:02
поделиться

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

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

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

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

.
2
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: