关于MP3文件的各种信息的读取方法

之前有写过一篇获取MP3文件tag信息的文章,现在具体说下,tag在MP3文件中只是非常小的一部分信息,专业点的说法是ID3v1标签,其中主要存放了tag信息,现在值得一提的是目前大多数MP3文件中存在的另一种标签ID3v2,这个和ID3v1不同,是存在在MP3文件的开头的,只要这个MP3文件有ID3v2标签,那么一定存在于开头(当然有些没有该标签的MP3文件也并不是不存储信息了,还有别的标签,比如说Xing头,在这里先详细说ID3v2标签),下面看下这些标签的结构吧

整个ID3v2标签分为2个部分:标签头和标签体

标签头:

header ——ID3的标志,占3个byte

version ——版本号,占一个byte

revision ——副版本号,占一个byte

flags ——占一个byte

size ——占4个byte,该size不包括标签头,计算方法:byte_1*0x200000+byte_2*0x4000+byte_3*0x80+byte_4

标签体:

标签体中有很多数据帧,看过MP3文件解析的同学应该知道,数据帧也是和标签头类似的分布:数据帧头和数据帧体

数据帧头:

frame_header ——数据帧的标志,指明该数据帧存放什么数据,占4个byte

frame_size ——数据帧体的大小(不包括帧头),计算方法:byte_1*0x1000000+byte_2*0x10000+byte_3*0x100+byte_4

frame_flags ——占2个字节

frame_encoder ——可能有,在MP3文件解析的介绍上有提到,但是到官网上的ID3v2.3标准格式是没有这个的

数据帧体一般就只有数据,一般是紧跟在数据帧头后面的,但是有一个是例外,就是专辑图片,所以当要获得专辑图片的时候,需要获取图片开始的位置,然后根据计算出来的size大小来读取图片的数据,下面就重点写下图片获取的代码:


public static void GetMediaItemImage(string path)
        {
            try
            {
                FileStream fs = new FileStream(path, FileMode.Open);
                byte[] header = new byte[10];       //标签头
                fs.Read(header, 0, 10);
                string head = Encoding.Default.GetString(header, 0, 3);
                if (head.Equals("ID3"))
                {
                    int sizeAll = header[6] * 0x200000  //获取该标签的尺寸,不包括标签头
                        + header[7] * 0x4000
                        + header[8] * 0x80
                        + header[9];
                    int size = 0;
                    byte[] body = new byte[10];     //数据帧头,这里认为数据帧头不包括编码方式
                    fs.Read(body, 0, 10);
                    head = Encoding.Default.GetString(body, 0, 4);
                    while (!("APIC".Equals(head)))          //当数据帧不是图片的时候继续查找
                    {
                        size = body[size + 4] * 0x1000000    //获取该数据帧的尺寸(不包括帧头)
                        + body[size + 5] * 0x10000
                        + body[size + 6] * 0x100
                        + body[size + 7];
                        body = new byte[size + 10];
                        fs.Read(body, 0, size + 10);
                        head = Encoding.Default.GetString(body, size, 4);
                    }
                    size = body[size + 4] * 0x1000000
                        + body[size + 5] * 0x10000
                        + body[size + 6] *0x100
                        + body[size + 7];
                    byte[] temp = new byte[4];
                    fs.Read(temp, 0, 4);
                    string tmp = Encoding.Default.GetString(temp);
                    while (!("JFIF".Equals(tmp)))            //我发现一个规律就是所有在ID3v2中的图片都会有
                    {                                        //JFIF的标志,而图片开始的位置就是这个标志尾部
                        fs.Seek(-3, SeekOrigin.Current);     //所在的字节位置-10,所以当获取到图片数据帧的
                        fs.Read(temp, 0, 4);                 //时候,要先查找这个位置,来获取图片
                        tmp = Encoding.Default.GetString(temp);
                    }
                    fs.Seek(-10, SeekOrigin.Current);
                    byte[] image = new byte[size];
                    fs.Read(image, 0, size);
                    MemoryStream ms = new MemoryStream(image);
                    Image pic = Image.FromStream(ms);
                    FileStream save = new FileStream(@"D:\wen.png", FileMode.Create);
                    pic.Save(save, System.Drawing.Imaging.ImageFormat.Png);
                }
                else { }
            }
            catch { } 
        }

在这里,图片获取的时候如果要保存,最好为png格式,其他的格式可能会使图片有一些缺损,具体怎么回事我也不清楚,希望有大牛能解释吧,还有,图片在ID3v2标签中的标志是APIC,另外再写一些非图片的标志,以便大家读取别的信息:

4.21  AENC Audio encryption
  4.15  APIC Attached picture

  4.11  COMM Comments
  4.25  COMR Commercial frame

  4.26  ENCR Encryption method registration
  4.13  EQUA Equalization
  4.6   ETCO Event timing codes

  4.16  GEOB General encapsulated object
  4.27  GRID Group identification registration

  4.4   IPLS Involved people list

  4.21  LINK Linked information

  4.5   MCDI Music CD identifier
  4.7   MLLT MPEG location lookup table

  4.24  OWNE Ownership frame

  4.28. PRIV Private frame
  4.17  PCNT Play counter
  4.18  POPM Popularimeter
  4.22  POSS Position synchronisation frame

  4.19  RBUF Recommended buffer size
  4.12  RVAD Relative volume adjustment
  4.14  RVRB Reverb

  4.10  SYLT Synchronized lyric/text
  4.8   SYTC Synchronized tempo codes

  4.2.1 TALB Album/Movie/Show title
  4.2.1 TBPM BPM (beats per minute)
  4.2.1 TCOM Composer
  4.2.1 TCON Content type
  4.2.1 TCOP Copyright message
  4.2.1 TDAT Date
  4.2.1 TDLY Playlist delay
  4.2.1 TENC Encoded by
  4.2.1 TEXT Lyricist/Text writer
  4.2.1 TFLT File type
  4.2.1 TIME Time
  4.2.1 TIT1 Content group description
  4.2.1 TIT2 Title/songname/content description
  4.2.1 TIT3 Subtitle/Description refinement
  4.2.1 TKEY Initial key
  4.2.1 TLAN Language(s)
  4.2.1 TLEN Length
  4.2.1 TMED Media type
  4.2.1 TOAL Original album/movie/show title
  4.2.1 TOFN Original filename
  4.2.1 TOLY Original lyricist(s)/text writer(s)
  4.2.1 TOPE Original artist(s)/performer(s)
  4.2.1 TORY Original release year
  4.2.1 TOWN File owner/licensee
  4.2.1 TPE1 Lead performer(s)/Soloist(s)
  4.2.1 TPE2 Band/orchestra/accompaniment
  4.2.1 TPE3 Conductor/performer refinement
  4.2.1 TPE4 Interpreted, remixed, or otherwise modified by
  4.2.1 TPOS Part of a set
  4.2.1 TPUB Publisher
  4.2.1 TRCK Track number/Position in set
  4.2.1 TRDA Recording dates
  4.2.1 TRSN Internet radio station name
  4.2.1 TRSO Internet radio station owner
  4.2.1 TSIZ Size
  4.2.1 TSRC ISRC (international standard recording code)
  4.2.1 TSSE Software/Hardware and settings used for encoding
  4.2.1 TYER Year
  4.2.2 TXXX User defined text information frame

  4.1   UFID Unique file identifier
  4.23  USER Terms of use
  4.9   USLT Unsychronized lyric/text transcription

  4.3.1 WCOM Commercial information
  4.3.1 WCOP Copyright/Legal information
  4.3.1 WOAF Official audio file webpage
  4.3.1 WOAR Official artist/performer webpage
  4.3.1 WOAS Official audio source webpage
  4.3.1 WORS Official internet radio station homepage
  4.3.1 WPAY Payment
  4.3.1 WPUB Publishers official webpage
  4.3.2 WXXX User defined URL link frame

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值