我正在編寫一個C++庫,用於解碼和編碼不同格式/編解碼器之間的音頻。在加載所需的編解碼器庫之前,我有一個快速檢測格式的例程。檢測文件是否爲MP3
對於WAV文件,可以簡單地在文件開頭查找ASCII值「RIFF」和「WAVE」。這同樣適用於FLAC,我們可以簡單地在前4個字節中讀取,這將是「fLaC」。
但是,如何快速檢測文件是否爲MP3?我不能依靠文件擴展名。我也不能嘗試解碼第一個MP3幀,因爲在文件開始時可能會有額外的數據(例如:ID3,封面圖像等)。
我正在編寫一個C++庫,用於解碼和編碼不同格式/編解碼器之間的音頻。在加載所需的編解碼器庫之前,我有一個快速檢測格式的例程。檢測文件是否爲MP3
對於WAV文件,可以簡單地在文件開頭查找ASCII值「RIFF」和「WAVE」。這同樣適用於FLAC,我們可以簡單地在前4個字節中讀取,這將是「fLaC」。
但是,如何快速檢測文件是否爲MP3?我不能依靠文件擴展名。我也不能嘗試解碼第一個MP3幀,因爲在文件開始時可能會有額外的數據(例如:ID3,封面圖像等)。
檢測文件是否爲MP3比在文件中搜索固定模式更復雜。
Some concepts
(詳見http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header)
Algorithm to determine if a file is MP3 or not
我只是在你現有的wave和flac測試中檢查簽名。
一個mp3文件should have this in hex:
0x49, 0x44, 0x33
它適用於我有的一些文件。我不確定它是否適用於所有情況,因此可能需要更復雜的解決方案,如Oak Bytes的答案。
您建議的字節序列('I''D''3')是ID3(v2)元數據標記標題的一部分,但不是所有的MP3文件都會有ID3v2標記(並且ID3v2.4標記可能是在文件末尾而不是開頭)。 – Deltics 2016-01-25 19:47:31