Vor einiger Zeit habe ich eine kleine Website im lokalen Netzwerk erstellt, und einer der Bereiche befasste sich mit der Online-Wiedergabe von Musik. Im Hinblick auf die Bequemlichkeit zukünftiger Wartungsarbeiten haben wir beschlossen, die MP3-Dateien je nach Album in verschiedenen Verzeichnissen zu speichern. Verwenden Sie dann ein Programm, um das Verzeichnis zu überwachen, in dem MP3s gespeichert sind, speichern Sie die Informationen jeder MP3-Datei in der Datenbank und verwenden Sie die ASP.NET-Seite, um dem Benutzer die MP3-Dateiinformationen anzuzeigen. Obwohl es nicht schwierig ist, .NET zum Lesen der Informationen von MP3-Dateien zu verwenden, erfordert es auch viele Fähigkeiten, sodass der Prozess organisiert und mit allen geteilt werden kann.
Schauen wir uns zunächst an, wo die MP3-Songinformationen gespeichert sind. MP3-Dateien enthalten einen Tag namens ID3. Es gibt eigentlich zwei Tags, einer heißt ID3v1 und der andere heißt ID3v2. Der Einfachheit halber stellen wir hier nur ID3v1 vor.
Die ID3V1-Struktur ist relativ einfach und wird am Ende der MP3-Datei gespeichert. Sie können eine MP3-Datei mit einem Hexadezimaleditor öffnen. Achten Sie auf die 128 Bytes, die am Ende definiert sind wie folgt:
Name Position Länge Inhalt
Kopfzeile 1-3 3 Tag-Kopfzeile
Titel 4-33 30 Titel
Künstler 34-63 30 Künstler
Album 64-93 30 Albumjahr
94-97 4 Produktionsjahr
Kommentar 98-127 30 Bemerkungen
Mitte 128 1 Typ
Hinweis: Der obige Tag-Header muss „TAG“ sein, andernfalls
werden die Informationen von ID3v1 der Reihe nach gespeichert. Wenn die Länge einer Information kürzer ist Wenn die Länge größer als die Standardlänge ist, verwenden Sie zum Hinzufügen „ “. Eine Ausnahme bildet das Genre, das ein Byte zur Darstellung des Liedgenres verwendet. Die entsprechende Tabelle sieht wie folgt aus (da zu viel Inhalt vorhanden ist, werden nur die ersten 50 Elemente aufgeführt):
0="Blues"
1="ClassicRock"
2="Country"
3="Dance"
4="Disco"
5="Funk"
6="Grunge"
7="Hip-Hop"
8="Jazz"
9=" Metal“
10="NewAge"
11="Oldies"
12="Other"
13="Pop"
14="R&B"
15="Rap"
16="Reggae"
17="Rock"
18="Techno"
19=" Industrial"
20="Alternative"
21="Ska"
22="DeathMetal"
23="Pranks"
24="Soundtrack"
25="Euro-Techno"
26="Ambient"
27="Trip-Hop"
28="Vocal "
29="Jazz+Funk"
30="Fusion"
31="Trance"
32="Klassik"
33="Instrumental"
34="Acid"
35="House"
36="Game"
37="SoundClip"
38= „Gospel“
39="Noise"
40="AlternRock"
41="Bass"
42="Soul"
43="Punk"
44="Space"
45="Meditative"
46="InstrumentalPop"
47="InstrumentalRock"
48= „Ethnisch“
49="Gothic"
50="Darkwave"
Nachdem wir die Struktur der Speicherung von MP3-Songinformationen kennen, können wir den entsprechenden Code schreiben.
Definieren Sie zunächst eine MP3Info-Klasse:
1 Öffentliche Klasse Mp3Info
2
3
4
5 Private Const TAGLEN As Integer = 128
6
7
8
9 Privates _MP3Tag As String = String.Empty
10
11 Private _Artist As String = String.Empty
12
13 Private _Title As String = String.Empty
14
15 Private _Album As String = String.Empty
16
17 Private _Comment As String = String.Empty
18
19 Private _Year As String = String.Empty
20
21 Private _Genre As String = String.Empty
zweiundzwanzig
23Private_GenreIDAsByte
vierundzwanzig
25
26
27 Private Genres() As String = {"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", _
28
29 „Hip-Hop“, „Jazz“, „Metal“, „New Age“, „Oldies“, „Andere“, „Pop“, „R&B“, „Rap“, „Reggae“, „Rock“, _
30
31 „Techno“, „Industrial“, „Alternative“, „Ska“, „Death Metal“, „Pranks“, „Soundtrack“, „Euro-Techno“, _
32
33 „Ambient“, „Trip-Hop“, „Vocal“, „Jazz+Funk“, „Fusion“, „Trance“, „Klassik“, „Instrumental“, „Acid“, _
34
35 „House“, „Game“, „Sound Clip“, „Gospel“, „Noise“, „AlternRock“, „Bass“, „Soul“, „Punk“, „Space“, _
36
37 „Meditative“, „Instrumental Pop“, „Instrumental Rock“, „Ethnic“, „Gothic“, „Darkwave“, „Techno-Industrial“, _
38
39 „Electronic“, „Pop-Folk“, „Eurodance“, „Dream“, „Southern Rock“, „Comedy“, „Cult“, „Gangsta“, „Top 40“, _
40
41 „Christian Rap“, „Pop/Funk“, „Jungle“, „Native American“, „Cabaret“, „New Wave“, „Psychedelic“, „Rave“, _
42
43 „Showtunes“, „Trailer“, „Lo-Fi“, „Tribal“, „Acid Punk“, „Acid Jazz“, „Polka“, „Retro“, „Musical“, _
44
45 „Rock & Roll“, „Hard Rock“, „Folk“, „Folk/Rock“, „National Folk“, „Swing“, „Bebob“, „Latin“, „Revival“, _
46
47 „Celtic“, „Bluegrass“, „Avantgarde“, „Gothic Rock“, „Progressive Rock“, „Psychedelic Rock“, „Symphonic Rock“, _
48
49 „Slow Rock“, „Big Band“, „Chorus“, „Easy Listening“, „Acoustic“, „Humour“, „Speech“, „Chanson“, „Opera“, _
50
51 „Chamber Music“, „Sonata“, „Symphony“, „Booty Bass“, „Primus“, „Porn Groove“, „Satire“, „Slow Jam“, „Club“, _
52
53 „Tango“, „Samba“, „Folklore“}
54
55
56
57 Öffentliche Eigenschaft MP3Tag() als String
58
59 Erhalten
60
61 _MP3Tag zurückgeben
62
63 End Get
64
65 Set(ByVal value As String)
66
67 _MP3Tag = value.Trim
68
69 Endset
70
71 Ende Eigentum
72
73
74
75 Public Property Title() als String
76
77 Erhalten
78
79 _Title zurückgeben
80
81 End Get
82
83 Set(ByVal value As String)
84
85 _Title = value.Trim
86
87 Endsatz
88
89 Ende Eigentum
90
91
92
93 Public Property Artist() als String
94
95 Erhalten
96
97 Zurück _Künstler
98
99 End Get
100
101 Set(ByVal-Wert als String)
102
103 _Artist = value.Trim
104
105 Endsatz
106
107 Ende Eigentum
108
109
110
111 Public Property Album() als String
112
113 Holen
114
115 Return_Album
116
117 End Get
118
119 Set(ByVal value As String)
120
121 _Album = value.Trim
122
123 Endset
124
125 Ende Eigentum
126
127
128
129 Öffentliches Eigentum Comment() als String
130
131 Erhalten
132
133 Return_Comment
134
135 End Get
136
137 Set(ByVal value As String)
138
139 _Comment = value.Trim
140
141 Endsatz
142
143 Ende Eigentum
144
145
146
147 Öffentliches Eigentum Genre() als String
148
149 Erhalten
150
151 Return_Genre
152
153 End Get
154
155 Set(ByVal value As String)
156
157 _Genre = value.Trim
158
159 Endset
160
161 Ende Eigentum
162
163
164
165 Öffentliches Eigentum GenreID() als Byte
166
167 Erhalten
168
169 Return_GenreID
170
171 End Get
172
173 Set(ByVal-Wert als Byte)
174
175 _GenreID = Wert
176
177 Endset
178
179 Ende Eigentum
180
181
182
183 Public Property Year() als String
184
185 Erhalten
186
187 Rückgabe _Jahr
188
189 End Get
190
191 Set(ByVal-Wert als String)
192
193 _Year = value.Trim
194
195 Endset
196
197 Ende Eigentum
198
199 Abschlussklasse
200
201
202
203 Die obige Klasse enthält nur die Datenstruktur, die MP3-Songinformationen entspricht. Wir müssen auch einen spezifischen Prozess zum Lesen von MP3-Dateiinformationen hinzufügen:
204
205
206
207 Öffentliche Funktion GetMp3FileInfo(ByVal fname As String) As Boolean
208
209
210
211 'Öffnen Sie den Dateistream
212
213 msfile als FileStream dimmen
214
215 Versuchen Sie es
216
217 msfile = New FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
218
219 Wenn nicht (msfile.CanRead) Dann
220
221 Neue IO.IOException auslösen („Datei konnte nicht gelesen werden:“ + fname)
222
223 Ende wenn
224
225 Ex als Ausnahme fangen
226
227 Throw New IO.IOException("Beim Lesen der Datei ist ein Fehler aufgetreten!" + Ex.Message)
228
229 Versuch beenden
230
231
232
233 Dim ID3(TAGLEN - 1) als Byte
234
235 BinReader als BinaryReader dimmen
236
237 DimStrInfoAsString
238
239
240
241 'BinaryReader zum Lesen von Informationen verwenden
242
243 BinReader = Neuer BinaryReader(msfile)
244
245
246
247 msfile.Position = 0
248
249 msfile.Seek(-TAGLEN, SeekOrigin.End)
250
251
252
253 StrInfo = CBytesToString(BinReader.ReadBytes(3))
254
255
256
257 'Bestimmen Sie, ob der Tag-Header TAG ist
258
259 Wenn StrInfo.ToUpper = "TAG" Dann
260
261
262
263 'Titelinformationen lesen
264
265 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
266
267 _Title = StrInfo
268
269
270
271 'Künstlerinformationen lesen
272
273 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
274
275 _Artist = StrInfo
276
277
278
279 'Albuminformationen lesen
280
281 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
282
283 _Album = StrInfo
284
285
286
287 'Informationen zum Erscheinungsjahr lesen
288
289 StrInfo = CBytesToString(BinReader.ReadBytes(4)).Replace(Chr(0), "")
290
291 _Year = StrInfo
292
293
294
295 'Bemerkungsinformationen lesen
296
297 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
298
299 _Comment = StrInfo
300
301
302
303 'Informationen zum Liedgenre lesen
304
305 _GenreID = BinReader.ReadByte
306
307
308
309 Ende wenn
310
311
312
313 BinReader.Close()
314
315 msfile.Close()
316
317
318
319 Endfunktion
320
321
322
323 'Wird zur Konvertierung der Codierung verwendet, um verstümmelte chinesische Zeichen zu verhindern
324
325 Private Funktion CBytesToString(ByVal Bytes() As Byte) As String
326
327 'Beachten Sie, dass die Kodierung hier verarbeitet werden muss, um verstümmelte Zeichen zu verhindern.
328
329 Dim GbCode As Encoding = Encoding.GetEncoding("gb2312")
330
331 Wenn Bytes.Length > 0, dann
332
333 GbCode.GetString(Bytes) zurückgeben
334
335 Sonst
336
337 Return String.Empty
338
339 Ende wenn
340
341 Endfunktion
Wir können ein einfaches Konsolenprogramm verwenden, um zu veranschaulichen, wie die Mp3Info-Klasse verwendet wird. Erstellen Sie mit Visual Studio 2005 Express ein Konsolenprogramm:
1 Modul Modul1
2
3
4
5 Sub
6
7
8
9 Dim Mp3 As New Mp3Info("D:MusicTop 40 Singles39 Embrace - Natures Law.mp3")
10
11
12
13 Console.WriteLine("Titel: " + Mp3.Titel)
14
15 Console.WriteLine("Artist: " + Mp3.Artist)
16
17 Console.WriteLine("Album: " + Mp3.Album)
18
19 Console.Read()
20
21 Ende Sub
zweiundzwanzig
dreiundzwanzig
24 Endmodul
Nach dem Ausführen des Programms lautet die Ausgabe:
Titel: Nature's Law
Künstler: Embrace
Album: DHZ.INC
Genre: Blues
In diesem Artikel wird nur die ID3v1 von MP3 erläutert. Tatsächlich enthalten viele MP3s jedoch nicht nur ID3v1-Informationen, sondern auch ID3v2-Informationen.
Aber ID3v2 ist komplizierter als ID3v1. Die Verarbeitung von ID3v2 muss warten, bis ich das nächste Mal Zeit habe, es zu schreiben.