【发布时间】:2010-06-03 18:20:00
【问题描述】:
我想用 C++ 读取 MP3 文件,我更喜欢为此编写自己的代码。基本上是为了了解文件类型是如何工作的。我想读取 MP3 文件的所有十六进制数据位并让我的扬声器播放它。 :) 我不知道从哪里开始,因为我还不知道数据实际上是如何存储到 MP3 文件中的。
感谢您的帮助
【问题讨论】:
-
如果你需要这样问,我建议你放弃自己写的想法,而是使用一些库。
我想用 C++ 读取 MP3 文件,我更喜欢为此编写自己的代码。基本上是为了了解文件类型是如何工作的。我想读取 MP3 文件的所有十六进制数据位并让我的扬声器播放它。 :) 我不知道从哪里开始,因为我还不知道数据实际上是如何存储到 MP3 文件中的。
感谢您的帮助
【问题讨论】:
首先阅读structure on an mp3 file。然后,如果您仍然感兴趣,请在 how to decode the audio data in each frame 上找到一个很好的教程。它非常复杂,因此您需要有相当多的时间从头开始。
【讨论】:
您可以从here 购买 MP3 格式的规范。大约 160 欧元。
哦,顺便说一句,这不是“十六进制数据”。如果您仍然将任何非人类可读的数据称为“十六进制”(这是一个数字系统),那么首先钻研涉及复杂解码/编码算法的二进制数据格式可能有点暂时对你来说太多了。
从编写一个可以播放 .wav 文件的播放器开始怎么样? (任何合理的 .wav 文件,请注意,考虑到文件格式和不同的音频格式)
【讨论】:
我做了一些研究,也许对你有帮助。
文件结构
一个 MP3 文件由多个 MP3 帧组成,这些帧由一个头和一个数据块组成。这个帧序列称为基本流。帧不是独立的项目(“字节库”),因此不能在任意帧边界上提取。 MP3 数据块包含频率和幅度方面的(压缩的)音频信息。该图显示 MP3 报头由一个同步字组成,用于识别有效帧的开始。后面是一个表示这是 MPEG 标准的位和两个表示使用第 3 层的位;因此 MPEG-1 Audio Layer 3 或 MP3。在此之后,值会有所不同,具体取决于 MP3 文件。 ISO/IEC 11172-3 定义了标题的每个部分的值范围以及标题的规范。今天的大多数 MP3 文件都包含 ID3 元数据,它位于 MP3 帧之前或之后;如图所示。
LAME源代码
LAME 是一个 MP3 库,但它也是开源的,这意味着您可以下载源代码并查看它。 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/
【讨论】:
好吧,这将是艰难的:)
无论如何,您的应用程序应该由两部分组成 - 解压缩库/例程和您的主后端,这将需要一些解压缩数据块,实际上玩吧。
我会推荐 David Salomon 所著的“数据压缩”一书,以了解您的解码器实际上应该如何执行此操作。不幸的是,您的第二部分的变体过于宽泛,无法用一句话来涵盖它们。
您也可以尝试研究一些开源 mp3 解码器/解码库,例如 this one.
【讨论】:
如果你坚持自己做,你几乎必须从规范开始:
【讨论】:
您需要为您的任务使用一些解码器库,例如 http://sourceforge.net/projects/mpg123net/
还有MAD解码器...http://www.underbit.com/products/mad/
要正确读取 mp3 文件,涉及到很多数学问题,我猜你真的不想进入那个...
【讨论】: