C# 获取 mp3文件信息
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-NAME 0 => Name 1 => Size // MP3 文件大小 2 => Type 3 => Date modified 4 => Date created 5 => Date accessed 6 => Attributes 7 => Offline status 8 => Offline availability 9 => Perceived type 10 => Owner 11 => Kinds 12 => Date taken 13 => Artists // MP3 歌手 14 => Album // MP3 专辑 15 => Year 16 => Genre 17 => Conductors 18 => Tags 19 => Rating 20 => Authors 21 => Title // MP3 歌曲名 22 => Subject 23 => Categories 24 => Comments 25 => Copyright 26 => # 27 => Length // MP3 时长 28 => Bit rate 29 => Protected 30 => Camera model 31 => Dimensions 32 => Camera maker 33 => Company 34 => File description 35 => Program name 36 => Duration 37 => Is online 38 => Is recurring 39 => Location 40 => Optional attendee addresses 41 => Optional attendees 42 => Organizer address 43 => Organizer name 44 => Reminder time 45 => Required attendee addresses 46 => Required attendees 47 => Resources 48 => Free/busy status 49 => Total size 50 => Account name 51 => Computer 52 => Anniversary 53 => Assistant's name 54 => Assistant's phone 55 => Birthday 56 => Business address 57 => Business city 58 => Business country/region 59 => Business P.O. box 60 => Business postal code 61 => Business state or province 62 => Business street 63 => Business fax 64 => Business home page 65 => Business phone 66 => Callback number 67 => Car phone 68 => Children 69 => Company main phone 70 => Department 71 => E-mail Address 72 => E-mail2 73 => E-mail3 74 => E-mail list 75 => E-mail display name 76 => File as 77 => First name 78 => Full name 79 => Gender 80 => Given name 81 => Hobbies 82 => Home address 83 => Home city 84 => Home country/region 85 => Home P.O. box 86 => 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;//保留位,一个字节 } /// <summary> /// mp3类 /// </summary> 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; } //上面程序用到下面的方法: /// <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; } }