CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

怎样读取mp3文件和wma文件的信息?像winamp中的文件信息一样?

楼主cfmowh(.NET新手)2005-01-24 09:20:21 在 .NET技术 / ASP.NET 提问

如题,给出完整代码立即结贴 问题点数:20、回复次数:7Top

1 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-01-24 09:24:48 得分 0

读文件属性呀  
  Top

2 楼rickjelly2004(每逢佳节倍思亲-------------快乐生活)回复于 2005-01-24 09:26:24 得分 0

if   (!File.Exists(path))    
                  {  
                          File.Create(path);  
                  }  
   
                File.GetAttributes(path)Top

3 楼cfmowh(.NET新手)回复于 2005-01-24 11:46:57 得分 0

各位大哥,具体一点啊Top

4 楼soochowgreen(Green)回复于 2005-01-24 12:26:56 得分 20

 
  以下供楼主参考:  
   
   
  从MP3中提取歌曲信息  
   
     
                一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来。大部分人都喜欢从网上下载音乐,但下载下来的MP3文件名都是文件上传系统自动取名的,和歌曲本身根本不相符,所以,给用户带来了很大的麻烦。但是,懒人有懒人的做法,我们何不自己写一个程序,将歌曲信息自动读出来并为MP3文件自动更名呢?  
   
     
   
                下面我就以C#为工具,把开发过程写出来。  
   
     
   
                一首MP3的额外信息存放在文件的最后面,共占128个字节,其中包括以下的内容(我们定义一个结构说明):  
   
                public   struct   Mp3Info  
                  {  
                          public   string   identify;//TAG,三个字节  
                          public   string   Title;//歌曲名,30个字节  
                          public   string   Artist;//歌手名,30个字节  
                          public   string   Album;//所属唱片,30个字节  
                          public   string   Year;//年,4个字符  
                          public   string   Comment;//注释,28个字节  
                          public   char   reserved1;//保留位,一个字节  
                          public   char   reserved2;//保留位,一个字节  
                          public   char   reserved3;//保留位,一个字节  
                  }  
   
     
   
                所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:  
   
                  ///   <summary>  
                  ///   获取MP3文件最后128个字节  
                  ///   </summary>  
                  ///   <param   name="FileName">文件名</param>  
                  ///   <returns>返回字节数组</returns>  
   
                  private   byte[]   getLast128(string   FileName)  
                  {  
                          FileStream   fs   =   new   FileStream(FileName,FileMode.Open,FileAccess.Read);  
                          Stream   stream   =   fs;  
                          stream.Seek(-128,SeekOrigin.End);  
                          const   int   seekPos   =   128;  
                          int   rl   =   0;  
                          byte[]   Info   =   new   byte[seekPos];  
                          rl   =   stream.Read(Info,0,seekPos);  
                          fs.Close();  
                          stream.Close();  
                          return   Info;  
                  }  
   
   
                再对上面返回的字节数组分段取出,并保存到Mp3Info结构中返回。  
   
                  ///   <summary>  
                  ///   获取MP3歌曲的相关信息  
                  ///   </summary>  
                  ///   <param   name   =   "Info">从MP3文件中截取的二进制信息</param>  
                  ///   <returns>返回一个Mp3Info结构</returns>  
   
                  private   Mp3Info   getMp3Info(byte[]   Info)  
                  {  
                          Mp3Info   mp3Info   =   new   Mp3Info();  
                          string   str   =   null;  
                          int   i;  
                          int   position   =   0;//循环的起始值  
                          int   currentIndex   =   0;//Info的当前索引值  
   
                          //获取TAG标识  
                          for(i   =   currentIndex;i<currentIndex+3;i++)  
                          {  
                                  str   =   str+(char)Info[i];  
                                  position++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.identify   =   str;  
   
                          //获取歌名  
                          str   =   null;  
                          byte[]   bytTitle   =   new   byte[30];//将歌名部分读到一个单独的数组中  
                          int   j   =   0;  
                          for(i   =   currentIndex;i<currentIndex+30;i++)  
                          {  
                                  bytTitle[j]   =   Info[i];          
                                  position++;  
                                  j++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.Title   =   this.byteToString(bytTitle);  
   
                            //获取歌手名  
                          str   =   null;  
                          j   =   0;  
                          byte[]   bytArtist   =   new   byte[30];//将歌手名部分读到一个单独的数组中  
                          for(i   =   currentIndex;i<currentIndex+30;i++)  
                          {  
                                  bytArtist[j]   =   Info[i];          
                                  position++;  
                                  j++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.Artist   =   this.byteToString(bytArtist);  
     
   
                          //获取唱片名  
                          str   =   null;  
                          j   =   0;  
                          byte[]   bytAlbum   =   new   byte[30];//将唱片名部分读到一个单独的数组中  
                          for(i   =   currentIndex;i<currentIndex+30;i++)  
                          {  
                                  bytAlbum[j]   =   Info[i];          
                                  position++;  
                                  j++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.Album   =   this.byteToString(bytAlbum);  
     
   
                          //获取年  
                          str   =   null;  
                          j   =   0;  
                          byte[]   bytYear   =   new   byte[4];//将年部分读到一个单独的数组中  
                          for(i   =   currentIndex;i<currentIndex+4;i++)  
                          {  
                                  bytYear[j]   =   Info[i];      
                                  position++;  
                                  j++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.Year   =   this.byteToString(bytYear);  
                           
   
                          //获取注释  
                          str   =   null;  
                          j   =   0;  
                          byte[]   bytComment   =   new   byte[28];//将注释部分读到一个单独的数组中  
                          for(i   =   currentIndex;i<currentIndex+25;i++)  
                          {  
                                  bytComment[j]   =   Info[i];          
                                  position++;  
                                  j++;  
                          }  
                          currentIndex   =   position;  
                          mp3Info.Comment   =   this.byteToString(bytComment);  
     
   
                          //以下获取保留位  
                          mp3Info.reserved1   =   (char)Info[++position];  
                          mp3Info.reserved2   =   (char)Info[++position];  
                          mp3Info.reserved3   =   (char)Info[++position];  
     
                          return   mp3Info;  
                  }  
   
   
   
                上面程序用到下面的方法:  
   
                  ///   <summary>  
                  ///   将字节数组转换成字符串  
                  ///   </summary>  
                  ///   <param   name   =   "b">字节数组</param>  
                  ///   <returns>返回转换后的字符串</returns>  
   
                  private   string   byteToString(byte[]   b)  
                  {  
                          Encoding   enc   =   Encoding.GetEncoding("GB2312");  
                          string   str   =   enc.GetString(b);  
                          str   =   str.Substring(0,str.IndexOf('\0')   >=   0   ?   str.IndexOf('\0')   :   str.Length);//去掉无用字符  
     
                          return   str;  
                  }  
   
     
                改名怎么办呢?我们按(演唱者)歌名   的格式对歌曲进行改名,程序如下:  
   
                  ///   <summary>  
                  ///   更改文件名  
                  ///   </summary>  
                  ///   <param   name="filePath">文件名</param>  
                  ///   <returns></returns>  
   
                  private   bool   ReName(string   filePath)  
                  {  
                          if(File.Exists(filePath))  
                          {  
                                  Mp3Info   mp3Info   =   new   Mp3Info();  
                                  mp3Info   =   this.getMp3Info(this.getLast128(filePath));//读出文件信息  
                                  mp3Info.Artist   =   this.DeleteNotValue(mp3Info.Artist);  
                                  mp3Info.Title   =   this.DeleteNotValue(mp3Info.Title);  
   
                                  if(mp3Info.Artist.Trim().Length==0)  
                                  {  
                                          mp3Info.Artist="未命名";  
                                  }  
   
                                  if(mp3Info.Title.Trim().Length==0)  
                                  {  
                                          mp3Info.Title="未知名歌曲";  
                                  }  
   
                                  try  
                                  {  
                                          //更名  
                                          File.Move(filePath,filePath.Substring(0,filePath.ToLower().LastIndexOf("\\")).Trim()   +   "\\"   +   "("   +   mp3Info.Artist.Trim()   +   ")"   +mp3Info.Title.Trim()   +   ".mp3");  
                                          return   true;  
                                  }  
                                  catch(Exception)  
                                  {  
                                          return   false;  
                                  }  
                          }  
                          else  
                          {  
                                  return   false;  
                          }  
                  }  
  Top

5 楼ParadiseX(夜.夜.夜.夜)回复于 2005-01-24 12:36:02 得分 0

好啊,找这种资料很久了Top

6 楼cfmowh(.NET新手)回复于 2005-01-25 16:50:34 得分 0

感谢   soochowgreen(Green)    
  Top

7 楼soochowgreen(Green)回复于 2005-01-31 09:39:22 得分 0

to     cfmowh(.NET新手)   :不谢,共同进步。Top

相关问题

  • 怎样读取mp3文件和wma文件的信息?像winamp中的文件信息一样?
  • 如何读取wmv/wma/asf格式视频的分辨率
  • VB中怎么读取WMA文件的TAG信息?
  • 请问,那边有读取wma文件的例子
  • 文件读取?
  • 读取文件?
  • 读取数据
  • 如何读取
  • session 读取(C#)
  • DLL的读取

关键词

  • mp3
  • 文件
  • 文件名
  • 信息
  • 结构
  • info
  • 歌曲
  • seekpos
  • filepath
  • artist

得分解答快速导航

  • 帖主:cfmowh
  • soochowgreen

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo