您的位置:首页 > 编程语言 > C#

C# 获取 mp3文件信息

2014-03-04 17:50 429 查看
C#获取mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

第一种方式:[代码已验证]

//http://bbs.csdn.net/topics/390392612














//如果执行过程中,出现是错误提示,通过Shell32的EmbedInteropTypes属性设置为False即可;

shell获取文件详细信息

首先引用COM组件
MicrosoftShellControlsAndAutomation
这里需要注意
DLL的属性EmbedInteropType设为False
否则会引起互操作类型异常

代码如下
ShellClasssh=newShellClass();
Folderdir=sh.NameSpace(Path.GetDirectoryName(sFile));
FolderItemitem=dir.ParseName(Path.GetFileName(sFile));
stringdet=dir.GetDetailsOf(item,iCol);

iCol对应文件详细属性汇总
ID=>DETAIL-NAME
0=>Name
1=>Size//MP3文件大小
2=>Type
3=>Datemodified
4=>Datecreated
5=>Dateaccessed
6=>Attributes
7=>Offlinestatus
8=>Offlineavailability
9=>Perceivedtype
10=>Owner
11=>Kinds
12=>Datetaken
13=>Artists//MP3歌手
14=>Album//MP3专辑
15=>Year
16=>Genre
17=>Conductors
18=>Tags
19=>Rating
20=>Authors
21=>Title//MP3歌曲名
22=>Subject
23=>Categories
24=>Comments
25=>Copyright
26=>#
27=>Length//MP3时长
28=>Bitrate
29=>Protected
30=>Cameramodel
31=>Dimensions
32=>Cameramaker
33=>Company
34=>Filedescription
35=>Programname
36=>Duration
37=>Isonline
38=>Isrecurring
39=>Location
40=>Optionalattendeeaddresses
41=>Optionalattendees
42=>Organizeraddress
43=>Organizername
44=>Remindertime
45=>Requiredattendeeaddresses
46=>Requiredattendees
47=>Resources
48=>Free/busystatus
49=>Totalsize
50=>Accountname
51=>Computer
52=>Anniversary
53=>Assistant'sname
54=>Assistant'sphone
55=>Birthday
56=>Businessaddress
57=>Businesscity
58=>Businesscountry/region
59=>BusinessP.O.box
60=>Businesspostalcode
61=>Businessstateorprovince
62=>Businessstreet
63=>Businessfax
64=>Businesshomepage
65=>Businessphone
66=>Callbacknumber
67=>Carphone
68=>Children
69=>Companymainphone
70=>Department
71=>E-mailAddress
72=>E-mail2
73=>E-mail3
74=>E-maillist
75=>E-maildisplayname
76=>Fileas
77=>Firstname
78=>Fullname
79=>Gender
80=>Givenname
81=>Hobbies
82=>Homeaddress
83=>Homecity
84=>Homecountry/region
85=>HomeP.O.box
86=>Homepostalcode


  

//第二种方式:读取文件结构获取MP3文件信息[代码未验证]

publicstructMp3Info
{
publicstringidentify;//TAG,三个字节
publicstringTitle;//歌曲名,30个字节
publicstringArtist;//歌手名,30个字节
publicstringAlbum;//所属唱片,30个字节
publicstringYear;//年,4个字符
publicstringComment;//注释,28个字节
publiccharreserved1;//保留位,一个字节
publiccharreserved2;//保留位,一个字节
publiccharreserved3;//保留位,一个字节
}
///<summary>
///mp3类
///</summary>
publicclassclsMP3
{
publicvoidfLogSave(Page_sender,Hashtable_htUser)
{

}
//所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:
privatebyte[]getLast128(stringFileName)
{
FileStreamfs=newFileStream(FileName,FileMode.Open,FileAccess.Read);
Streamstream=fs;
stream.Seek(-128,SeekOrigin.End);
constintseekPos=128;
intrl=0;
byte[]Info=newbyte[seekPos];
rl=stream.Read(Info,0,seekPos);
fs.Close();
stream.Close();
returnInfo;
}
//再对上面返回的字节数组分段取出,并保存到Mp3Info结构中返回:
privateMp3InfogetMp3Info(byte[]Info)
{
Mp3Infomp3Info=newMp3Info();
stringstr=null;
inti;
intposition=0;//循环的起始值
intcurrentIndex=0;//Info的当前索引值
//获取TAG标识(数组前3个)
for(i=currentIndex;i<currentIndex+3;i++)
{
str=str+(char)Info[i];
position++;
}
currentIndex=position;
mp3Info.identify=str;
//获取歌名(数组3-32)
str=null;
byte[]bytTitle=newbyte[30];//将歌名部分读到一个单独的数组中
intj=0;
for(i=currentIndex;i<currentIndex+30;i++)
{
bytTitle[j]=Info[i];
position++;
j++;
}
currentIndex=position;
mp3Info.Title=this.byteToString(bytTitle);
//获取歌手名(数组33-62)
str=null;
j=0;
byte[]bytArtist=newbyte[30];//将歌手名部分读到一个单独的数组中
for(i=currentIndex;i<currentIndex+30;i++)
{
bytArtist[j]=Info[i];
position++;
j++;
}
currentIndex=position;
mp3Info.Artist=this.byteToString(bytArtist);
//获取唱片名(数组63-92)
str=null;
j=0;
byte[]bytAlbum=newbyte[30];//将唱片名部分读到一个单独的数组中
for(i=currentIndex;i<currentIndex+30;i++)
{
bytAlbum[j]=Info[i];
position++;
j++;
}
currentIndex=position;
mp3Info.Album=this.byteToString(bytAlbum);
//获取年(数组93-96)
str=null;
j=0;
byte[]bytYear=newbyte[4];//将年部分读到一个单独的数组中
for(i=currentIndex;i<currentIndex+4;i++)
{
bytYear[j]=Info[i];
position++;
j++;
}
currentIndex=position;
mp3Info.Year=this.byteToString(bytYear);
//获取注释(数组97-124)
str=null;
j=0;
byte[]bytComment=newbyte[28];//将注释部分读到一个单独的数组中
for(i=currentIndex;i<currentIndex+25;i++)
{
bytComment[j]=Info[i];
position++;
j++;
}
currentIndex=position;
mp3Info.Comment=this.byteToString(bytComment);
//以下获取保留位(数组125-127)
mp3Info.reserved1=(char)Info[++position];
mp3Info.reserved2=(char)Info[++position];
mp3Info.reserved3=(char)Info[++position];
returnmp3Info;
}
//上面程序用到下面的方法:
///<summary>
///将字节数组转换成字符串
///</summary>
///<paramname="b">字节数组</param>
///<returns>返回转换后的字符串</returns>
privatestringbyteToString(byte[]b)
{
Encodingenc=Encoding.GetEncoding("GB2312");
stringstr=enc.GetString(b);
str=str.Substring(0,str.IndexOf('\0')>=0?str.IndexOf('\0'):str.Length);//去掉无用字符
returnstr;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: