2012-07-06 41 views
9

Tôi đang viết thư viện C++ để giải mã và mã hóa âm thanh giữa các định dạng/codec khác nhau. Tôi có một thói quen để nhanh chóng phát hiện các định dạng trước khi tải thư viện codec yêu cầu.Phát hiện nếu tập tin là MP3

Đối với các tệp WAV, người dùng có thể dễ dàng tìm kiếm các giá trị ASCII "RIFF" và "WAVE" ở đầu tệp. Điều tương tự cũng áp dụng cho FLAC, chúng ta chỉ cần đọc trong 4 byte đầu tiên, sẽ là "fLaC".

Nhưng làm cách nào để nhanh chóng phát hiện xem tệp có phải là MP3 không? Tôi không thể dựa vào phần mở rộng tập tin. Tôi cũng không thể giải mã khung MP3 đầu tiên, vì có thể có thêm dữ liệu ở đầu tệp (ví dụ: ID3, ảnh bìa, v.v.).

Trả lời

19

Phát hiện xem tệp có phải là một tệp MP3 phức tạp hơn tìm kiếm mẫu cố định trong tệp hay không.

Some concepts

(Xem http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header để biết chi tiết)

  • tập tin MP3 bao gồm một loạt các khung và mỗi frame có tiêu đề ở đầu.
  • Tiêu đề bắt đầu ở ranh giới byte với từ đồng bộ 11 bit, tất cả là 1s. Do đó từ đồng bộ là 0xFFE hoặc 0XFFF.
  • Độ dài của mỗi khung được tính toán dựa trên các thông số tiêu đề.

Algorithm to determine if a file is MP3 or not

  • Tìm kiếm các syncword trong file (0xFFF hoặc 0xFFE).
  • Phân tích cú pháp các thông số tiêu đề.
  • Xác định độ dài khung bằng các tham số tiêu đề.
  • Tìm kiếm khung tiếp theo bằng độ dài khung.
  • Nếu bạn tìm thấy một từ đồng bộ khác sau khi tìm kiếm, thì tệp hầu như là tệp MP3.
  • Để chắc chắn, hãy lặp lại quy trình để tìm các khung hình MP3 liên tiếp. N có thể được tăng lên để đạt được tỷ lệ truy cập tốt hơn.
-3

Tôi chỉ kiểm tra chữ ký như trong thử nghiệm sóng và flac hiện tại của bạn.
Một tệp mp3 should have this in hex:
0x49, 0x44, 0x33
Nó hoạt động đối với một số tệp tôi có. Tôi không chắc chắn nếu nó hoạt động trong mọi trường hợp vì vậy một giải pháp phức tạp hơn như câu trả lời của Oak Bytes có thể được yêu cầu.

+2

Chuỗi byte bạn đề xuất ('I'' '' '') là một phần của tiêu đề cho thẻ siêu dữ liệu ID3 (v2) nhưng không phải tất cả các tệp MP3 sẽ có thẻ ID3v2 (và thẻ ID3v2.4 có thể là ở cuối tệp thay vì bắt đầu). – Deltics

Các vấn đề liên quan