易码技术论坛

 找回密码
 加入易码
搜索
查看: 2522|回复: 21

EPC原创的MP3信息解析核心代码(支持VBR,CBR)

[复制链接]
发表于 2008-4-27 08:50:23 | 显示全部楼层 |阅读模式
  1. //全局常量定义
  2. char sam[9][8]={
  3. "44100Hz",
  4. "48000Hz",
  5. "32000Hz",
  6. "22050Hz",
  7. "24000Hz",
  8. "16000Hz",
  9. "11025Hz",
  10. "12000Hz",
  11. " 8000Hz"};
  12. int bitrx1[15]={1,32,40,48,56,64,80,96,112,128,160,192,224,256,320};
  13. char bitr1[15][4]={
  14. "  0",
  15. " 32",
  16. " 40",
  17. " 48",
  18. " 56",
  19. " 64",
  20. " 80",
  21. " 96",
  22. "112",
  23. "128",
  24. "160",
  25. "192",
  26. "224",
  27. "256",
  28. "320"
  29. };
  30. int bitrx2[15]={1,8,16,24,32,64,80,56,64,128,160,112,128,256,320};
  31. char bitr2[15][4]={
  32. "  0",
  33. "  8",
  34. " 16",
  35. " 24",
  36. " 32",
  37. " 64",
  38. " 80",
  39. " 56",
  40. " 64",
  41. "128",
  42. "160",
  43. "112",
  44. "128",
  45. "256",
  46. "320"
  47. };
  48. char idheader[4]="TAG";
  49. char ID3header[4]="ID3";
  50. long mp3maxtime;
  51. char mp3infotxt[100];

  52. void getmp3info(int filename){
  53.         long baseofs;
  54.         char txtbuf[64];
  55.         char mp;
  56.         char r;
  57.         char id3info[10];
  58.         char mp3info[128];
  59.         long framestart;
  60.         char XBR;//0:CBR,1:VBR
  61.         ////////////////
  62.         ///////////////
  63.         //mp3_info
  64.         long mp3_time;
  65.         char mp3sam;
  66.         char mp3soundm;
  67.         char mp3ver;
  68.         char mp3bitrate;
  69.         long mp3filelen;
  70.         long maxframe;
  71.         int vbrbit;
  72.         char a;
  73.         ////////////////
  74.         framestart=0;
  75. /*        if(strstr(filename,"mp3")==NULL || strstr(filename,"MP3")==NULL){

  76.                 mp3maxtime=0;sprintf(mp3infotxt,"注意:歌曲信息仅支持MP3文件!");
  77.                 return;
  78.                 }*/
  79.         
  80.         mp=fopen(filename,"r");
  81.         if(mp==0){fclose(mp);mp3maxtime=1;return;}
  82.         for(baseofs=0;fgetc(mp)==0;){}
  83.         baseofs=ftell(mp)-1;
  84.         framestart=framestart+baseofs;
  85.         fseek(mp,0,SEEK_END);
  86.         mp3filelen=ftell(mp);
  87.         rewind(mp);
  88.         fseek(mp,baseofs,0);
  89.         fread(id3info,1,10,mp);
  90.         id3info[3]=0;
  91.         if(strcmp(id3info,ID3header)==0){
  92.                 framestart = (id3info[6]&0x7F)*0x200000+(id3info[7]&0x7F)*0x400+(id3info[8]&0x7F)*0x80+(id3info[9]&0x7F)+10;
  93.                 }
  94.         mp3filelen=mp3filelen-framestart;
  95.         fseek(mp,framestart,0);
  96.         fread(mp3info,1,128,mp);
  97.         fclose(mp);
  98.         mp3ver=mp3info[1]&0x18;
  99.         mp3ver=mp3ver>>3;
  100.         mp3sam=mp3info[2]&0x0c;
  101.         mp3sam=mp3sam>>2;
  102.         mp3soundm=mp3info[3]&0xc0;
  103.         mp3soundm=mp3soundm>>6;
  104.         mp3bitrate=mp3info[2]&0xf0;
  105.         mp3bitrate=mp3bitrate>>4;
  106.         for(r=0;r<123;r++){
  107.                 if(mp3info[r]=='X'&&mp3info[r+1]=='i'&&mp3info[r+2]=='n'&&mp3info[r+3]=='g')
  108.                 {XBR=1;goto OUTER;}
  109.                 }
  110.         XBR=0;
  111. OUTER:
  112.         memset(mp3infotxt,0x20,50);
  113.         memcpy(mp3infotxt,"歌曲信息: 128kbps 44100Hz Mono",31);
  114.         if(XBR==0){
  115.         memcpy(mp3infotxt+41,"CBR",3);
  116.         if(mp3ver==3){memcpy(mp3infotxt+10,bitr1[mp3bitrate],3);mp3maxtime=mp3filelen/(bitrx1[mp3bitrate]*1000/8);}
  117.         else {memcpy(mp3infotxt+10,bitr2[mp3bitrate],3);mp3maxtime=mp3filelen/(bitrx2[mp3bitrate]*1000/8);}
  118.                 }
  119.         else{
  120.         memcpy(mp3infotxt+41,"VBR",3);
  121.                 maxframe=mp3info[47]+mp3info[46]*256+mp3info[45]*256*256+mp3info[44]*256*256*256;
  122.                 vbrbit=mp3filelen/(maxframe*26/1000)*8/1000;
  123.                 sprintf(txtbuf,"%d",vbrbit);
  124.                 memcpy(mp3infotxt+10,txtbuf,strlen(txtbuf));
  125.                 mp3maxtime=maxframe*26/1000;
  126.                 }
  127.         if(mp3ver>0)mp3ver--;
  128.         mp3ver=2-mp3ver;
  129.         memcpy(mp3infotxt+18,sam[mp3sam+mp3ver*3],7);
  130.         if(mp3soundm==0)memcpy(mp3infotxt+26,"立体声",7);
  131.         else if(mp3soundm==1)memcpy(mp3infotxt+26,"联合立体声",13);
  132.         else if(mp3soundm==2)memcpy(mp3infotxt+26,"混合立体声",13);
  133.         else memcpy(mp3infotxt+26,"单声道",4);
  134. }
复制代码
说明:
filename为需要解析的MP3全路径
解析后会把信息保存在全局变量mp3infotxt里,包含比特率,采样,声道
同时会把Mp3歌曲长度(秒)到mp3maxtime中
发表于 2008-4-27 08:52:15 | 显示全部楼层
沙发!
发表于 2008-4-27 08:55:59 | 显示全部楼层
板凳!
发表于 2008-4-27 09:26:04 | 显示全部楼层
顶。。。。。。
发表于 2008-4-27 11:26:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-4-27 11:27:49 | 显示全部楼层
视乎发错地方了
发表于 2008-4-27 11:33:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-4-27 11:50:19 | 显示全部楼层
定一个~
发表于 2008-4-27 12:06:25 | 显示全部楼层
在错误的地方发了一个不错误的帖子
发表于 2008-4-27 12:08:45 | 显示全部楼层
顺便问一下:MP3播放器的波形根据什么来跳动?
音乐的频率和节奏?
发表于 2008-5-10 18:13:42 | 显示全部楼层
好贴,收藏了!
发表于 2008-5-22 22:26:39 | 显示全部楼层
很久没来了,好帖,看看,呵呵
发表于 2008-5-23 05:26:43 | 显示全部楼层
好贴!!顶一个
发表于 2008-5-23 08:27:53 | 显示全部楼层
强帖!!顶了!!
发表于 2008-8-22 12:02:54 | 显示全部楼层
发表于 2008-8-22 13:18:22 | 显示全部楼层
支持ID3V2么
发表于 2008-8-24 16:34:35 | 显示全部楼层
文曲星播放高位速的mp3文件就会有破音
 楼主| 发表于 2008-10-7 21:25:00 | 显示全部楼层
原帖由 Cadina 于 2008-8-22 13:18 发表
支持ID3V2么

这里不包含ID3信息读取
只是计算MP3码率,长度等信息
开头有侦测及跳过ID3V2信息部分的代码

由于是GVM2的,有些不规范,过段时间我把代码完善下
发表于 2008-11-4 19:03:38 | 显示全部楼层
顶!学习了。
发表于 2008-11-4 21:38:45 | 显示全部楼层
好厉害。。膜拜
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 01:30 , Processed in 0.016469 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表