C# 獲取 mp3文件信息【包括:文件大小、歌曲長度、歌手、專輯】
阿新 • • 發佈:2019-02-11
ack use 錯誤 class download ssa ability req state
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 即可; //如果是1.0版本會報錯請下載1.2版本 下載地址
https://download.csdn.net/download/u013087481/10952812
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; } }
C# 獲取 mp3文件信息【包括:文件大小、歌曲長度、歌手、專輯】