17

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

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

但是如何快速检测文件是否为 MP3?我不能依赖文件扩展名。我也无法尝试解码第一个 MP3 帧,因为文件开头可能有其他数据(例如:ID3、封面图像等)。

4

1 回答 1

32

检测文件是否为 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 以获得更好的命中率。
于 2012-07-06T10:32:43.700 回答