【问题标题】:Get mp3 length in C++ [closed]在 C++ 中获取 mp3 长度 [关闭]
【发布时间】:2014-05-21 07:00:52
【问题描述】:

所以,我有一些(大)纯文本歌曲列表。我编写了一个解析器,它创建一个包含艺术家、标题和歌曲长度的结构列表。我还有一个巨大的 mp3 文件夹,它们与我的列表相对应,但随机命名(例如 1b942ca9231291.mp3)。 我想要的是从文件夹中创建一个长度和文件名列表,以便我可以根据长度等价重命名文件,在发生冲突时提示用户。 我想在不使用面向 ID3 的库的情况下完成这一切,请不要推荐它们。

【问题讨论】:

  • 检查this link。它包含对 mp3 格式的描述,但很难。
  • @MichaelWalz 正如您(可以?)看到的那样,猪已经提供了这个链接作为回答。无论如何,感谢您的帮助。
  • 我无法理解我的问题中不清楚的地方。实际上,我要求一种方法来获得不涉及 ID3 标签和相应库的 mp3 长度。我想我已经说得很清楚了,如果没有,建议我应该如何编辑我的问题。

标签: c++ mp3 fileinfo


【解决方案1】:

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

您需要计算kBps 中的比特率并计算帧的大小(与每个标头关联的结构)并将它们分开。对于 CBR 文件,您可以通过仅划分整个文件大小来获得合理的估计,这要快得多。忽略 ID3 标签会有所帮助,尤其是当它们包含大量专辑封面图片时。

您可以查看我的旧 music checker 程序,该程序解码 MP3 标头并检查损坏情况。你需要这个framework 的旧版本(不确定是哪一个)来构建它。

【讨论】:

  • 感谢标题帮助文件的链接。我不认为我会深入挖掘您的旧项目,如果我找到一个比特率提取器,也许就拿走它。所以基本上 1 帧 = 1 秒,然后除法后我只需要将秒转换为 MM:SS?
  • 否,例如128 kBps 框架采用128 kB 存储1 second。因此,除以128 kB 的大小(整个文件/或其中更好的有用音频数据)以获得以秒为单位的播放时间。 VBR 使事情变得更加复杂,因为每个帧可以有不同的比特率(每个帧都有不同的kBps)。在MP3.cpp 中,您可以找到工作所需的所有帧解析和 ID3 解析例程。
  • 将代码放在这里会更好。您的链接已损坏。
  • @TheRealChx101 谢谢,他们一定删除了我的旧学生页面。会上传到别处。 “把代码放在这里”是不合适的,因为它有数千行。
猜你喜欢
  • 2010-11-15
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多