博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 获取 mp3文件信息
阅读量:7070 次
发布时间:2019-06-28

本文共 6836 字,大约阅读时间需要 22 分钟。

C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

 

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

// http://bbs.csdn.net/topics/390392612
  
string 
file = 
@"E:\滴答.mp3"
;
 
            
ShellClass sh = 
new 
ShellClass();
 
            
Folder dir = sh.NameSpace(Path.GetDirectoryName(file));
 
            
FolderItem item = dir.ParseName(Path.GetFileName(file));
 
            
string 
str = dir.GetDetailsOf(item, 27) ; // 获取歌曲时长。
 
            
MessageBox.Show(str);
 
 
// 如果执行过程中,出现是错误提示,通过 Shell32 的 Embed Interop Types 属性设置为 False 即可;

 

 

 shell 获取 文件详细信息

首先引用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

  

 

 

 

 

 

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

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;//保留位,一个字节         }         ///     /// mp3类    ///     public class clsMP3    {        public void fLogSave(Page _sender, Hashtable _htUser)        {                    }        //所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:             private 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;        }        //再对上面返回的字节数组分段取出,并保存到Mp3Info结构中返回:           private Mp3Info getMp3Info(byte[] Info)        {            Mp3Info mp3Info = new Mp3Info();            string str = null;            int i;            int position = 0;//循环的起始值                 int currentIndex = 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 = 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);           //获取歌手名(数组33-62)                 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);            //获取唱片名(数组63-92)                 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);            //获取年 (数组93-96)                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);            //获取注释(数组97-124)                 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);            //以下获取保留位(数组125-127)                 mp3Info.reserved1 = (char)Info[++position];            mp3Info.reserved2 = (char)Info[++position];            mp3Info.reserved3 = (char)Info[++position];            return mp3Info;        }        //上面程序用到下面的方法:             ///                ///   将字节数组转换成字符串            ///                ///   字节数组             ///   
返回转换后的字符串
private string byteToString(byte[] b) { Encoding enc = Encoding.GetEncoding("GB2312"); string str = enc.GetString(b); str = str.Substring(0, str.IndexOf('\0') >= 0 ? str.IndexOf('\0') : str.Length);//去掉无用字符 return str; } }

 

 

转载地址:http://xeqll.baihongyu.com/

你可能感兴趣的文章
《第一行代码》书籍阅读笔记
查看>>
java基础知识点复习
查看>>
[Hive_add_10] Hive 的 serde (序列化 & 反序列化) 操作
查看>>
7月18日实习日志
查看>>
python面向对象之类成员修饰符
查看>>
Linux命令大全之基本命令
查看>>
HDU2048 神、上帝以及老天爷
查看>>
Android开发指南(35) —— Toast Notifications
查看>>
【Andorid X 项目笔记】禁用ListView的Fling功能(1)
查看>>
RGB、ARGB颜色系统记录
查看>>
二、Python-运算符、控制及循环语句
查看>>
个人作业—Alpha测试
查看>>
Sturts2 与android的图片上传交互
查看>>
使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
查看>>
多线程之NSOpertionQueue操作队列
查看>>
九度oj 1005 Graduate Admission
查看>>
python开发线程:线程&守护线程&全局解释器锁
查看>>
VS下WPF自定义控件的基本步骤和基本代码实现
查看>>
web应用无法访问的原因之一以及如何设置数据库编码
查看>>
WebView简单使用
查看>>