• 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;
            } 
        }
  • 相关阅读:
    LVM详解
    redis数据类型
    radis数据库安装
    POJ3294 Life Forms 【后缀数组】
    BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】
    POJ2774 Long Long Message 【后缀数组lcp】
    POJ2406 Power Strings 【KMP 或 后缀数组】
    POJ3261 Milk Patterns 【后缀数组】
    BZOJ3289 Mato的文件管理 【莫队 + 树状数组】
    BZOJ2460 [BeiJing2011]元素 【线性基】
  • 原文地址:https://www.cnblogs.com/shiyh/p/10362475.html
Copyright © 2020-2023  润新知