动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息



本月文章推荐
.安装IE补丁后ASP.NET将无法运行.
.在ASP.net中保存/取出图片入/从S.
.深入理解 ViewState.
.用ObjectDataSource实现自定义分.
.不走寻常路 设计ASP.NET应用程序.
.关于HtmlForm控件.
.谈谈HtmlControl与WebControl的区.
.ASP.NET2.0下为GridView添加鼠标.
.ASP.NET中实现中文简/繁体自动转.
.利用ASP.NET技术动态生成HTML页面.
.权限树中Checkbox的操作[Asp.Net.
.FCKeditor2.2+ASP.NET2.0不完全攻.
.web中,如何读取Word内容(包含表.
.GridView 分页导航.
.关于asp.net c#中对cookie的操作.
.access下的分页方案.
.Asp.net下的对象成员数据绑定器实.
.在MasterPage中檢驗User是否登入.
.ASP.NET Atlas对JavaScript的扩展.
.原创的自定义分页UserControl 分.

读取MP3文件的ID3v1信息

发表日期:2006-6-16 |


      前段时间,在局域网里面做一个小网站,其中有板块是涉及音乐的在线播放。考虑到以后维护的方便,决定把mp3文件都按专辑分不同的目录存放。然后使用一个程序监控存放mp3的目录,把每个mp3文件的信息都存入数据库中,用过ASP.NET页面将mp3文件的信息呈现给用户。其中使用.NET来读取mp3 文件的信息虽然不难,但也需要不少技巧,故将该过程整理与大家分享。

       首先我们来看看mp3歌曲的信息所存放的位置。Mp3文件包含一个叫做ID3的标签。其实有两个标签,一个叫做ID3v1,另外一个叫做ID3v2。为了讲述的简单起见,我们这里只介绍ID3v1。

ID3V1结构比较简单,存放在MP3文件的末尾,大家可以用16进制的编辑器(例如:UltraEdit)打开一个MP3文件,注意其末尾的128个字节,数据结构定义如下:

 

名称              位置              长度              内容

Header           1-3                3                   标签头

Title              4-33               30                  标题

Artist             34-63             30                  艺术家

Album            64-93             30                  专辑

Year               94-97             4                   出品年代

Comment       98-127           30                  备注

Cenre             128                1                   类型

 

注意:上述的标签头必须是”TAG”, 否则表示没有标签

       ID3v1的各项信息是按顺序依次存放的,每项信息之后并没有任何的结束标志,如果某项信息长度小于标准长度,使用”\0”来补充。另外Genre是个例外,它用一个字节表示歌曲流派,其对应表如下(由于该内容太多,只列出前50项):

 


 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="Classical"

 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="Ethnic"

 49="Gothic"

 50="Darkwave"

 

       知道了MP3歌曲信息存放的结构之后,我们就可以写出对应的代码。

首先定一个MP3Info类:

 

  1 Public Class Mp3Info
  2
  3
  4
  5     Private Const TAGLEN As Integer = 128
  6
  7 
  8
  9     Private _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
 22
 23     Private _GenreID As Byte
 24
 25 
 26
 27     Private Genres() As String = {"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", _
 28
 29             "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "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", "Classical", "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     Public Property MP3Tag() As String
 58
 59         Get
 60
 61             Return _MP3Tag
 62
 63         End Get
 64
 65         Set(ByVal value As String)
 66
 67             _MP3Tag = value.Trim
 68
 69         End Set
 70
 71     End Property
 72
 73 
 74
 75     Public Property Title() As String
 76
 77         Get
 78
 79             Return _Title
 80
 81         End Get
 82
 83         Set(ByVal value As String)
 84
 85             _Title = value.Trim
 86
 87         End Set
 88
 89     End Property
 90
 91 
 92
 93     Public Property Artist() As String
 94
 95         Get
 96
 97             Return _Artist
 98
 99         End Get
100
101         Set(ByVal value As String)
102
103             _Artist = value.Trim
104
105         End Set
106
107     End Property
108
109 
110
111     Public Property Album() As String
112
113         Get
114
115             Return _Album
116
117         End Get
118
119         Set(ByVal value As String)
120
121             _Album = value.Trim
122
123         End Set
124
125     End Property
126
127 
128
129     Public Property Comment() As String
130
131         Get
132
133             Return _Comment
134
135         End Get
136
137         Set(ByVal value As String)
138
139             _Comment = value.Trim
140
141         End Set
142
143     End Property
144
145 
146
147     Public Property Genre() As String
148
149         Get
150
151             Return _Genre
152
153         End Get
154
155         Set(ByVal value As String)
156
157             _Genre = value.Trim
158
159         End Set
160
161     End Property
162
163 
164
165     Public Property GenreID() As Byte
166
167         Get
168
169             Return _GenreID
170
171         End Get
172
173         Set(ByVal value As Byte)
174
175             _GenreID = value
176
177         End Set
178
179     End Property
180
181 
182
183     Public Property Year() As String
184
185         Get
186
187             Return _Year
188
189         End Get
190
191         Set(ByVal value As String)
192
193             _Year = value.Trim
194
195         End Set
196
197 End Property
198
199 End Class
200
201 
202
203        上面的类只包含了mp3歌曲信息对应的数据结构,我们还要为它添加具体读取mp3文件信息的过程:
204
205 
206
207     Public Function GetMp3FileInfo(ByVal fname As String) As Boolean
208
209 
210
211         'Open the filestream
212
213         Dim msfile As FileStream
214
215         Try
216
217             msfile = New FileStream(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
218
219             If Not (msfile.CanRead) Then
220
221                 Throw New IO.IOException("无法读取文件:" + fname)
222
223             End If
224
225         Catch Ex As Exception
226
227             Throw New IO.IOException("读取文件发生错误!" + Ex.Message)
228
229         End Try
230
231 
232
233         Dim ID3(TAGLEN - 1) As Byte
234
235         Dim BinReader As BinaryReader
236
237         Dim StrInfo As String
238
239 
240
241         '使用BinaryReader来读取信息
242
243         BinReader = New 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         '判断标签头是否为 TAG
258
259         If StrInfo.ToUpper = "TAG" Then
260
261 
262
263             '读取标题信息        
264
265             StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
266
267             _Title = StrInfo
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             _Year = StrInfo
292
293 
294
295             '读取备注信息
296
297             StrInfo = CBytesToString(BinReader.ReadBytes(30)).Replace(Chr(0), "")
298
299             _Comment = StrInfo
300
301 
302
303             '读取歌曲流派信息
304
305             _GenreID = BinReader.ReadByte
306
307 
308
309         End If
310
311 
312
313         BinReader.Close()
314
315         msfile.Close()
316
317 
318
319     End Function
320
321 
322
323     '用于转换编码, 防止出现中文乱码
324
325     Private Function CBytesToString(ByVal Bytes() As Byte) As String
326
327         '注意这里 需要对编码进行处理, 防止出现乱码
328
329         Dim GbCode As Encoding = Encoding.GetEncoding("gb2312")
330
331         If Bytes.Length > 0 Then
332
333             Return GbCode.GetString(Bytes)
334
335         Else
336
337             Return String.Empty
338
339         End If
340
341     End Function

      

       我们可以用一个简单的Console程序来说明,如何使用Mp3Info类。使用Visual Studio 2005 Express,创建一个Console程序:

 

 1 Module Module1
 2
 3 
 4
 5     Sub
 6
 7 
 8
 9         Dim Mp3 As New Mp3Info("D:\Music\Top 40 Singles\39 Embrace - Natures Law.mp3")
10
11 
12
13         Console.WriteLine("Title : " + Mp3.Title)
14
15         Console.WriteLine("Artist: " + Mp3.Artist)
16
17         Console.WriteLine("Album : " + Mp3.Album)
18
19         Console.Read()
20 
21     End Sub
22
23
24 End Module

 

运行该程序后输出为:

Title : Nature's Law

Artist: Embrace

Album : DHZ.INC

Genre : Blues

 

        本文只针对mp3的ID3v1进行了讨论,而实际上很多mp3不仅仅包含ID3v1的信息,还包含ID3v2的信息。

    但ID3v2要比ID3v1复杂,对于ID3v2的处理,要等下次有空的时候再写了。

上一篇:cookies的丢失和中文乱码 人气:6757
下一篇:web.config点滴:更改login控件对密码安全性的要求 人气:7440
浏览全部asp.net的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-26 极速网店系统 2008 Beta
2008-7-26 PBDigg v2.0 Build 20080719
2008-7-26 FCKeditor v2.6.3 Beta
2008-7-26 diggcms内容管理系统 v3.0 build
2008-7-26 Health Care System 健康服务系统
2008-7-26 PJBlog3 v2.8.4.136
2008-7-26 美女艺术图库 无图版
2008-7-26 md5在线加密工具 v1.0
2008-7-26 极端JDCMS v1.0.1
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵