zoukankan      html  css  js  c++  java
  • C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

    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 即可;
    //如果是1.0版本会报错请下载1.2版本 下载地址
    https://download.csdn.net/download/u013087481/10952812

    调用结果,在Win2003,2008,xp上应使用dir.GetDetailsOf(item, 21) ,而在Vista,win7、win8,win10等系统应使用folder.GetDetailsOf(folderItem, 27) ,主要是因为不同系统下文件属性索引顺序不同造成。只要右键单击文件属性,能看到的媒体属性都能取到,可以换不同的索引值来取。如下所示,取出的时间长度是 00:03:52,目标完成。

     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-NAME
    
    0   => Name
    
    1   => Size     // MP3 文件大小
    
    2   => Type
    
    3   => Date modified
    
    4   => Date created
    
    5   => Date accessed
    
    6   => Attributes
    
    7   => Offline status
    
    8   => Offline availability
    
    9   => Perceived type
    
    10  => Owner
    
    11  => Kinds
    
    12  => Date taken
    
    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  => Bit rate
    
    29  => Protected
    
    30  => Camera model
    
    31  => Dimensions
    
    32  => Camera maker
    
    33  => Company
    
    34  => File description
    
    35  => Program name
    
    36  => Duration
    
    37  => Is online
    
    38  => Is recurring
    
    39  => Location
    
    40  => Optional attendee addresses
    
    41  => Optional attendees
    
    42  => Organizer address
    
    43  => Organizer name
    
    44  => Reminder time
    
    45  => Required attendee addresses
    
    46  => Required attendees
    
    47  => Resources
    
    48  => Free/busy status
    
    49  => Total size
    
    50  => Account name
    
    51  => Computer
    
    52  => Anniversary
    
    53  => Assistant's name
    
    54  => Assistant's phone
    
    55  => Birthday
    
    56  => Business address
    
    57  => Business city
    
    58  => Business country/region
    
    59  => Business P.O. box
    
    60  => Business postal code
    
    61  => Business state or province
    
    62  => Business street
    
    63  => Business fax
    
    64  => Business home page
    
    65  => Business phone
    
    66  => Callback number
    
    67  => Car phone
    
    68  => Children
    
    69  => Company main phone
    
    70  => Department
    
    71  => E-mail Address
    
    72  => E-mail2
    
    73  => E-mail3
    
    74  => E-mail list
    
    75  => E-mail display name
    
    76  => File as
    
    77  => First name
    
    78  => Full name
    
    79  => Gender
    
    80  => Given name
    
    81  => Hobbies
    
    82  => Home address
    
    83  => Home city
    
    84  => Home country/region
    
    85  => Home P.O. box
    
    86  => 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;//保留位,一个字节     
        }     
        /// <summary>
        /// mp3类
        /// </summary>
        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;
            }
            //上面程序用到下面的方法:     
            ///   <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('') >= 0 ? str.IndexOf('') : str.Length);//去掉无用字符     
                return str;
            } 
        }
  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/shiyh/p/10362475.html
Copyright © 2011-2022 走看看