在c++中获取mp3的长度

Get mp3 length in C++

本文关键字:mp3 获取 c++      更新时间:2023-10-16

那么,我有一些纯文本的(大)歌曲列表。我编写了一个解析器,用于创建包含艺术家、歌曲标题和长度的结构列表。我也有一个巨大的mp3文件夹,与我的列表相对应,但随机命名,(例如1b942ca9231291.mp3)。我想要的是从文件夹中创建一个长度和文件名的列表,这样我就可以根据长度等效性重命名文件,并在发生冲突时提示用户。我希望在不使用面向id3的库的情况下完成所有这些工作,请不要建议他们。

幸运的是,解析MP3格式非常简单。你不需要解码它,只看标题。MP3不像大多数文件一样只有一个头,相反,一个文件被分成许多帧(包),它们有自己的头,不需要知道它们的确切位置,就可以发现它们,并且可以将它们与其他一些数据(有时称为边带信息,通常是ID3标签,但它几乎可以是任何东西)交织在一起。这就是为什么MP3很适合流媒体音乐,所以任何人都可以连接到流的中间并开始播放(同样的事情如果你把MP3文件分成两半,第一个和第二个文件都可以播放没有问题,例如WAV或PNG格式将不支持)。

你需要计算出kBps中的比特率,并计算帧的大小(与每个报头相关的结构),然后将它们分开。对于CBR文件,只需除以整个文件大小就可以得到一个合理的估计,这要快得多。它有助于忽略ID3标签,特别是如果它们包含大量的专辑封面图像。

你可以看看我的旧音乐检查程序,它可以解码MP3头并检查损坏情况。您将需要该框架的旧版本(不确定是哪个)来构建它。