2010-06-03 150 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/