C语言解析mp3 ID3V1信息

近期写个小项目需要解析mp3文件中存储的歌手,专辑等信息,从网上搜索了下,找到如下信息:

参考链接:

【1】飞诺网

【2】李木空间

ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版。 其中:v1版的ID3在mp3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息。 v2版一般位于mp3的开头,可以存储歌词,该专辑的图片等大容量的信息。

绝大多数MP3仍使用ID3 V1.0标准。此标准是将MP3文件尾的最后128个字节用来存放ID3信息。具体如下表

字节

长度 (字节)

说       明

1-3

3

存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。

4-33

30

歌名

34-63

30

作者

64-93

30

专辑名

94-97

4

年份

98-127

30

附注

128

1

MP3音乐类别,共147种。

在详细内容可以去百度百科这里看看。然后参考网上的程序自己写了个c语言解析的程序。

 1 #include <stdio.h>
 2 
 3 //结构体存储mp3 ID3V1信息
 4 struct mp3
 5 {
 6     char header[4];
 7     char title[31];
 8     char artist[31];
 9     char album[31];
10     char year[5];
11     char comment[31];
12     char genre[2];
13 };
14 
15 //Genre转换数组
16 char genre[148][40]= {"Blues","ClassicRock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal",
17                       "NewAge","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial",
18                       "Alternative","Ska","DeathMetal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop",
19                       "Vocal","Jazz+Funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","SoundClip",
20                       "Gospel","Noise","AlternRock","Bass","Soul","Punk","Space","Meditative","InstrumentalPop",
21                       "InstrumentalRock","Ethnic","Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk",
22                       "Eurodance","Dream","SouthernRock","Comedy","Cult","Gangsta","Top40","ChristianRap",
23                       "Pop/Funk","Jungle","NativeAmerican","Cabaret","NewWave","Psychadelic","Rave","Showtunes",
24                       "Trailer","Lo-Fi","Tribal","AcidPunk","AcidJazz","Polka","Retro","Musical","Rock&Roll",
25                       "HardRock","Folk","Folk-Rock","NationalFolk","Swing","FastFusion","Bebob","Latin","Revival",
26                       "Bluegrass","Avantgarde","GothicRock","ProgessiveRock","PsychedelicRock","SymphonicRock",
27                       "SlowRock","BigBand","Chorus","EasyListening","Acoustic","Humour","Speech","Chanson","Opera",
28                       "ChamberMusic","Sonata","Symphony","BootyBass","Primus","PornGroove","Satire","SlowJam","Club",
29                       "Tango","Samba","Folklore","Ballad","PowerBallad","RhythmicSoul","Freestyle","Duet","PunkRock",
30                       "DrumSolo","Acapella","Euro-House","DanceHall","Goa","Drum&Bass","Club-House","Hardcore",
31                       "Terror","Indie","BritPop","Negerpunk","PolskPunk","Beat","ChristianGangstaRap","HeavyMetal",
32                       "BlackMetal","Crossover","ContemporaryChristian","ChristianRock","Merengue","Salsa","TrashMetal",
33                       "Anime","JPop","Synthpop"
34                      };
35 
36 int main(int argc,char* argv[])
37 {
38     FILE *fp;
39     char *file_name = "test.mp3";
40     struct mp3 mp3_info;//存放读取的mp3 ID3V1信息
41 
42     fp = fopen(file_name,"r");
43     if( fp == NULL)
44     {
45         printf("can't open file %s",file_name);
46         return -1;
47     }
48 
49     //mp3以末尾的128字节存放,偏移-128
50     fseek(fp,-128*sizeof(char),SEEK_END);
51 
52     //读取标签头
53     fread(mp3_info.header,sizeof(char),3,fp);
54 
55     //标签头必须是"TAG"否则认为没有标签
56     if(!(mp3_info.header[0] == 'T'
57             && mp3_info.header[1] == 'A'
58             && mp3_info.header[2] == 'G'))
59     {
60         printf("%s contains no ID3 v1 tag",file_name);
61     }
62     else
63     {
64         //读取信息
65         fread(mp3_info.title,sizeof(char),30,fp);
66         fread(mp3_info.artist,sizeof(char),30,fp);
67         fread(mp3_info.album,sizeof(char),30,fp);
68         fread(mp3_info.year,sizeof(char),4,fp);
69         fread(mp3_info.comment,sizeof(char),30,fp);
70         fread(mp3_info.genre,sizeof(char),1,fp);
71         mp3_info.title[30] = mp3_info.artist[30] = mp3_info.album[30] = mp3_info.year[4] = mp3_info.comment[30] = mp3_info.genre[1] = 0;
72         unsigned char uc = (unsigned char)mp3_info.genre[0];
73 
74         //打印信息
75         printf("Title : %s\n",mp3_info.title);
76         printf("Artist : %s\n",mp3_info.artist);
77         printf("Album : %s\n",mp3_info.album);
78         printf("Year : %s\n",mp3_info.year);
79         printf("Comment : %s\n",mp3_info.comment);
80         //判断Genre是否在合法范围
81         if(uc < 148)
82         {
83             printf("Genre : %s\n",genre[uc]);
84         }
85         else
86         {
87             printf("Genre : Invalid\n");
88         }
89     }
90 
91     fclose(fp);
92     return 0;
93 }

 

 

posted on 2012-06-23 21:30  wuxun  阅读(1010)  评论(0编辑  收藏  举报

导航