首页 > 代码库 > c#读取MP3、wmv等格式歌曲信息
c#读取MP3、wmv等格式歌曲信息
这几天闲着无聊,想做个简单的KTV管理系统!查阅资料才知道歌曲本身自带歌曲的详细信息。于是查阅了相关资料并且不断摸索,对网上的两种方法做了简单的验证。结果如下:
代码1:
1 ShellClass sh = new ShellClass();2 Folder dir = sh.NameSpace(Path.GetDirectoryName(file));3 FolderItem item = dir.ParseName(Path.GetFileName(file));4 string str = dir.GetDetailsOf(item, 27) ; // 获取歌曲时长。5 MessageBox.Show(str);6 7 // 如果执行过程中,出现是错误提示,通过Shell32 的 Embed Interop Types 属性设置为 False 即可;
这这种方法得到了验证,是可行的!主要是利用windows自带的com组件调用!
对于shell。dll库具体说明如下:
首先引用COM组件Microsoft Shell Controls And Automation这里需要注意DLL的属性Embed Interop Type 设为False否则会引起互操作类型异常 代码如下ShellClass sh = new ShellClass();Folder dir = sh.NameSpace(Path.GetDirectoryName(sFile));FolderItem item = dir.ParseName(Path.GetFileName(sFile));string det = dir.GetDetailsOf(item, iCol); iCol 对应文件详细属性汇总ID => DETAIL-NAME0 => Name1 => Size // MP3 文件大小2 => Type3 => Date modified4 => Date created5 => Date accessed6 => Attributes7 => Offline status8 => Offline availability9 => Perceived type10 => Owner11 => Kinds12 => Date taken13 => Artists // MP3 歌手14 => Album // MP3 专辑15 => Year16 => Genre17 => Conductors18 => Tags19 => Rating20 => Authors21 => Title // MP3 歌曲名22 => Subject23 => Categories24 => Comments25 => Copyright26 => #27 => Length // MP3 时长28 => Bit rate29 => Protected30 => Camera model31 => Dimensions32 => Camera maker33 => Company34 => File description35 => Program name36 => Duration37 => Is online38 => Is recurring39 => Location40 => Optional attendee addresses41 => Optional attendees42 => Organizer address43 => Organizer name44 => Reminder time45 => Required attendee addresses46 => Required attendees47 => Resources48 => Free/busy status49 => Total size50 => Account name51 => Computer52 => Anniversary53 => Assistant‘s name54 => Assistant‘s phone55 => Birthday56 => Business address57 => Business city58 => Business country/region59 => Business P.O. box60 => Business postal code61 => Business state or province62 => Business street63 => Business fax64 => Business home page65 => Business phone66 => Callback number67 => Car phone68 => Children69 => Company main phone70 => Department71 => E-mail Address72 => E-mail273 => E-mail374 => E-mail list75 => E-mail display name76 => File as77 => First name78 => Full name79 => Gender80 => Given name81 => Hobbies82 => Home address83 => Home city84 => Home country/region85 => Home P.O. box86 => Home postal code
第二种方法 是利用自己编写的函数!总所周知,歌曲信息往往存在二进制文件最后的128个字节中,我们可以通过字节操作来获取对应的信息。代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace GetVideoInfor{ class Class1 { public struct Mp3Info { public string identify;//TAG,三个字节 public string Title;//歌曲名,30个字节 public string Artist;//歌手名,30个字节 public string Album;//所属唱片,30个字节 public string Year;//年,4个字符 public string Comment;//注释,28个字节 public char reserved1;//保留位,一个字节 public char reserved2;//保留位,一个字节 public char reserved3;//保留位,一个字节 } /// <summary> /// 获取MP3文件最后128个字节 /// </summary> /// <param name="FileName">文件名</param> /// <returns>返回字节数组</returns> public byte[] getLast128(string FileName) { FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read); Stream stream = fs; stream.Seek(-128, SeekOrigin.End); const int seekPos = 128; int rl = 0; byte[] Info = new byte[seekPos]; rl = stream.Read(Info, 0, seekPos); fs.Close(); stream.Close(); return Info; } public string ReadAuthor(Stream binary_file) { System.Text.Encoding encoding = System.Text.Encoding.UTF8; // Read string from binary file with UTF8 encoding byte[] buffer = new byte[30]; binary_file.Read(buffer, 0, 30); return encoding.GetString(buffer); } /// <summary> /// 获取MP3歌曲的相关信息 /// </summary> /// <param name = "Info">从MP3文件中截取的二进制信息</param> /// <returns>返回一个Mp3Info结构</returns> public Mp3Info getMp3Info(byte[] Info) { Mp3Info mp3Info = new Mp3Info(); string str = null; int i; int position = 0;//循环的起始值 int currentIndex = 0;//Info的当前索引值 //获取TAG标识 for (i = currentIndex; i < currentIndex + 3; i++) { str = str + (char)Info[i]; position++; } currentIndex = position; mp3Info.identify = str; //获取歌名 str = null; byte[] bytTitle = new byte[30];//将歌名部分读到一个单独的数组中 int j = 0; for (i = currentIndex; i < currentIndex + 30; i++) { bytTitle[j] = Info[i]; position++; j++; } currentIndex = position; mp3Info.Title = this.byteToString(bytTitle); //获取歌手名 str = null; j = 0; byte[] bytArtist = new byte[30];//将歌手名部分读到一个单独的数组中 for (i = currentIndex; i < currentIndex + 30; i++) { bytArtist[j] = Info[i]; position++; j++; } currentIndex = position; mp3Info.Artist = this.byteToString(bytArtist); //获取唱片名 str = null; j = 0; byte[] bytAlbum = new byte[30];//将唱片名部分读到一个单独的数组中 for (i = currentIndex; i < currentIndex + 30; i++) { bytAlbum[j] = Info[i]; position++; j++; } currentIndex = position; mp3Info.Album = this.byteToString(bytAlbum); //获取年 str = null; j = 0; byte[] bytYear = new byte[4];//将年部分读到一个单独的数组中 for (i = currentIndex; i < currentIndex + 4; i++) { bytYear[j] = Info[i]; position++; j++; } currentIndex = position; mp3Info.Year = this.byteToString(bytYear); //获取注释 str = null; j = 0; byte[] bytComment = new byte[28];//将注释部分读到一个单独的数组中 for (i = currentIndex; i < currentIndex + 25; i++) { bytComment[j] = Info[i]; position++; j++; } currentIndex = position; mp3Info.Comment =this.byteToString(bytComment); //以下获取保留位 mp3Info.reserved1 = (char)Info[++position]; mp3Info.reserved2 = (char)Info[++position]; mp3Info.reserved3 = (char)Info[++position]; return mp3Info; } /// <summary> /// 将字节数组转换成字符串 /// </summary> /// <param name = "b">字节数组</param> /// <returns>返回转换后的字符串</returns> private string byteToString(byte[] b) { Encoding enc = Encoding.GetEncoding("GB2312"); string str = enc.GetString(b); str = str.Substring(0, str.IndexOf("#CONTENT#") >= 0 ? str.IndexOf("#CONTENT#") : str.Length);//去掉无用字符 return str; // byte[] bs = { 97, 98, 99, 100, 101, 102 }; // string str = System.Text.Encoding.ASCII.GetString(b); // return str; } /// <summary> /// 更改文件名 /// </summary> /// <param name="filePath">文件名</param> /// <returns></returns> private bool ReName(string filePath) { if (File.Exists(filePath)) { Mp3Info mp3Info = new Mp3Info(); mp3Info = this.getMp3Info(this.getLast128(filePath));//读出文件信息 mp3Info.Artist = this.DeleteNotvalue(mp3Info.Artist); mp3Info.Title = this.DeleteNotvalue(mp3Info.Title); if (mp3Info.Artist.Trim().Length == 0) { mp3Info.Artist = "未命名"; } if (mp3Info.Title.Trim().Length == 0) { mp3Info.Title = "未知名歌曲"; } try { //更名 File.Move(filePath, filePath.Substring(0, filePath.ToLower().LastIndexOf("\\")).Trim() + "\\" + "(" + mp3Info.Artist.Trim() + ")" + mp3Info.Title.Trim() + ".mp3"); return true; } catch (Exception) { return false; } } else { return false; } } private string DeleteNotvalue(string p) { throw new NotImplementedException(); }
值得说明的是这种方法我没有成功,不知道是不是因为转换的原因 还是其他什么,倒腾了很久都没有结果!
c#读取MP3、wmv等格式歌曲信息
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。