2012-07-06 72 views
9

我正在编写一个C++库,用于解码和编码不同格式/编解码器之间的音频。在加载所需的编解码器库之前,我有一个快速检测格式的例程。检测文件是否为MP3

对于WAV文件,可以简单地在文件开头查找ASCII值“RIFF”和“WAVE”。这同样适用于FLAC,我们可以简单地在前4个字节中读取,这将是“fLaC”。

但是,如何快速检测文件是否为MP3?我不能依靠文件扩展名。我也不能尝试解码第一个MP3帧,因为在文件开始时可能会有额外的数据(例如:ID3,封面图像等)。

回答

19

检测文件是否为MP3比在文件中搜索固定模式更复杂。

Some concepts

(详见http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header

  • MP3文件由一系列帧,和每帧在开头的报头。
  • 标题以11位同步字开始,字节边界全为1。因此同步字是0xFFE或0XFFF。
  • 根据标题参数计算每个帧的长度。

Algorithm to determine if a file is MP3 or not

  • 搜索文件(0xFFF的或0xFFE)在同步字。
  • 解析标题参数。
  • 使用头部参数确定帧长度。
  • 使用帧长寻找下一帧。
  • 如果您在查找后发现另一个同步字,那么该文件主要是一个MP3文件。
  • 可以肯定,重复该过程来查找连续N个MP3帧。 N可以增加以获得更好的命中率。
-3

我只是在你现有的wave和flac测试中检查签名。
一个mp3文件should have this in hex
0x49, 0x44, 0x33
它适用于我有的一些文件。我不确定它是否适用于所有情况,因此可能需要更复杂的解决方案,如Oak Bytes的答案。

+2

您建议的字节序列('I''D''3')是ID3(v2)元数据标记标题的一部分,但不是所有的MP3文件都会有ID3v2标记(并且ID3v2.4标记可能是在文件末尾而不是开头)。 – Deltics 2016-01-25 19:47:31