zoukankan      html  css  js  c++  java
  • C#获取MP3,WMA信息

    用于获取MP3内部信息,包括歌曲名,歌手名等……
    
     
    
     namespace FileBatchRemaer.domain
    {
        /// <summary>
        /// Mp3信息结构 
        /// </summary>
        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 Mp3FileInfo
        {
            Mp3Info info;
    
            /// <summary>
            /// 构造函数,输入文件名即得到信息
            /// </summary>
            /// <param name="mp3FilePos"></param>
            public Mp3FileInfo(String mp3FilePos)
            {
                info = getMp3Info(getLast128(mp3FilePos));
            }
    
            /// <summary>
            /// 获取整理后的Mp3文件名,这里以标题和艺术家名定文件名
            /// </summary>
            /// <returns></returns>
            public String GetOriginalName()
            {
                return formatString(info.Title.Trim()) + "-" + formatString(info.Artist.Trim());
            }
    
            /// <summary>
            /// 去除字符
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            private String formatString(String str)
            {
                return str.Replace("", "");
            }
    
            /// <summary> 
            /// 获取MP3文件最后128个字节 
            /// </summary> 
            /// <param name="FileName">文件名</param> 
            /// <returns>返回字节数组</returns> 
            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;
            }
    
            /// <summary> 
            /// 获取MP3歌曲的相关信息 
            /// </summary> 
            /// <param name = "Info">从MP3文件中截取的二进制信息</param> 
            /// <returns>返回一个Mp3Info结构</returns> 
            private 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;
            }
        }
    }
    
     
    
     
    
    wma:利用shell32获取信息:首先在项目中添加shell32.dll,在windowssystem32下面
    
     1        public string[] getSongInfoFromWma(string FileName)
     2        {
     3            string[] wmaFileStruct = new string[3];
     4            MP3File mp3=new MP3File(); 
     5            //create shell instance
     6            Shell32.Shell shell  = new Shell32.ShellClass();
     7            //set the namespace to file path
     8            Shell32.Folder folder = shell.NameSpace(FileName.Substring(0,FileName.LastIndexOf("\")));
     9            //get ahandle to the file
    10            Shell32.FolderItem folderItem = folder.ParseName(FileName.Substring(FileName.LastIndexOf("\")+1));
    11            //did we get a handle ?
    12            
    13            
    14            wmaFileStruct[0] = folder.GetDetailsOf(folderItem,10);  //歌曲名称
    15            wmaFileStruct[1] = folder.GetDetailsOf(folderItem,9);   //歌手名称
    16            wmaFileStruct[2] = folder.GetDetailsOf(folderItem,21);  //播放时间
    17
    18            return wmaFileStruct;
    19        }
    20
  • 相关阅读:
    DataPipeline合伙人&CPO陈雷:成为中国的世界级数据中间件厂商
    数字化转型提速,DataPipeline助力中石油产业大数据实时共享能力再提升
    IT168专访|DataPipeline 合伙人&CPO陈雷:我们致力于成为中国的世界级数据中间件厂商
    Odoo 新老版本关于action window动作绑定的两种写法
    关于 错误"ERROR:RELAXNGV:RELAXNG_ERR_EXTRACO NTENT: Element openerp has extra content: data"的处理
    Odoo 前期各版本的协议变化对比
    如何让odoo在执行如PG、Less编译等调用时出现的异常信息打印出来
    Odoo14 官方新版docker镜像跑起来网站页面异常 元素 '<xpath expr="//*[hasclass('o_footer_copyright_name')]">' 在母级视图中没有找到
    一种将历史地图坐标配准到GIS中的方法
    水利地理信息系统
  • 原文地址:https://www.cnblogs.com/qq1223558/p/3909240.html
Copyright © 2011-2022 走看看