少し前に、ローカル エリア ネットワーク上に小さな Web サイトを構築しましたが、そのセクションの 1 つに音楽のオンライン再生が含まれていました。将来のメンテナンスの利便性を考慮して、mp3 ファイルをアルバムごとに異なるディレクトリに保存することにしました。次に、プログラムを使用して mp3 が保存されているディレクトリを監視し、各 mp3 ファイルの情報をデータベースに保存し、ASP.NET ページを使用して mp3 ファイル情報をユーザーに表示します。 .NET を使用して mp3 ファイルの情報を読み取ることは難しくありませんが、多くのスキルを必要とするため、プロセスを整理して全員で共有します。
まず、mp3の曲情報がどこに保存されているかを見てみましょう。 MP3 ファイルには ID3 と呼ばれるタグが含まれています。実際には 2 つのタグがあり、1 つは ID3v1 と呼ばれ、もう 1 つは ID3v2 と呼ばれます。わかりやすくするために、ここでは ID3v1 のみを紹介します。
ID3V1 の構造は比較的単純で、MP3 ファイルの最後に保存されます。16 進数エディタ (例: UltraEdit) を使用して、最後の 128 バイトのデータ構造が定義されていることに注意してください。次のように:
名前 位置 長さ 内容
ヘッダー 1-3 3 タグヘッダー
タイトル 4-33 30 タイトル
アーティスト 34-63 30 アーティスト
アルバム 64-93 30 アルバム
年 94-97 4 制作年
コメント 98-127 30 備考
センター 128 1 タイプ
注: 上記のタグヘッダーは「TAG」である必要があります。それ以外の
場合は、ID3v1 の情報が順番に格納されます。各情報の長さが短い場合は、終了マークはありません。標準の長さより長い場合は「 」を使用して追加します。ジャンルは例外で、曲のジャンルを表すのに 1 バイトが使用されます。対応する表は次のとおりです (内容が多すぎるため、最初の 50 項目のみがリストされています)。
0="ブルース"
1="クラシックロック"
2="カントリー"
3="ダンス"
4="ディスコ"
5="ファンク"
6="グランジ"
7="ヒップホップ"
8="ジャズ"
9="メタル"
10="ニューエイジ"
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="アシッド"
35="ハウス"
36="ゲーム"
37="サウンドクリップ"
38= "ゴスペル"
39="ノイズ"
40="オルタナロック"
41="ベース"
42="ソウル"
43="パンク"
44="スペース"
45="瞑想的"
46="インストゥルメンタルポップ"
47="インストゥルメンタルロック"
48= "エスニック"
49="ゴシック"
50="ダークウェーブ"
MP3 曲情報ストレージの構造を理解したら、対応するコードを書くことができます。
まず MP3Info クラスを定義します。
1 パブリック クラス MP3Info
2
3
4
5 整数としてのプライベート Const TAGLEN = 128
6
7
8
9 文字列としてのプライベート _MP3Tag = 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 文字列としてのプライベート _年 = String.Empty
20
21 Private _Genre As String = String.Empty
22
23Private_GenreIDAsByte
24
25
26
27 プライベート ジャンル() As String = {"ブルース"、"クラシック ロック"、"カントリー"、"ダンス"、"ディスコ"、"ファンク"、"グランジ"、_
28
29 「ヒップホップ」、「ジャズ」、「メタル」、「ニューエイジ」、「オールディーズ」、「その他」、「ポップ」、「R&B」、「ラップ」、「レゲエ」、「ロック」、_
30
31 「テクノ」、「インダストリアル」、「オルタナティブ」、「スカ」、「デスメタル」、「プランクス」、「サウンドトラック」、「ユーロテクノ」、_
32
33 「アンビエント」、「トリップホップ」、「ボーカル」、「ジャズ+ファンク」、「フュージョン」、「トランス」、「クラシック」、「インストゥルメンタル」、「アシッド」、_
34
35 「ハウス」、「ゲーム」、「サウンドクリップ」、「ゴスペル」、「ノイズ」、「オルタナロック」、「ベース」、「ソウル」、「パンク」、「スペース」、_
36
37 「瞑想的」、「インストゥルメンタル ポップ」、「インストゥルメンタル ロック」、「エスニック」、「ゴシック」、「ダークウェーブ」、「テクノ インダストリアル」、_
38
39 「エレクトロニック」、「ポップフォーク」、「ユーロダンス」、「ドリーム」、「サザンロック」、「コメディ」、「カルト」、「ギャングスタ」、「トップ40」、_
40
41 「クリスチャン・ラップ」、「ポップ/ファンク」、「ジャングル」、「ネイティブ・アメリカン」、「キャバレー」、「ニュー・ウェイヴ」、「サイケデリック」、「レイブ」、_
42
43 「ショーチューン」、「トレーラー」、「ローファイ」、「トライバル」、「アシッドパンク」、「アシッドジャズ」、「ポルカ」、「レトロ」、「ミュージカル」、_
44
45 「ロックンロール」、「ハードロック」、「フォーク」、「フォーク/ロック」、「ナショナルフォーク」、「スイング」、「ビボブ」、「ラテン」、「リバイバル」、_
46
47 「ケルティック」、「ブルーグラス」、「アバンギャルド」、「ゴシック・ロック」、「プログレッシブ・ロック」、「サイケデリック・ロック」、「シンフォニック・ロック」、_
48
49 「スローロック」、「ビッグバンド」、「コーラス」、「イージーリスニング」、「アコースティック」、「ユーモア」、「スピーチ」、「シャンソン」、「オペラ」、_
50
51 「室内楽」、「ソナタ」、「シンフォニー」、「戦利品ベース」、「プリムス」、「ポルノ・グルーヴ」、「風刺」、「スロー・ジャム」、「クラブ」、_
52
53「タンゴ」「サンバ」「フォークロア」}
54
55
56
57 文字列としてのパブリック プロパティ MP3Tag()
58
59 ゲット
60
61 _MP3タグを返す
62
63 エンドゲット
64
65 Set(ByVal 値を文字列として)
66
67 _MP3Tag = 値.トリム
68
69 エンドセット
70
71 終了プロパティ
72
73
74
75 文字列としてのパブリック プロパティ Title()
76
77 ゲット
78
79 _タイトルを返す
80
81 エンドゲット
82
83 Set(ByVal 値を文字列として)
84
85 _タイトル = 値.トリム
86
87 エンドセット
88
89 終了プロパティ
90
91
92
93 文字列としてのパブリック プロパティ Artist()
94
95 ゲット
96
97 戻る_アーティスト
98
99 エンドゲット
100
101 Set(ByVal 値を文字列として)
102
103 _アーティスト = 値.トリム
104
105 エンドセット
106
107 終了プロパティ
108
109
110
111 パブリック プロパティ Album() として文字列
112
113 ゲット
114
115 リターン_アルバム
116
117 エンドゲット
118
119 Set(ByVal 値を文字列として)
120
121 _アルバム = 値.トリム
122
123 エンドセット
124
125 終了プロパティ
126
127
128
129 パブリック プロパティ Comment() として文字列
130
131 ゲット
132
133 リターン_コメント
134
135 エンドゲット
136
137 Set(ByVal 値を文字列として)
138
139 _コメント = 値.トリム
140
141 エンドセット
142
143 終了プロパティ
144
145
146
147 パブリック プロパティ ジャンル() 文字列として
148
149 ゲット
150
151 リターン_ジャンル
152
153 エンドゲット
154
155 Set(ByVal 値を文字列として)
156
157 _ジャンル = 値.トリム
158
159 エンドセット
160
161 終了プロパティ
162
163
164
165 パブリック プロパティ ジャンルID() バイトとして
166
167 ゲット
168
169 リターン_ジャンルID
170
171 エンドゲット
172
173 Set(ByVal 値をバイトとして)
174
175 _ジャンルID = 値
176
177 エンドセット
178
179 終了プロパティ
180
181
182
183 文字列としてのパブリック プロパティ Year()
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) As Boolean
208
209
210
211 'ファイルストリームを開きます
212
213 ファイルストリームとしてのディム ms ファイル
214
215 トライしてみよう
216
217 msfile = New FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
218
219 そうでない場合 (msfile.CanRead)
220
221 Throw New IO.IOException("ファイルを読み取れません:" + fname)
222
223 終了の場合
224
225 例外として元を捕まえる
226
227 Throw New IO.IOException("ファイルの読み取り中にエラーが発生しました!" + Ex.Message)
228
229 エンドトライ
230
231
232
233 ディム ID3(TAGLEN - 1) バイトとして
234
235 Dim BinReader として BinaryReader
236
237 ひまわり
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)).Replace(Chr(0), "")
266
267 _タイトル = StrInfo
268
269
270
271 'アーティスト情報を読む
272
273 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
274
275 _アーティスト = StrInfo
276
277
278
279 'アルバム情報を読む
280
281 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
282
283 _アルバム = StrInfo
284
285
286
287 '出版年情報を読む
288
289 StrInfo = CBytesToString(BinReader.ReadBytes(4)).Replace(Chr(0), "")
290
291 _年 = Str情報
292
293
294
295 '発言情報を読む
296
297 StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
298
299 _コメント = StrInfo
300
301
302
303 '曲のジャンル情報を読み込む
304
305 _ジャンルID = BinReader.ReadByte
306
307
308
309 終了の場合
310
311
312
313 BinReader.Close()
314
315 msfile.Close()
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 戻り文字列.空
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.アーティスト)
16
17 Console.WriteLine("アルバム : " + Mp3.アルバム)
18
19 Console.Read()
20
21 エンドサブ
22
23
24 エンドモジュール
プログラムを実行すると、出力は次のようになります。
タイトル: Nature's Law
アーティスト: Embrace
アルバム: DHZ.INC
ジャンル: ブルース
この記事では mp3 の ID3v1 についてのみ説明しますが、実際には多くの mp3 には ID3v1 情報だけでなく ID3v2 情報も含まれています。
ただし、ID3v2 は ID3v1 よりも複雑です。ID3v2 の処理は、次回書く時間ができるまで待つ必要があります。