我正在编写一个C++库,用于解码和编码不同格式/编解码器之间的音频。在加载所需的编解码器库之前,我有一个快速检测格式的例程。检测文件是否为MP3
对于WAV文件,可以简单地在文件开头查找ASCII值“RIFF”和“WAVE”。这同样适用于FLAC,我们可以简单地在前4个字节中读取,这将是“fLaC”。
但是,如何快速检测文件是否为MP3?我不能依靠文件扩展名。我也不能尝试解码第一个MP3帧,因为在文件开始时可能会有额外的数据(例如:ID3,封面图像等)。
我正在编写一个C++库,用于解码和编码不同格式/编解码器之间的音频。在加载所需的编解码器库之前,我有一个快速检测格式的例程。检测文件是否为MP3
对于WAV文件,可以简单地在文件开头查找ASCII值“RIFF”和“WAVE”。这同样适用于FLAC,我们可以简单地在前4个字节中读取,这将是“fLaC”。
但是,如何快速检测文件是否为MP3?我不能依靠文件扩展名。我也不能尝试解码第一个MP3帧,因为在文件开始时可能会有额外的数据(例如:ID3,封面图像等)。
检测文件是否为MP3比在文件中搜索固定模式更复杂。
Some concepts
(详见http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header)
Algorithm to determine if a file is MP3 or not
我只是在你现有的wave和flac测试中检查签名。
一个mp3文件should have this in hex:
0x49, 0x44, 0x33
它适用于我有的一些文件。我不确定它是否适用于所有情况,因此可能需要更复杂的解决方案,如Oak Bytes的答案。
您建议的字节序列('I''D''3')是ID3(v2)元数据标记标题的一部分,但不是所有的MP3文件都会有ID3v2标记(并且ID3v2.4标记可能是在文件末尾而不是开头)。 – Deltics 2016-01-25 19:47:31