【问题标题】:Detect if a file is an MP3 file?检测文件是否为 MP3 文件?
【发布时间】:2012-07-06 19:11:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: header mp3 detect decoding flac


    【解决方案1】:

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

    【讨论】:

    • 这似乎没有解决封面艺术/ID3 的问题?
    • 如果 MP3 具有封面艺术或 ID3,则该方法有效,因为它们在帧边界处没有 0xFFF/0xFFE(即,如果您在封面艺术中找到标题模式并提取帧长度,您将不会在帧的末尾找到另一个 FFF/FFE 模式)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2015-07-15
    • 2020-12-27
    • 2013-11-17
    相关资源
    最近更新 更多