检测一个文件是否为MP3文件?

18
我正在编写一个C++库,用于在不同格式/编解码器之间解码和编码音频。我有一个快速检测所需编解码库的格式的例程。
对于WAV文件,可以简单地查找文件开头的ASCII值“RIFF”和“WAVE”。FLAC也是如此,我们只需读取前4个字节,这将是“fLaC”。
但是如何快速检测文件是否为MP3?我不能依靠文件扩展名。我也不能尝试解码第一个MP3帧,因为文件开头可能会有附加数据(例如:ID3、封面图像等)。
1个回答

34

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

一些概念

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

  • MP3文件由一系列帧组成,每个帧开头有一个头部。
  • 头部从字节边界开始,由11位的同步词组成,该同步词全部为1。因此同步词可以是0xFFE或0XFFF。
  • 根据头部参数计算每个帧的长度。

用于确定文件是否为MP3的算法

  • 在文件中搜索同步字(0xFFF或0xFFE)。
  • 解析头部参数。
  • 使用头部参数确定帧长度。
  • 使用帧长度寻找下一个帧。
  • 如果在寻找后找到另一个同步字,则该文件很可能是MP3文件。
  • 为了确保,重复这个过程来找到N个连续的MP3帧。可以增加N以获得更好的命中率。

1
这似乎没有解决封面艺术/ID3的问题? - micsthepick
如果MP3具有封面艺术或ID3,该方法可行,因为它们在帧边界没有0xFFF / 0xFFE(即如果您在封面艺术中找到标头模式并提取帧长度,则不会在帧结尾找到另一个FFF / FFE模式)。 - Oak Bytes
这让人觉得好像有一种方法可以在MP3中包含封面艺术,而不仅仅是在ID3标签中?如果确实存在这样的方法,我应该在哪里了解更多信息?如果没有,我们应该进行编辑以澄清。 - hippietrail
这让人觉得好像有一种方法可以在MP3中包含封面艺术,而不仅仅是在ID3标签中?如果确实有这样的方法,我可以在哪里了解更多信息?如果没有,我们应该进行编辑以澄清。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接