如何确定特定文件实际上是 MP3 文件?

Posted

技术标签:

【中文标题】如何确定特定文件实际上是 MP3 文件?【英文标题】:How can I determine that a particular file is in fact an MP3 file? 【发布时间】:2011-11-10 06:34:07 【问题描述】:

如何确定特定文件(可能有也可能没有“.mp3”文件扩展名)实际上是 MP3 文件?我希望在 C# 中执行此操作。

【问题讨论】:

C# 和文件类型幻数;可能是 ***.com/questions/1654846/… 的副本 如果您使用***.com/questions/184683中提供的解决方案成功加载它,您可能会认为它是有效的MP3 【参考方案1】:
string[] filePath = Directory.GetFiles(fbdialog.SelectedPath.ToString(),".mp3", 
                                       SearchOption.AllDirectories);

foreach (string str in filePath)

    MessageBox.Show("It's mp3 file");

【讨论】:

【参考方案2】:

C#代码:

bool isMP3(byte[] buf)

    if (buf[0] == 0xFF && (buf[1] & 0xF6) > 0xF0 && (buf[2] & 0xF0) != 0xF0) 
    
         return true;
    
    return false;

【讨论】:

【参考方案3】:
    使用文件扩展名不可靠。 您可以使用的最佳库是https://github.com/mono/taglib-sharp,它可以检测大多数常见文件类型。也许你只是想要 mp3,所以你可以提取任何 mp3 相关的类。 您可以使用的更简单的库是https://github.com/judwhite/IdSharp

【讨论】:

【参考方案4】:

根据http://www.garykessler.net/library/file_sigs.html,mp3 文件将始终以 ID3(十六进制 49 44 33)开头,但是,这些字节的存在仅意味着该文件被标记为ID3 information。如果未找到此签名,则可能是未标记的 mp3 文件。要确定这一点,请查看the mp3 file structure,您会看到一个 mp3 帧以签名 ff fb(十六进制)开头。

所以:

如果文件以十六进制开头49 44 33

如果文件以十六进制开头ff fb

假设它是 MP3 是安全的。

【讨论】:

【参考方案5】:

文件通常以“幻数”开头,以标识数据格式。根据格式,文件以该格式独有的特定字节序列开始。没有可遵循的标准,因此它不是 100% 可靠的。

正如 fvu 所说,mp3 幻数是0x49 0x44 0x33

【讨论】:

以上是关于如何确定特定文件实际上是 MP3 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 mp3 文件头的长度?

Javascript:如何确定 mp3 文件的音调

用 C 语言编辑音频 (mp3)

是否有用于确定大多数 mp3 音乐文件的每分钟节拍 (bpm) 的 AS3 库?

如何确定 bash 中特定日期的文件夹的磁盘使用情况?

如何确定文件的文件类型(文档类型/UTI)