zoukankan      html  css  js  c++  java
  • 【笔记】解析MP3文件信息

    在写有关音乐播放的程序的时候有时需要解析文件的一些基本信息,例如MP3格式的文件中的 艺术家,专辑,歌曲名,比特率,专辑图片等等

    直接对MP3文件编码进行分析的过程比较复杂,这里介绍一个库的使用,通过这个库可以很方便的分析出MP3文件的信息

    该类库项目地址:http://www.codeproject.com/Articles/17890/Do-Anything-With-ID3

    得到ID3.dll,引用到项目中

    string path = @"G:\Music\周杰伦-轨迹.mp3";
    ID3Info info = new ID3Info(path, true);            //第二个参数表示是否加载数据

    ID3Info类有四个属性

      FilePath,FileName,ID3v1Info, ID3v2Info

      其中ID3v1Info有以下成员,具体说明可以参考

    http://baike.baidu.com/view/66078.htm#3

            string title = info.ID3v1Info.Title;        //标题
            string artist = info.ID3v1Info.Artist;        //作者
            string album = info.ID3v1Info.Album;        //专辑
            string comment = info.ID3v1Info.Comment;    //备注
            string genre = info.ID3v1Info.Genre;        //类型
            string year = info.ID3v1Info.Year            //出品年代

      ID3v2Info属性包含的数据比较复杂,一般用函数对其进行操作,主要有

      属性:

        AttachedPictureFrames  //可以MP3文件中含有的图片

      函数:    GetTextFrame  SetTextFrame  //获取歌曲信息

            string title = info.ID3v2Info.GetTextFrame("TIT2");
            string artist = info.ID3v2Info.GetTextFrame("TPE1");
            string album = info.ID3v2Info.GetTextFrame("TALB");
            string trckNumber = info.ID3v2Info.GetTextFrame("TRCK");
            string year = info.ID3v2Info.GetTextFrame("TYER");
            string genre = info.ID3v2Info.GetTextFrame("TCON");
            string cmm = info.ID3v2Info.GetTextFrame("COMM");
            
            info.ID3v2Info.SetTextFrame("TIT2", "歌曲标题");
            info.ID3v2Info.SetTextFrame("TPE1", "艺术家");
            info.ID3v2Info.SetTextFrame("TALB", "专辑");
            info.ID3v2Info.SetTextFrame("COMM", "备注");
            
            // 创建新封面
            string picuter = @"C:\Users\bomo\Desktop\pic.jpg";
            AttachedPictureFrame pic = new AttachedPictureFrame(FrameFlags.Compression, "cover.jpg", TextEncodings.UTF_16, "", 
                AttachedPictureFrame.PictureTypes.Other, 
                new System.IO.MemoryStream(File.ReadAllBytes(picture)));
            
            //添加封面到MP3文件中
            info.ID3v2Info.AttachedPictureFrames.Add(pic);
            
            //读取图片
            foreach (AttachedPictureFrame frame in frames)
            {
                MemoryStream stream = frame.Data;
                string saveFile = @"C:\Users\bomo\Desktop\pic2.jpg";
    
                using (FileStream fs = new FileStream(saveFile, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    int b;
                    while((b = stream.ReadByte()) != -1)
                    {
                        fs.WriteByte((byte)b);
                    }
                }
            }
            info.save();

    注意,对文件修改后一定要调用save()方法,才会使修改生效

    其他一些属性和方法不是很常用,更多信息可以参阅:http://id3.org/

    还有一个解析文件的时间长度,由于MP3文件本身没有存放时间的信息,所以这里我们使用微软提供的API,首先引入两个函数

            [DllImport("Kernel32", CharSet = CharSet.Auto)]
            static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
    
            [DllImport("winmm.dll")]
            public static extern int mciSendString(string m_strCmd, StringBuilder m_strReceive, int m_v1, int m_v2); 

    接下来是计算出歌曲的时间,直接给出c#代码

            public string GetLengthString(string path)
            {
                StringBuilder buf = new StringBuilder(80);
                GetShortPathName(@path, buf, buf.Capacity);
                string shortname = buf.ToString();
    
                buf = new StringBuilder(80);
                mciSendString("close all", buf, buf.Capacity, 0);
                mciSendString("open " + shortname + " alias song", buf, buf.Capacity, 0);
                mciSendString("status song length", buf, buf.Capacity, 0);
    
    
                int len = (int)Convert.ToDouble(buf.ToString()) / 1000;        //
                TimeSpan ts = new TimeSpan(0, 0, len);
                int minuts = ts.Minutes;
                int second = ts.Seconds;
    
                return minuts.ToString("d2") + ":" + second.ToString("d2");
            }

    ID3库文件 https://files.cnblogs.com/bomo/ID3.zip

  • 相关阅读:
    已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
    C#微信公众号开发 -- (六)自定义菜单事件之CLICK
    C#微信公众号开发 -- (五)自定义菜单创建
    C#微信公众号开发 -- (四)获取API调用所需的全局唯一票据access_token
    C#微信公众号开发 -- (三)用户关注之后自动回复
    C#微信公众号开发 -- (二)验证成为开发者
    linux下删除大量文件提示参数过长解决办法
    Linux 远程连接sftp与ftp
  • 原文地址:https://www.cnblogs.com/bomo/p/2809354.html
Copyright © 2011-2022 走看看