C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】
第一种方式:[代码已验证]
// http://bbs.csdn.net/topics/390392612
string
file =
@"E:\滴答.mp3"
;
ShellClass sh =
new
ShellClass();
Folder dir = sh.NameSpace(Path.GetDirectoryName(file));
FolderItem item = dir.ParseName(Path.GetFileName(file));
string
str = dir.GetDetailsOf(item, 27) ; // 获取歌曲时长。
MessageBox.Show(str);
// 如果执行过程中,出现是错误提示,通过 Shell32 的 Embed Interop Types 属性设置为 False 即可;
shell 获取 文件详细信息
首先引用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 => Assistant's name54 => Assistant's 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
//第二种方式: 读取文件结构获取 MP3文件信息 [代码未验证]
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类 /// public class clsMP3 { public void fLogSave(Page _sender, Hashtable _htUser) { } //所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下: 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结构中返回: private Mp3Info getMp3Info(byte[] Info) { Mp3Info mp3Info = new Mp3Info(); string str = null; int i; int position = 0;//循环的起始值 int currentIndex = 0;//Info的当前索引值 //获取TAG标识(数组前3个) for (i = currentIndex; i < currentIndex + 3; i++) { str = str + (char)Info[i]; position++; } currentIndex = position; mp3Info.identify = str; //获取歌名(数组3-32) 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); //获取歌手名(数组33-62) 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); //获取唱片名(数组63-92) 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); //获取年 (数组93-96) 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); //获取注释(数组97-124) 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); //以下获取保留位(数组125-127) mp3Info.reserved1 = (char)Info[++position]; mp3Info.reserved2 = (char)Info[++position]; mp3Info.reserved3 = (char)Info[++position]; return mp3Info; } //上面程序用到下面的方法: ////// 将字节数组转换成字符串 /// /// 字节数组 ///返回转换后的字符串 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; } }