检测文件是否为MP3

时间:2012-07-06 10:17:31

标签: header mp3 detect decoding flac

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

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

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

2 个答案:

答案 0 :(得分:24)

检测文件是否是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以获得更好的命中率。

答案 1 :(得分:-3)

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