Некоторое время назад я создал небольшой сайт в локальной сети, и один из разделов занимался онлайн-воспроизведением музыки. Учитывая удобство дальнейшего обслуживания, мы решили хранить 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="Классик-Рок"
2="Кантри"
3="Танец"
4="Дискотека"
5="Фанк"
6="Гранж"
7="Хип-Хоп"
8="Джаз"
9=" Метал"
10="NewAge"
11="Олди"
12="Другое"
13="Поп"
14="R&B"
15="Рэп"
16="Регги"
17="Рок"
18="Техно"
19=" Индустриал"
20="Альтернатива"
21="Ска"
22="Дэт-метал"
23="Шалости"
24="Саундтрек"
25="Евро-Техно"
26="Амбиент"
27="Трип-Хоп"
28="Вокал "
29="Джаз+Фанк"
30="Фьюжн"
31="Транс"
32="Классика"
33="Инструментал"
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= "Этнический"
49="Готический"
50="Дарквэйв"
Зная структуру хранения информации о песнях в формате MP3, мы можем написать соответствующий код.
Сначала определите класс MP3Info:
1 публичный класс Mp3Info
2
3
4
5 Private Const TAGLEN As Integer = 128
6
7
8
9 Частный _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 Частный _Comment As String = String.Empty
18
19 Private _Year As String = String.Empty
20
21 Private _Genre As String = String.Empty
двадцать два
23Private_GenreIDasByte
двадцать четыре
25
26
27 частных жанров() As String = {"Блюз", "Классический рок", "Кантри", "Танец", "Дискотека", "Фанк", "Гранж", _
28
29 «Хип-Хоп», «Джаз», «Металл», «Нью-Эйдж», «Олди», «Другое», «Поп», «R&B», «Рэп», «Регги», «Рок», _
30
31 «Техно», «Индастриал», «Альтернатива», «Ска», «Дэт-метал», «Пранки», «Саундтрек», «Евро-Техно», _
32
33 «Амбиент», «Трип-Хоп», «Вокал», «Джаз+Фанк», «Фьюжн», «Транс», «Классика», «Инструментал», «Кислот», _
34
35 «Дом», «Игра», «Звуковой клип», «Госпел», «Шум», «АльтернРок», «Бас», «Соул», «Панк», «Космос», _
36
37 «Медитативный», «Инструментальный поп», «Инструментальный рок», «Этник», «Готика», «Дарквэйв», «Техно-индастриал», _
38
39 «Электронная», «Поп-Фолк», «Евродэнс», «Мечта», «Южный рок», «Комедия», «Культ», «Гангста», «Топ 40», _
40
41 «Христианский рэп», «Поп/Фанк», «Джангл», «Индеец», «Кабаре», «Новая волна», «Психоделик», «Рейв», _
42
43 «Showtunes», «Трейлер», «Lo-Fi», «Трайбл», «Эйсид-панк», «Эйсид-джаз», «Полька», «Ретро», «Мюзикл», _
44
45 «Рок-н-ролл», «Хард-рок», «Фолк», «Фолк/Рок», «Национальный фолк», «Свинг», «Бебоб», «Латино», «Возрождение», _
46
47 «Селтик», «Мятлик», «Авангард», «Готик-рок», «Прогрессивный рок», «Психоделический рок», «Симфонический рок», _
48
49 «Медленный рок», «Биг-бэнд», «Хор», «Легкая музыка», «Акустика», «Юмор», «Речь», «Шансон», «Опера», _
50
51 «Камерная музыка», «Соната», «Симфония», «Booty Bass», «Примус», «Porn Groove», «Сатира», «Slow Jam», «Клуб», _
52
53 «Танго», «Самба», «Фольклор»}
54
55
56
57 Открытая собственность MP3Tag() как строка
58
59 Получить
60
61 Возврат _MP3Tag
62
63 Конец Получить
64
65 Set (значение ByVal в виде строки)
66
67 _MP3Tag = значение.Обрезать
68
69 Конечный набор
70
71 Конечная недвижимость
72
73
74
75 Название публичной собственности() как строка
76
77 Получить
78
79 Возврат _Заголовок
80
81 Конец Получить
82
83 Set (значение ByVal в виде строки)
84
85 _Title = значение.Обрезать
86
87 Конечный набор
88
89 Конечная недвижимость
90
91
92
93 Публичная собственность Artist() в виде строки
94
95 Получить
96
97 Возврат _Артист
98
99 Конец Получить
100
101 Set (значение ByVal в виде строки)
102
103 _Artist = значение.Trim
104
105 Конечный набор
106
107 Конечная недвижимость
108
109
110
111 Альбом публичной собственности() как строка
112
113 Получить
114
115 Возврат_Альбом
116
117 Конец Получить
118
119 Set (значение ByVal в виде строки)
120
121 _Album = значение.Обрезать
122
123 Конечный набор
124
125 Конечная недвижимость
126
127
128
129 Комментарий к публичной собственности() как строка
130
131 Получить
132
133 Возврат_Комментарий
134
135 Конец Получить
136
137 Set (значение ByVal в виде строки)
138
139 _Комментарий = значение.Обрезать
140
141 Конечный набор
142
143 Конечная недвижимость
144
145
146
147 Открытая собственность Genre() как строка
148
149 Получить
150
151 Возврат_Жанр
152
153 Конец Получить
154
155 Set (значение ByVal в виде строки)
156
157 _Жанр = значение.Обрезка
158
159 Конечный набор
160
161 Конечная недвижимость
162
163
164
165 Открытая собственность GenreID() в виде байта
166
167 Получить
168
169 Return_GenreID
170
171 Конец Получить
172
173 Set (значение ByVal в виде байта)
174
175 _GenreID = значение
176
177 Конечный набор
178
179 Конечная недвижимость
180
181
182
183 Год публичной собственности() как строка
184
185 Получить
186
187 Возврат _Год
188
189 Конец Получить
190
191 Set (значение 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 Throw New IO.IOException("Произошла ошибка при чтении файла!" + Ex.Message)
228
229 Конец попытки
230
231
232
233 Dim ID3(TAGLEN - 1) Как байт
234
235 Dim BinReader как BinaryReader
236
237 ДимСтрИнфоАсСтрока
238
239
240
241 'Используйте BinaryReader для чтения информации
242
243 BinReader = Новый BinaryReader(msfile)
244
245
246
247 мсфайл.Позиция = 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)).Replace(Chr(0), "")
266
267 _Title = СтрИнфо
268
269
270
271 'Читать информацию об исполнителе
272
273 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
274
275 _Artist = StrInfo
276
277
278
279 'Читать информацию об альбоме
280
281 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
282
283 _Album = StrInfo
284
285
286
287 'Читать информацию о году публикации
288
289 StrInfo = CBytesToString(BinReader.ReadBytes(4)).Replace(Chr(0), "")
290
291 _Год = СтрИнфо
292
293
294
295 'Прочитать информацию о примечаниях
296
297 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
298
299 _Комментарий = СтрИнфо
300
301
302
303 'Читать информацию о жанре песни
304
305 _GenreID = BinReader.ReadByte
306
307
308
309 Конец Если
310
311
312
313 БинЧтение.Закрыть()
314
315 мсфайл.Закрыть()
316
317
318
319 Конечная функция
320
321
322
323 'Используется для преобразования кодировки во избежание искажения китайских символов.
324
325 Частная функция CBytesToString (ByVal Bytes() как байт) как строка
326
327 'Обратите внимание, что здесь необходимо обработать кодировку, чтобы предотвратить искажение символов.
328
329 Dim GbCode As Encoding = Encoding.GetEncoding("gb2312")
330
331 Если Байтс.Длина > 0 Тогда
332
333 Возврат GbCode.GetString(байты)
334
335 Остальное
336
337 Возвращаемая строка.Пусто
338
339 Конец Если
340
341 Конечная функция
Мы можем использовать простую консольную программу, чтобы проиллюстрировать, как использовать класс 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
Жанр: Блюз
В этой статье обсуждается только ID3v1 mp3, но на самом деле многие mp3-файлы содержат не только информацию ID3v1, но и информацию ID3v2.
Но ID3v2 сложнее, чем ID3v1. Обработку ID3v2 придется подождать до следующего раза, когда у меня будет время его написать.