logo资料库

参考资料\C++获取MP3文件信息.doc

第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
资料共39页,剩余部分请下载后查看
获取MP3信息C++源代码
获取 MP3 信息 C++源代码 使用 C++语言获取 mp3 歌曲的 ID3V2 文件头,mp3 帧信息,和 ID3V1 文件尾信息。 功能不完全,只是读取 mp3 的信息,没有别的功能。 //1. MP3Info.h ///////////////////////////////////////////////////////////////////// /////////// ///////////////////////////////////////////////////////////////////// /////////// //// //// (C) 2002, Roman Nurik Copy //// //// right //// //// ///////////////////////////////////////////////////////////////////// /////////// ///////////////////////////////////////////////////////////////////// /////////// #ifndef #define __MP3INFO_H_ __MP3INFO_H_ //#include #include ///////////////////////////////////////////////////////////////////// ///// // ID3V2.3 ///////////////////////////////////////////////////////////////////// ///// ///////////////////////////////////////////////////////////////////// ///// // 标签头
// 在文件的首部顺序记录 10 个字节的 ID3V2.3 的头部。数据结构如下: /* 1).标志字节 标志字节一般为 0,定义如下: abc00000 a -- 表示是否使用 Unsynchronisation(这个单词不知道是什么意思,字典里也 没有找到,一般不设置) b -- 表示是否有扩展头部,一般没有(至少 Winamp 没有记录),所以一般也不 设置 c -- 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置) (2).标签大小 一共四个字节,但每个字节只用 7 位,最高位不使用恒为 0。所以格式如下 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 计算大小时要将 0 去掉,得到一个 28 位的二进制数,就是标签大小(不懂为什 么要这样做),计算公式如 下: int total_size; total_size = (Size&0x7F)*0x200000 +(Size&0x7F)*0x4000 +(Size&0x7F)*0x80 +(Size&0x7F)*/ typedef struct tagMP3ID3V2HEADER { header; version; revision; flag; // 必须为"ID3"否则认为标签不存在 // 版本号 ID3V2.3 就记录 3 // 副版本号此版本记录为 0 char char char char 义了三位,稍后详细解说 size; // 存放标志的字节,这个版本只定 char // 标签大小,不包括标签头的 10 个字节 和所有的标签帧的大小 }MP3ID3V2HEADER, *PMP3ID3V2HEADER;
///////////////////////////////////////////////////////////////////// ///// // 标签帧 /* 每个标签帧都有一个 10 个字节的帧头和至少一个字节的不固定长度的内容组 成。它们也是顺序存放在文件 中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容 只有从帧头中的到内容大 小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。 */ /* (1).帧标识 用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下: TIT2=标题 表示内容为这首歌的标题,下同 TPE1=作者 TALB=专集 TRCK=音轨 格式:N/M 其中 N 为专集中的第 N 首,M 为专集中共 M 首,N 和 M 为 ASCII 码表示的数字 TYER=年代 是用 ASCII 码表示的数字 TCON=类型 直接用字符串表示 COMM=备注 格式:"eng 备注内容",其中 eng 表示备注所使用的自然语言 (2).大小 这个可没有标签头的算法那么麻烦,每个字节的 8 位全用,格式如下 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 算法如下: int FSize; FSize = Size*0x100000000 +Size*0x10000 +Size*0x100 +Size; (3).标志 只定义了 6 位,另外的 10 位为 0,但大部分的情况下 16 位都为 0 就可以了。 格式如下: abc00000 ijk00000 a -- 标签保护标志,设置时认为此帧作废 b -- 文件保护标志,设置时认为此帧作废 c -- 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志) i -- 压缩标志,设置时一个字节存放两个 BCD 码表示数字 j -- 加密标志(没有见过哪个 MP3 文件的标签用了加密)
k -- 组标志,设置时说明此帧和其他的某帧是一组 值得一提的是 winamp 在保存和读取帧内容的时候会在内容前面加个'',并把这 个字节计算在帧内容的 大小中。 */ typedef struct tagMP3ID3V2FRAME { char frameID; 后有常用的标识对照表 size; 1 flags; 说 // 用四个字符标识一个帧,说明其内容,稍 char // 帧内容的大小,不包括帧头,不得小于 char // 存放标志,只定义了 6 位,稍后详细解 char * frameContent ; }MP3ID3V2FRAME, *PMP3ID3V2FRAME; // 标签帧内容 #define MP3ID3V2FRAMEHEADERSIZE 10 ///////////////////////////////////////////////////////////////////// ///// ///////////////////////////////////////////////////////////////////// ///// // mp3 帧信息 // // AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM ///////////////////////////////////////////////////////////////////// ///// p p p p ///////////////////////////////////////////////////////////////////// ///// // MP3FRAMEHEADER // 注意:c 语言在存取数据时总是从低位开始 // p = 00000000 // p = 10010000 // p = 11111011 structure 四个字节
// p = 11111111 typedef struct { tagMP3FRAMEHEADER unsigned unsigned unsigned unsigned emphasis original copyright modeext unsigned chanmode : : : : : 2; 1; 1; 2; // // // // 2; // unsigned privbit : 1; // unsigned unsigned unsigned padding samplerate : bitrate : : 1; // 2; // F M L K I G 强调 原创 版权 J 扩展模 声道 H 私有 填充位 采样频率 4; // E 位率索 unsigned hascrc : 1; // D 校验 unsigned mpeglayer : 2; // C Layer unsigned mpegver : 2; // B MPEG 音 式 bit 引 位 描述 频版本 ID unsigned framesync : 11; // A 帧 同 步 }MP3FRAMEHEADER, *PMP3FRAMEHEADER; ENMPEGVER B enumeration ///////////////////////////////////////////////////////////////////// ///// // /* MPEG 音频版本 ID 00 - MPEG 2.5 01 - 保留 10 - MPEG 2 (ISO/IEC 13818-3) 11 - MPEG 1 (ISO/IEC 11172-3) 注:MPEG 2.5 不是官方标准。帧头第 20 个比特用来表示 2.5 版本。 不支持该版本的应用程序一般认为该比特位置位为帧同步位,也就是说帧同步 (A)的长度为 12 而不是这里规定的 11, 这样 B 也就变成了 1 位(第 19 个位)。推荐使用该表的方法因为这样允许你可 以区分三个版本以获得最高兼容性。 */
enum { ENMPEGVER MPEGVER_25, // 2.5 // reserved, N/A MPEGVER_NA, MPEGVER_2, MPEGVER_1 // // 2.0 1.0 (ISO/IEC (ISO/IEC 13818-3) 11172-3) }; ///////////////////////////////////////////////////////////////////// ///// // /* ENCHANNELMODE enumeration I 声道 00 立体声 01 联合(混合)立体声(立体声) 10 双声道(立体声) 11 单声道(单声) 注:双声道文件由二个独立的单声道组成。 每一个声道使用整个文件一半 的位率。 大多数的解码器把它当作立体声来输出,但是它并不总是这种情况。 按我的理解就是是两个声道的信息是完全相同的,并不能把它当作立体声看 待。 */ enum { }; ENCHANNELMODE MP3CM_STEREO, MP3CM_JOINT_STEREO, MP3CM_DUAL_CHANNEL, MP3CM_SINGLE_CHANNEL ENEMPHASIS enumeration ///////////////////////////////////////////////////////////////////// ///// // /* 强调 00 - 无 01 - 50/15 ms 10 - 保留 11 - CCIT J.17*/ M
enum { }; ENEMPHASIS MP3EM_NONE, MP3EM_50_15_MS, // MP3EM_RESERVED, MP3EM_CCIT_J17 50/15 ms // CCIT J.17 ///////////////////////////////////////////////////////////////////// ///// // // mp3 帧头中的位率索引,比特率有位率值,layer 和版本号共同决定 /* 索引值 MPEG 2, 2.5 (LSF) bitrates Layer II Layer II & III Layer 32 48 56 64 80 96 112 128 160 192 224 256 320 384 32 40 48 56 64 80 96 112 128 160 192 224 256 320 32 48 56 64 80 96 112 128 144 160 176 192 224 256 matrix of MPEG 1 Layer I III 0000 0001 8 0010 16 0011 24 0100 32 40 48 56 64 80 96 112 128 144 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 Layer I Free 32 64 96 128 160 192 224 256 288 320 352 384 416 448
160 1111 static Bad*/ int g_nMP3BitRate = { 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1}, {0, 32, {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1}, {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1}, {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, {0, 16, 24, 32, 64, 80, 56, 64, 128, 160, {0, 8, 8, 112, 128, 256, 320, -1}, }; ///////////////////////////////////////////////////////////////////// ///// structure MP3 ID3V1 TAG ///////////////////////////////////////////////////////////////////// ///// // /* ID3v1 标签用来描述 MPEG 音频文件。包含艺术家,标题,唱片集,发布年代和 流派。 另外还有额外的注释空间。位于音频文件的最后固定为 128 字节。 可以读取该文件的最后这 128 字节获得标签。 结构如下 AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG*/ /* 符号 长度 (bytes) 位置 (bytes) 描述
分享到:
收藏