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 }