C语言解析mp3 ID3V1信息

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种。


#include <stdio.h>
 
 //结构体存储mp3 ID3V1信息
 struct mp3
 {
     char header[4];
     char title[31];
     char artist[31];
     char album[31];
     char year[5];
     char comment[31];
     char genre[2];
 };
 
 //Genre转换数组
 char genre[148][40]= {"Blues","ClassicRock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal",
                       "NewAge","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno","Industrial",
                       "Alternative","Ska","DeathMetal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop",
                       "Vocal","Jazz+Funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","SoundClip",
                       "Gospel","Noise","AlternRock","Bass","Soul","Punk","Space","Meditative","InstrumentalPop",
                       "InstrumentalRock","Ethnic","Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk",
                       "Eurodance","Dream","SouthernRock","Comedy","Cult","Gangsta","Top40","ChristianRap",
                       "Pop/Funk","Jungle","NativeAmerican","Cabaret","NewWave","Psychadelic","Rave","Showtunes",
                       "Trailer","Lo-Fi","Tribal","AcidPunk","AcidJazz","Polka","Retro","Musical","Rock&Roll",
                       "HardRock","Folk","Folk-Rock","NationalFolk","Swing","FastFusion","Bebob","Latin","Revival",
                       "Bluegrass","Avantgarde","GothicRock","ProgessiveRock","PsychedelicRock","SymphonicRock",
                       "SlowRock","BigBand","Chorus","EasyListening","Acoustic","Humour","Speech","Chanson","Opera",
                       "ChamberMusic","Sonata","Symphony","BootyBass","Primus","PornGroove","Satire","SlowJam","Club",
                       "Tango","Samba","Folklore","Ballad","PowerBallad","RhythmicSoul","Freestyle","Duet","PunkRock",
                       "DrumSolo","Acapella","Euro-House","DanceHall","Goa","Drum&Bass","Club-House","Hardcore",
                       "Terror","Indie","BritPop","Negerpunk","PolskPunk","Beat","ChristianGangstaRap","HeavyMetal",
                       "BlackMetal","Crossover","ContemporaryChristian","ChristianRock","Merengue","Salsa","TrashMetal",
                       "Anime","JPop","Synthpop"
                      };
 
 int main(int argc,char* argv[])
 {
     FILE *fp;
     char *file_name = "test.mp3";
     struct mp3 mp3_info;//存放读取的mp3 ID3V1信息
 
     fp = fopen(file_name,"r");
     if( fp == NULL)
     {
         printf("can't open file %s",file_name);
         return -1;
     }
 
     //mp3以末尾的128字节存放,偏移-128
     fseek(fp,-128*sizeof(char),SEEK_END);
 
     //读取标签头
     fread(mp3_info.header,sizeof(char),3,fp);
 
     //标签头必须是"TAG"否则认为没有标签
     if(!(mp3_info.header[0] == 'T'
             && mp3_info.header[1] == 'A'
             && mp3_info.header[2] == 'G'))
     {
         printf("%s contains no ID3 v1 tag",file_name);
     }
     else
     {
         //读取信息
         fread(mp3_info.title,sizeof(char),30,fp);
         fread(mp3_info.artist,sizeof(char),30,fp);
         fread(mp3_info.album,sizeof(char),30,fp);
         fread(mp3_info.year,sizeof(char),4,fp);
         fread(mp3_info.comment,sizeof(char),30,fp);
         fread(mp3_info.genre,sizeof(char),1,fp);
         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;
         unsigned char uc = (unsigned char)mp3_info.genre[0];
 
         //打印信息
         printf("Title : %s\n",mp3_info.title);
         printf("Artist : %s\n",mp3_info.artist);
         printf("Album : %s\n",mp3_info.album);
         printf("Year : %s\n",mp3_info.year);
         printf("Comment : %s\n",mp3_info.comment);
         //判断Genre是否在合法范围
         if(uc < 148)
         {
             printf("Genre : %s\n",genre[uc]);
         }
         else
         {
             printf("Genre : Invalid\n");
         }
     }
 
     fclose(fp);
     return 0;
 }




  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值