2010-06-03 100 views
13

我想用C++讀取MP3文件,我更願意爲此編寫自己的代碼。基本上要了解文件類型是如何工作的。我想讀取MP3文件的十六進制數據的所有位,並讓我的揚聲器播放它。 :)我不知道從哪裏開始,因爲我還不知道如何將數據實際存儲到MP3文件中。讀取MP3文件

感謝您的幫助

+10

如果你需要這樣問,我建議放棄自己寫的想法,而是使用一些庫。 – nothrow 2010-06-03 18:34:36

回答

17

您可以從here購買MP3格式的規格。這是約160EUR。

哦,順便說一下,它不是「十六進制數據」。如果你仍然指望任何非人類可讀的數據爲「十六進制」(這是一個數字系統),那麼首先探究涉及複雜解碼/編碼算法的二進制數據格式可能有點兒暫時對你而言太多了。

如何通過寫一個可以播放.wav文件的播放器開始? (任何合理的.wav文件,請注意,考慮到文件格式和不同的音頻格式)

+1

可購買規範與其他答案提供的鏈接之間有什麼區別? – Pindatjuh 2010-06-03 18:47:11

+0

對於以.wav文件開頭的建議+1 – 2010-06-03 18:47:54

+1

@Pindatjuh:我會說完整性(可能在世界的某些地方,合法性)。另外,很多鏈接似乎都在討論文件格式(這是相當簡單的),而不是關於實際的解壓縮算法。 – 2010-06-03 18:48:17

4

那麼,這將是艱難的:)

無論如何,你的應用程序應該由兩個部分組成 - 減壓庫/程序和你的主後端,這將需要一些解壓縮DAT一塊並且實際上發揮它。

我會建議「數據壓縮」大衛·所羅門,以瞭解您的解碼器實際上應該。不幸的是,第二部分的變體太寬,無法用一句話來涵蓋它們。

您也可以嘗試調查一些開源mp3解碼器/解碼庫this one.

+1

+1推薦閱讀現有的代碼。 – 2010-06-03 18:34:44

5

我做了一些研究,也許它會幫助你。

文件結構

enter image description here MP3文件由多個MP3幀,其由一個報頭和一個數據塊組成。這個幀序列被稱爲基本流。幀不是獨立的項目(「字節庫」),因此不能在任意幀邊界上提取。 MP3數據塊包含頻率和幅度方面的(壓縮)音頻信息。該圖顯示MP3標頭由一個同步字組成,該同步字用於識別有效幀的開始。接下來是一個位,表示這是MPEG標準,兩位表示使用了第3層;因此MPEG-1音頻層3或MP3。之後,這些值將有所不同,具體取決於MP3文件。 ISO/IEC 11172-3定義了標題每個部分的值範圍以及標題的規範。今天的大多數MP3文件都包含ID3元數據,它在MP3幀之前或之後;如圖中所示。 LAME

LAME的

源代碼是一個MP3 libary,但它也是開源的,至極意味着你可以下載源代碼,並看看它。 http://sourceforge.net/projects/lame/files/lame/3.98.4/lame-3.98.4.tar.gz/download 我自己看了一下,它似乎是用C或C++編寫的,所以你很幸運。 如果您檢查LAME的源代碼並瞭解它的工作原理,也許您可​​以成功製作自己的MP3庫。請注意,LAME不是用於播放MP3文件的庫,而是用於對它們進行編碼。但是,因爲它創造了MP3而不是閱讀它們,我認爲這個結構應該更清晰一些,然後與任何其他MP3播放器庫一起使用。

MP3文件格式

解釋這也似乎可以解釋MP3是如何工作的相當好,但它是純理論的,所以你需要很大的耐心。 http://www.mp3-converter.com/mp3codec/