เมื่อไม่นานมานี้ ฉันได้สร้างเว็บไซต์เล็กๆ บนเครือข่ายท้องถิ่น และส่วนหนึ่งในส่วนที่เกี่ยวข้องกับการเล่นเพลงออนไลน์ เมื่อพิจารณาถึงความสะดวกในการบำรุงรักษาในอนาคต เราจึงตัดสินใจจัดเก็บไฟล์ mp3 ไว้ในไดเรกทอรีต่างๆ ตามอัลบั้ม จากนั้นใช้โปรแกรมเพื่อตรวจสอบไดเร็กทอรีที่เก็บ mp3 เก็บข้อมูลของไฟล์ mp3 แต่ละไฟล์ในฐานข้อมูล และใช้เพจ ASP.NET เพื่อนำเสนอข้อมูลไฟล์ mp3 แก่ผู้ใช้ แม้ว่าการใช้ .NET เพื่ออ่านข้อมูลไฟล์ MP3 จะไม่ใช่เรื่องยาก แต่ก็ต้องใช้ทักษะมากมายเช่นกัน ดังนั้นกระบวนการนี้จึงได้รับการจัดระเบียบและแบ่งปันกับทุกคน
ก่อนอื่น เรามาดูกันว่าข้อมูลเพลง MP3 เก็บไว้ที่ไหน ไฟล์ MP3 มีแท็กชื่อ ID3 จริงๆ แล้วมีสองแท็ก แท็กหนึ่งเรียกว่า ID3v1 และอีกแท็กเรียกว่า ID3v2 เพื่อความเรียบง่าย เราขอแนะนำ ID3v1 ที่นี่เท่านั้น
โครงสร้าง ID3V1 ค่อนข้างง่ายและถูกเก็บไว้ที่ส่วนท้ายของไฟล์ MP3 คุณสามารถใช้โปรแกรมแก้ไขเลขฐานสิบหก (เช่น UltraEdit) เพื่อเปิดไฟล์ MP3 ให้ความสนใจกับขนาด 128 ไบต์ที่ส่วนท้าย ดังต่อไปนี้:
ชื่อ ตำแหน่ง ความยาว เนื้อหา
ส่วนหัว 1-3 3 ส่วนหัวของแท็ก
ชื่อ 4-33 30 ตำแหน่ง
ศิลปิน 34-63 30อัลบั้ม
ศิลปิน
64-93 30 อัลบั้มปี 94-97 4 ปีที่ผลิต
ความคิดเห็น 98-127 30 หมายเหตุ
ศูนย์ 128 1 ประเภท
หมายเหตุ: ส่วนหัวของแท็กด้านบนต้องเป็น "TAG" มิฉะนั้นจะไม่มี
การจัดเก็บข้อมูลของ ID3v1 ตามลำดับ จะไม่มีเครื่องหมายสิ้นสุดหลังข้อมูลแต่ละชิ้น เกินความยาวมาตรฐาน ให้ใช้ " " เพื่อเพิ่ม ประเภทเป็นข้อยกเว้น ใช้หนึ่งไบต์เพื่อแสดงประเภทเพลงดังต่อไปนี้ (เนื่องจากมีเนื้อหามากเกินไป จึงแสดงรายการเพียง 50 รายการแรกเท่านั้น):
0="บลูส์"
1="ClassicRock"
2="
คันทรี่" 3="เต้นรำ
" 4="ดิสโก้"
5="ฟังก์"
6="กรันจ์"
7="ฮิปฮอป"
8="แจ๊ส"
9=" โลหะ"
10="NewAge"
11="เพลงเก่า"
12="อื่นๆ"
13="ป๊อป"
14="อาร์แอนด์บี"
15="แร็พ"
16="เร้กเก้"
17="ร็อค"
18="เทคโน"
19=" Industrial"
20="อัลเทอร์เนทีฟ"
21="Ska"
22="DeathMetal"
23="แกล้งกัน"
24="เพลงประกอบ"
25="ยูโร-เทคโน"
26="แอมเบียนต์"
27="ทริป-ฮอป"
28="เสียงร้อง "
29="Jazz+Funk"
30="Fusion"
31="Trance"
32="Classical"
33="Instrumental"
34="Acid"
35="House"
36="เกม"
37="SoundClip"
38= "Gospel"
39="นอยส์"
40="AlternRock"
41="เบส"
42="โซล"
43="พังก์"
44="อวกาศ"
45="ชอบคิด"
46="InstrumentalPop"
47="InstrumentalRock"
48= "ชาติพันธุ์"
49="โกธิค"
50="คลื่นมืด"
หลังจากที่ทราบโครงสร้างของการจัดเก็บข้อมูลเพลง MP3 แล้ว เราก็สามารถเขียนโค้ดที่เกี่ยวข้องได้
ขั้นแรกให้กำหนดคลาส MP3Info:
Mp3Info คลาสสาธารณะ 1 รายการ
2
3
4
5 ส่วนตัว Const TAGLEN เป็นจำนวนเต็ม = 128
6
7
8
9 ส่วนตัว _MP3Tag As String = String.Empty
10
11 ส่วนตัว _Artist As String = String.Empty
12
13 ส่วนตัว _Title As String = String.Empty
14
15 ส่วนตัว _Album As String = String.Empty
16
17 ส่วนตัว _Comment As String = String.Empty
18
19 ส่วนตัว _Year As String = String.Empty
20
21 ส่วนตัว _ประเภทเป็นสตริง = String.Empty
ยี่สิบสอง
23Private_GenreIDAsByte
ยี่สิบสี่
25
26
27 แนวเพลงส่วนตัว() As String = {"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", _
28
29 "ฮิปฮอป", "แจ๊ส", "เมทัล", "ยุคใหม่", "เนียร์", "อื่นๆ", "ป๊อป", "อาร์แอนด์บี", "แร็พ", "เร้กเก้", "ร็อค", _
30
31 "เทคโน", "อุตสาหกรรม", "อัลเทอร์เนทีฟ", "สกา", "เดธเมทัล", "เล่นแผลง ๆ", "เพลงประกอบ", "ยูโรเทคโน", _
32
33 "บรรยากาศ", "ทริป-ฮอป", "เสียงร้อง", "แจ๊ส+ฟังก์", "ฟิวชั่น", "มึนงง", "คลาสสิก", "เครื่องดนตรี", "กรด", _
34
35 "บ้าน", "เกม", "คลิปเสียง", "พระกิตติคุณ", "เสียงรบกวน", "AlternRock", "เบส", "โซล", "พังค์", "อวกาศ", _
36
37 "ชอบคิด", "ดนตรีป๊อป", "ดนตรีร็อค", "ชาติพันธุ์", "โกธิค", "Darkwave", "เทคโน-อุตสาหกรรม", _
38
39 "อิเล็กทรอนิกส์", "ป๊อปโฟล์ค", "ยูโรแดนซ์", "ความฝัน", "ร็อคใต้", "ตลก", "ลัทธิ", "อันธพาล", "ท็อป 40", _
40
41 "คริสเตียนแร็พ", "ป๊อป/ฟังก์", "จังเกิ้ล", "ชนพื้นเมืองอเมริกัน", "คาบาเร่ต์", "คลื่นลูกใหม่", "ประสาทหลอน", "คลั่ง", _
42
43 "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", _
44
45 "ร็อกแอนด์โรล", "ฮาร์ดร็อค", "โฟล์ค", "โฟล์ค/ร็อค", "โฟล์กแห่งชาติ", "สวิง", "บีบ๊อบ", "ละติน", "การฟื้นฟู", _
46
47 "เซลติก", "บลูกราสส์", "เปรี้ยวจี๊ด", "โกธิคร็อค", "โปรเกรสซีฟร็อค", "ร็อคประสาทหลอน", "ซิมโฟนิกร็อค", _
48
49 "ร็อคช้า", "บิ๊กแบนด์", "คอรัส", "ฟังง่าย", "อะคูสติก", "อารมณ์ขัน", "คำพูด", "ชานสัน", "โอเปร่า", _
50
51 "เพลงแชมเบอร์", "โซนาต้า", "ซิมโฟนี", "Booty Bass", "Primus", "Porn Groove", "เสียดสี", "Slow Jam", "คลับ", _
52
53 "แทงโก้", "แซมบ้า", "นิทานพื้นบ้าน"}
54
55
56
57 ทรัพย์สินสาธารณะ MP3Tag() เป็นสตริง
58
59 รับ
60
61 กลับ _MP3Tag
62
63 จบรับ
64
65 ชุด (ค่า ByVal เป็นสตริง)
66
67 _MP3Tag = ค่าตัดแต่ง
68
69 จบเซต
70
71 ทรัพย์สินสุดท้าย
72
73
74
75 ชื่อทรัพย์สินสาธารณะ() เป็นสตริง
76
77 ได้
78
79 กลับ_ชื่อเรื่อง
80
81 จบรับ
82
83 ชุด (ค่า ByVal เป็นสตริง)
84
85 _หัวข้อ = ค่าตัดแต่ง
86
87 จบเซต
88
89 เอนด์ พร็อพเพอร์ตี้
90
91
92
93 ศิลปินทรัพย์สินสาธารณะ () เป็นสตริง
94
95 รับ
96
97 กลับ_ศิลปิน
98
99 จบรับ
100
101 ชุด (ค่า ByVal เป็นสตริง)
102
103 _Artist = ค่าตัดแต่ง
104
105 ชุดท้าย
106
107 ทรัพย์สินสุดท้าย
108
109
110
111 อัลบั้มทรัพย์สินสาธารณะ () เป็นสตริง
112
113 รับ
114
115 รีเทิร์น_อัลบั้ม
116
117 จบรับ
118
119 ชุด (ค่า ByVal เป็นสตริง)
120
121 _Album = ค่าตัดแต่ง
122
123 ชุดท้าย
124
125 ทรัพย์สินสุดท้าย
126
127
128
129 ความคิดเห็นเกี่ยวกับทรัพย์สินสาธารณะ () เป็นสตริง
130
131 รับ
132
133 กลับ_ความคิดเห็น
134
135 จบรับ
136
137 ชุด (ค่า ByVal เป็นสตริง)
138
139 _ความคิดเห็น = ค่าตัดแต่ง
140
141 ชุดท้าย
142
143 ทรัพย์สินสุดท้าย
144
145
146
147 ประเภททรัพย์สินสาธารณะ () เป็นสตริง
148
149 รับ
150
151 กลับ_ประเภท
152
153 จบรับ
154
155 ชุด (ค่า ByVal เป็นสตริง)
156
157 _ประเภท = ค่าตัดแต่ง
158
159 ชุดท้าย
160
161 ทรัพย์สินสุดท้าย
162
163
164
165 GenreID ทรัพย์สินสาธารณะ () เป็นไบต์
166
167 รับ
168
169 Return_GenreID
170
171 สิ้นสุดการรับ
172
173 ชุด (ค่า ByVal เป็นไบต์)
174
175 _GenreID = ค่า
176
177 ชุดท้าย
178
179 ทรัพย์สินสุดท้าย
180
181
182
183 ปีทรัพย์สินสาธารณะ() เป็นสตริง
184
185 รับ
186
187 กลับ_ปี
188
189 จบรับ
190
191 ชุด (ค่า ByVal เป็นสตริง)
192
193 _ปี = ค่าตัดแต่ง
194
195 จบเซต
196
197 ทรัพย์สินสุดท้าย
198
199 จบคลาส
200
201
202
203 คลาสข้างต้นมีเพียงโครงสร้างข้อมูลที่สอดคล้องกับข้อมูลเพลง MP3 เท่านั้น เรายังจำเป็นต้องเพิ่มกระบวนการเฉพาะสำหรับการอ่านข้อมูลไฟล์ MP3:
204
205
206
207 ฟังก์ชั่นสาธารณะ GetMp3FileInfo (ByVal fname As String) เป็นบูลีน
208
209
210
211 'เปิดไฟล์สตรีม
212
213 Dim msfile เป็น FileStream
214
215 ลอง.
216
217 msfile = FileStream ใหม่ (fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
218
219 ถ้าไม่ใช่ (msfile.CanRead) แล้ว
220
221 โยน IO.IOException ใหม่ ("ไม่สามารถอ่านไฟล์:" + fname)
222
223 สิ้นสุดถ้า
224
225 จับ Ex เป็นข้อยกเว้น
226
227 โยน IO.IOException ใหม่ ("เกิดข้อผิดพลาดขณะอ่านไฟล์!" + Ex.Message)
228
229 ยุติการลอง
230
231
232
233 Dim ID3(TAGLEN - 1) เป็นไบต์
234
235 Dim BinReader เป็น BinaryReader
236
237 DimStrInfoAsString
238
239
240
241 'ใช้ BinaryReader เพื่ออ่านข้อมูล
242
243 BinReader = BinaryReader ใหม่ (msfile)
244
245
246
247 msfile ตำแหน่ง = 0
248
249 msfile.Seek(-TAGLEN, SeekOrigin.End)
250
251
252
253 StrInfo = CBytesToString(BinReader.ReadBytes(3))
254
255
256
257 'ตรวจสอบว่าส่วนหัวแท็กเป็น TAG หรือไม่
258
259 ถ้า StrInfo.ToUpper = "TAG" แล้ว
260
261
262
263 'อ่านข้อมูลชื่อเรื่อง
264
265 StrInfo = CBytesToString(BinReader.ReadBytes(30)).แทนที่(Chr(0), "")
266
267 _หัวข้อ = StrInfo
268
269
270
271 'อ่านข้อมูลศิลปิน
272
273 StrInfo = CBytesToString(BinReader.ReadBytes(30)).แทนที่(Chr(0), "")
274
275 _ศิลปิน = StrInfo
276
277
278
279 'อ่านข้อมูลอัลบั้ม
280
281 StrInfo = CBytesToString(BinReader.ReadBytes(30)).แทนที่(Chr(0), "")
282
283 _อัลบั้ม = STRInfo
284
285
286
287 'อ่านข้อมูลปีที่ตีพิมพ์
288
289 StrInfo = CBytesToString(BinReader.ReadBytes(4)).แทนที่(Chr(0), "")
290
291 _ปี = STRInfo
292
293
294
295 'อ่านข้อมูลหมายเหตุ
296
297 StrInfo = CBytesToString(BinReader.ReadBytes(30)).แทนที่(Chr(0), "")
298
299 _ความคิดเห็น = StrInfo
300
301
302
303 'อ่านข้อมูลแนวเพลง
304
305 _GenreID = BinReader.ReadByte
306
307
308
309 สิ้นสุดถ้า
310
311
312
313 BinReader.ปิด()
314
315 msfile.ปิด()
316
317
318
319 สิ้นสุดฟังก์ชัน
320
321
322
323 'ใช้ในการแปลงการเข้ารหัสเพื่อป้องกันอักขระที่อ่านไม่ออกของจีน
324
325 ฟังก์ชั่นส่วนตัว CBytesToString (ByVal Bytes () As Byte) As String
326
327 'โปรดทราบว่าการเข้ารหัสจำเป็นต้องได้รับการประมวลผลที่นี่เพื่อป้องกันอักขระที่อ่านไม่ออก
328
329 Dim GbCode เป็นการเข้ารหัส = Encoding.GetEncoding("gb2312")
330
331 ถ้า Bytes.Length > 0 แล้ว
332
333 กลับ GbCode.GetString (ไบต์)
334
335 อย่างอื่น
336
337 Return String.Empty
338
339 สิ้นสุดถ้า
340
341 สิ้นสุดฟังก์ชัน
เราสามารถใช้โปรแกรม Console ธรรมดาเพื่อแสดงวิธีใช้คลาส Mp3Info ใช้ Visual Studio 2005 Express สร้างโปรแกรมคอนโซล:
1 โมดูล โมดูล1
2
3
4
5 ย่อย
6
7
8
9 Dim Mp3 As New Mp3Info("D:MusicTop 40 Singles39 Embrace - Natures Law.mp3")
10
11
12
13 Console.WriteLine("หัวข้อ : " + Mp3.Title)
14
15 Console.WriteLine("ศิลปิน: " + Mp3.Artist)
16
17 Console.WriteLine("อัลบั้ม : " + Mp3.Album)
18
19 คอนโซล อ่าน()
20
21 จบย่อย
ยี่สิบสอง
ยี่สิบสาม
24 โมดูลสิ้นสุด
หลังจากรันโปรแกรม ผลลัพธ์จะเป็น:
ชื่อ: Nature's Law
ศิลปิน: Embrace
อัลบั้ม: DHZ.INC
ประเภท: Blues
บทความนี้กล่าวถึง ID3v1 ของ mp3 เท่านั้น แต่จริงๆ แล้ว mp3 หลายตัวไม่เพียงมีข้อมูล ID3v1 เท่านั้น แต่ยังมีข้อมูล ID3v2 อีกด้วย
แต่ ID3v2 นั้นซับซ้อนกว่า ID3v1 การประมวลผลของ ID3v2 จะต้องรอจนกว่าจะมีเวลาเขียนอีกครั้ง