本文實例講述了C#實現獲取mp3 Tag信息的方法。分享給大家供大家參考,具體如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Foxer_Player_1._1 { 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 Mp3FileInfo { Mp3Info info; /// <summary> /// 構造函數,輸入文件名即得到信息 /// </summary> /// <param name="mp3FilePos"></param> public Mp3FileInfo(String mp3FilePos) { info = getMp3Info(getLast128(mp3FilePos)); } /// <summary> /// 獲取整理后的Mp3文件名,這里以標題和藝術家名定文件名 /// </summary> /// <returns></returns> public String GetOriginalName() { return formatString(info.Title.Trim()) + "-" + formatString(info.Artist.Trim()); } /// <summary> /// 去除\0字符 /// </summary> /// <param name="str"></param> /// <returns></returns> private static String formatString(String str) { return str.Replace( "\0" , "" ); } /// <summary> /// 獲取MP3文件最后128個字節 /// </summary> /// <param name="FileName">文件名</param> /// <returns>返回字節數組</returns> public static 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; } /// <summary> /// 獲取MP3歌曲的相關信息 /// </summary> /// <param name = "Info">從MP3文件中截取的二進制信息</param> /// <returns>返回一個Mp3Info結構</returns> public static 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 = Foxer_Player_1._1.Mp3FileInfo.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 = Foxer_Player_1._1.Mp3FileInfo.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 = Foxer_Player_1._1.Mp3FileInfo.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 = Foxer_Player_1._1.Mp3FileInfo.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 = Foxer_Player_1._1.Mp3FileInfo.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> public static 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; } } } |
希望本文所述對大家C#程序設計有所幫助。