2010-05-02 8 views
7

lý do tại sao trên một số tệp mp3 khi tôi gọi mime_content_type ($ mp3_file_path) đó là ứng dụng trả về/octet-stream?lý do tại sao một số mp3 trên ứng dụng trả về mime_content_type/octet-stream

tôi có điều này:

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: tôi tìm thấy một lớp đẹp ở đây:

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

+0

Có thể hiển thị một số mã? Hoặc một số ví dụ về các tệp như vậy? – lbedogni

Trả lời

2

application/octet-stream có lẽ mime_content_type s loại dự phòng khi thất bại trong việc nhận ra một tập tin .

MP3 trong trường hợp đó không phải là tệp MP3 thực, hoặc - nhiều khả năng - tệp là tệp MP3 thực, nhưng không chứa "byte ma thuật" mà hàm PHP sử dụng để nhận dạng định dạng - có thể vì đó là một định dạng phụ khác hoặc có bitrate biến hoặc bất kỳ thứ gì.

Bạn có thể thử xem getid3 có mang lại kết quả tốt hơn không. Tôi đã không bao giờ làm việc với nó nhưng nó trông giống như một thư viện khá khỏe mạnh để có được rất nhiều thông tin trong số các tập tin đa phương tiện.

Nếu bạn có quyền truy cập vào cấu hình của PHP, bạn cũng có thể sử dụng change the mime.magic file PHP, mặc dù tôi không biết liệu tệp tồn tại tốt hơn có thể phát hiện các tệp MP3 của bạn hay không. (Tệp mime.magic là tệp chứa tất cả các chuỗi byte mà mime_content_type sử dụng để nhận dạng một số loại tệp nhất định.)

+1

Tôi đã có một cơ hội để đào sâu vào getid3 và nếu tôi nhớ chính xác nó bật ra rằng nó chỉ ra các định dạng tập tin bằng phần mở rộng mà thôi. – jayarjo

8

Tệp MP3 là một con thú lạ khi xác định chúng. Bạn có thể có một MP3 được lưu trữ với một thùng chứa .wav. Có thể có tiêu đề ID3v2 ở đầu tệp. Bạn có thể nhúng MP3 một cách cơ bản trong bất kỳ tệp nào.

Cách duy nhất để phát hiện chúng một cách đáng tin cậy là phân tích cú pháp từ từ thông qua tệp và cố gắng tìm thứ gì đó trông giống như một khung MP3. Khung là đơn vị nhỏ nhất của dữ liệu MP3 hợp lệ có thể, và đại diện cho (mất bộ nhớ) 0,028 giây của âm thanh. Kích thước của khung hình thay đổi dựa trên tỷ lệ bitrate và tỷ lệ lấy mẫu, vì vậy bạn không thể chỉ lấy tỷ lệ bitrate/mẫu của khung hình đầu tiên và giả sử tất cả các khung khác sẽ có cùng kích thước - một VBR mp3 phải được phân tích toàn bộ để tính toán tổng thời gian chơi.

Tất cả điều này sẽ ghi lại việc nhận dạng một tệp MP3 bằng cách sử dụng tệp tin của PHP và các thông tin tương tự không đáng tin cậy vì dữ liệu MP3 thực sự có thể bắt đầu bất kỳ trong một tệp. fileinfo chỉ nhìn vào kilobyte đầu tiên hoặc hai dữ liệu, vì vậy nếu nó nói nó không phải là một MP3, nó có thể rất tốt được nói dối bởi vì dữ liệu bắt đầu hơi xa hơn.

+2

vậy giải pháp là gì? –