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 即可;

     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;
            } 
        }
  • 相关阅读:
    List数据去重的五种有效方法
    select 1 from ... sql语句中的1代表什么意思?
    gitlab 创建一个空的分支 将本地代码推到特定分支
    Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73injava.exe" (in directory "E:codedt-assets-monitor")
    Git SSH Key 生成步骤
    Git,GitHub与GitLab的区别
    聊聊TCP Keepalive、Netty和Docker
    centos7设置非图形界面
    PHP mysqli 使用预处理语句防注入
    用传纸条讲 HTTPS
  • 原文地址:https://www.cnblogs.com/08shiyan/p/3579822.html
Copyright © 2011-2022 走看看