检测文件是否是MP3文件?

问题描述 投票:11回答:2

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

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

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

header mp3 detect decoding flac
2个回答
25
投票

检测文件是否是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 hex0x49, 0x44, 0x33 它适用于我的一些文件。我不确定它是否适用于所有情况,因此可能需要更复杂的解决方案,如Oak Bytes的答案。

© www.soinside.com 2019 - 2024. All rights reserved.