2012-07-06 78 views
9

我正在編寫一個C++庫,用於解碼和編碼不同格式/編解碼器之間的音頻。在加載所需的編解碼器庫之前,我有一個快速檢測格式的例程。檢測文件是否爲MP3

對於WAV文件,可以簡單地在文件開頭查找ASCII值「RIFF」和「WAVE」。這同樣適用於FLAC,我們可以簡單地在前4個字節中讀取,這將是「fLaC」。

但是,如何快速檢測文件是否爲MP3?我不能依靠文件擴展名。我也不能嘗試解碼第一個MP3幀,因爲在文件開始時可能會有額外的數據(例如:ID3,封面圖像等)。

回答

19

檢測文件是否爲MP3比在文件中搜索固定模式更復雜。

Some concepts

(詳見http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header

  • MP3文件由一系列幀,和每幀在開頭的報頭。
  • 標題以11位同步字開始,字節邊界全爲1。因此同步字是0xFFE或0XFFF。
  • 根據標題參數計算每個幀的長度。

Algorithm to determine if a file is MP3 or not

  • 搜索文件(0xFFF的或0xFFE)在同步字。
  • 解析標題參數。
  • 使用頭部參數確定幀長度。
  • 使用幀長尋找下一幀。
  • 如果您在查找後發現另一個同步字,那麼該文件主要是一個MP3文件。
  • 可以肯定,重複該過程來查找連續N個MP3幀。 N可以增加以獲得更好的命中率。
-3

我只是在你現有的wave和flac測試中檢查簽名。
一個mp3文件should have this in hex
0x49, 0x44, 0x33
它適用於我有的一些文件。我不確定它是否適用於所有情況,因此可能需要更復雜的解決方案,如Oak Bytes的答案。

+2

您建議的字節序列('I''D''3')是ID3(v2)元數據標記標題的一部分,但不是所有的MP3文件都會有ID3v2標記(並且ID3v2.4標記可能是在文件末尾而不是開頭)。 – Deltics 2016-01-25 19:47:31