首页 > 代码库 > c#读取MP3、wmv等格式歌曲信息

c#读取MP3、wmv等格式歌曲信息

这几天闲着无聊,想做个简单的KTV管理系统!查阅资料才知道歌曲本身自带歌曲的详细信息。于是查阅了相关资料并且不断摸索,对网上的两种方法做了简单的验证。结果如下:

 

代码1:

1 ShellClass sh = new ShellClass();2             Folder dir = sh.NameSpace(Path.GetDirectoryName(file));3             FolderItem item = dir.ParseName(Path.GetFileName(file));4             string str = dir.GetDetailsOf(item, 27) ; // 获取歌曲时长。5             MessageBox.Show(str);6  7 // 如果执行过程中,出现是错误提示,通过Shell32 的 Embed Interop Types 属性设置为 False 即可;

这这种方法得到了验证,是可行的!主要是利用windows自带的com组件调用!

对于shell。dll库具体说明如下:

首先引用COM组件Microsoft Shell Controls And Automation这里需要注意DLL的属性Embed Interop Type 设为False否则会引起互操作类型异常 代码如下ShellClass sh = new ShellClass();Folder dir = sh.NameSpace(Path.GetDirectoryName(sFile));FolderItem item = dir.ParseName(Path.GetFileName(sFile));string det = dir.GetDetailsOf(item, iCol); iCol 对应文件详细属性汇总ID  => DETAIL-NAME0   => Name1   => Size     // MP3 文件大小2   => Type3   => Date modified4   => Date created5   => Date accessed6   => Attributes7   => Offline status8   => Offline availability9   => Perceived type10  => Owner11  => Kinds12  => Date taken13  => Artists   // MP3 歌手14  => Album     // MP3 专辑15  => Year16  => Genre17  => Conductors18  => Tags19  => Rating20  => Authors21  => Title     // MP3 歌曲名22  => Subject23  => Categories24  => Comments25  => Copyright26  => #27  => Length    // MP3 时长28  => Bit rate29  => Protected30  => Camera model31  => Dimensions32  => Camera maker33  => Company34  => File description35  => Program name36  => Duration37  => Is online38  => Is recurring39  => Location40  => Optional attendee addresses41  => Optional attendees42  => Organizer address43  => Organizer name44  => Reminder time45  => Required attendee addresses46  => Required attendees47  => Resources48  => Free/busy status49  => Total size50  => Account name51  => Computer52  => Anniversary53  => Assistants name54  => Assistants phone55  => Birthday56  => Business address57  => Business city58  => Business country/region59  => Business P.O. box60  => Business postal code61  => Business state or province62  => Business street63  => Business fax64  => Business home page65  => Business phone66  => Callback number67  => Car phone68  => Children69  => Company main phone70  => Department71  => E-mail Address72  => E-mail273  => E-mail374  => E-mail list75  => E-mail display name76  => File as77  => First name78  => Full name79  => Gender80  => Given name81  => Hobbies82  => Home address83  => Home city84  => Home country/region85  => Home P.O. box86  => Home postal code

 

 

第二种方法 是利用自己编写的函数!总所周知,歌曲信息往往存在二进制文件最后的128个字节中,我们可以通过字节操作来获取对应的信息。代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace GetVideoInfor{    class Class1    {          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;//保留位,一个字节          }           /// <summary>          /// 获取MP3文件最后128个字节          /// </summary>          /// <param name="FileName">文件名</param>        /// <returns>返回字节数组</returns>          public 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;          }         public string ReadAuthor(Stream binary_file)          {             System.Text.Encoding encoding = System.Text.Encoding.UTF8;             // Read string from binary file with UTF8 encoding             byte[] buffer = new byte[30];             binary_file.Read(buffer, 0, 30);             return encoding.GetString(buffer);         }          /// <summary>          /// 获取MP3歌曲的相关信息          /// </summary>          /// <param name = "Info">从MP3文件中截取的二进制信息</param>          /// <returns>返回一个Mp3Info结构</returns>         public 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("#CONTENT#") >= 0 ? str.IndexOf("#CONTENT#") : str.Length);//去掉无用字符                          return str;           // byte[] bs = { 97, 98, 99, 100, 101, 102 };           // string str = System.Text.Encoding.ASCII.GetString(b);           // 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;             }         }         private string DeleteNotvalue(string p)         {             throw new NotImplementedException();         } 

值得说明的是这种方法我没有成功,不知道是不是因为转换的原因 还是其他什么,倒腾了很久都没有结果!

 

c#读取MP3、wmv等格式歌曲信息