Wma 文件格式示意图:
Wma 文件头 | 标准 TAG 帧 | 扩展 TAG 帧 | 音频 DATA 区 |
如下图绿色部分所示,前 16 个字节 (30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C) 用来标示该文件是否为 wma 文件,接下来的 8 个字节为一个整数,表示整个 WMA 文件头部的大小,这个头部里面包含了 Tag 信息等所有非音频信息,头部后面的是音频信息,我们在这里就不深入了解了。那个整数接下来的 6 个字节还没搞清楚是什么用的,不过不影响我们对 Tag 信息的读写。
注意: 用来表征文件头部大小的 8 个字节采用的是 unicode 编码,该例中文件头部大小为 0XDE34 个字节。以后涉及到帧大小的字节都是这种表示方式。
从文件开始偏移量为 31 开始,里面存放了很多帧,有我们需要的标准 Tag 信息,扩展 Tag 信息,WMA 文件控制信息等等。每个帧不是等长的,但是帧头是固定的 24 个字节,其中前 16 字节是用来标识这个帧的名字,后 8 个字节是用来表示这个帧(包括帧头)的大小。这一点和 MP3 文件的 ID3V2 信息比较像。
接下来我们分析标准 TAG 帧,标准 TAG 帧示意图如下:
TAG 帧头标志(16 字节) | |||||
帧大小(8 字节) | Size A | Size B | Size C | Size D | |
Size E | Content A(Title) | ||||
Content B(Artist) | |||||
Content C(Copyright) | |||||
Content D(Comment) | |||||
Content E(未知) | |||||
标准 Tag 帧只包含歌曲标题,艺术家,版权,备注四个内容。它的帧头标志是十六进制的“33 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,在 24 个字节的帧头后紧跟着 5 个分别为 2 个字节的整数,前四个分别表示歌曲标题,艺术家,版权,备注的大小,第五个还不清楚是什么用的,大部分情况下是不使用的,即它的大小为 0 的。
在这 10 个字节后,这四个信息的内容就按顺序存放了。记住,在 WMA 文件里,所有的文字都是按 Unicode 宽字符的编码方式储存的,而且每个字符串后面都又一个 0 结束字符的,整个标准 TAG 帧结构如下图所示:
下面我们分析扩展 TAG 帧,扩展 TAG 帧示意图如下:
帧头标志(16 字节) | ||
帧大小(8 字节) | ExNum | |
NO.1 | ||
NO.2 | ||
…… | ||
NO. ExNum |
扩展 Tag 帧里面包含的信息的个数是不确定的,每个信息也是按照像帧一样的方式组织起来的。扩展 Tag 帧的帧头标志是十六进制的“40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50”,在 24 字节的帧头后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数(ExNum)。专辑名、专辑封面等信息都在这一区域。接下来我们以专辑封面为例来分析其中一个信息的结构,下图是单个信息的
Size 1 | 扩展信息名 | |
Flag | Size 2 | 扩展信息内容 |
其 中 Size 1 表 示 的 是 扩 展 信 息 名 的 长 度 , 假 如 扩 展 信 息 名 为
W.M./P.i.c.t.u.r.e. ,则 Size 1 就为 16 00,如下图所示:
绿色部分接下来的 01 00 表示的是图片格式为:image/jpeg,4E 37 表示
的是整个专辑封面信息帧的大小(包括图片以及注释信息),为 0X374E 个字节;接下来的 03 表示的是封面图片的类型。如下表所示:
Value Description
- Picture of a type not specifically listed in this table
- 32 pixel by 32 pixel file icon. Use only with portable network graphics (PNG) format
- File icon not conforming to type 1 above
- Front album cover
- Back album cover
- Leaflet page
- Media. Typically this type of image is of the label side of a CD
- Picture of the lead artist, lead performer, or soloist
- Picture of one of the artists or performers
- Picture of the conductor
- Picture of the band or orchestra
- Picture of the composer
- Picture of the lyricist or writer
- Picture of the recording studio or location
- Picture taken during a recording session
- Picture taken during a performance
- Screen capture from a movie or video
- A bright colored fish
- Illustration
- Logo of the band or artist
- Logo of the publisher or studio 接下来的 31 37 00 00 表示的是图片的大小为 0x3731 个字节,接下来的
24 个字节(69 00 6D 00 61 00 67 00 65 00 2F 00 6A 00 70 00 65 00 67 00
00 00 00 00)表示的就是 i.m.a.g.e./.j.p.e.g, 从 FF D8 FF E0 …开始就是图片数据区了。
值得注意的是,在修改专辑封面的时候,如果新图片大小为 5k,wma 文件中固有图片大小为 30k,那么这个差值 25k 会全以 00 的形式插在音乐 data 区
开始之前与 wma 文件头结束之后的这个区间,如下图所示:
绿色部分的 16 个字节应该表示文件头(包含标准 TAG 帧、扩展 TAG 帧以
及控制信息)结束的标志,接下来的 16 个字节”74 D4 06 18 DF 09 45 A4 BA
9A AB CB 96 AA E8”应该表示的是 00 区所在帧的标志,接下来的两个字节 91 A0 表示的是 00 帧的大小为 0XA091 个字节。