检测文件是否为MP3

goo*_*ons 13 mp3 header decoding detect flac

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

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

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

Oak*_*tes 27

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