检测文件是否为 MP3 文件? [英] Detect if a file is an MP3 file?

查看:21
本文介绍了检测文件是否为 MP3 文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm writing a C++ library for decoding and encoding audio between different formats/codecs. I have a routine for quickly detecting the format before loading the required codec library.

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

For WAV files one can simple look for the ASCII values "RIFF" and "WAVE" at the start of the file. The same applies to FLAC, we can simply read in the first 4 bytes, which will be "fLaC".

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

But how can I quickly detect if a file is MP3? I can't rely on the file extension. I also can't try to decode the first MP3 frame, since there might be additional data at the start of the file (eg: ID3, cover image, etc).

推荐答案

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

Detecting if a file is an MP3 is more complicated than searching for a fixed pattern in the file.

一些概念

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

  • MP3 文件由一系列帧组成,每帧开头都有一个标题.
  • 标头以 11 位同步字(全为 1)的字节边界开始.因此同步字是 0xFFE 或 0XFFF.
  • 每帧的长度是根据头参数计算的.

判断文件是否为 MP3 的算法

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

这篇关于检测文件是否为 MP3 文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆