Wma开始有一个是16个字节的标识,表示是wma:30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 62 CE 6C,在这16个字节后面有6字节不清楚是什么,但是很多人说这6个自己是wma帧的个数。一般没有什么用处,可以不管跳过就行。
下来就是wma的帧了,wma有很多帧,每个帧前16个字节来标识这个帧,紧跟着的8个字节表示帧的大小。常常用到的是标准的tag和扩展的tag。
1.标准的tag的标识字节为:33 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c,标准的tag里包含了5个信息分别是:名称,艺术家,版权,注释,还有一个不清楚。标准tag的结构如下:
帧头标识(16) |
帧大小(8) |
|||
音乐名称大小 |
艺术家大小 |
版权大小 |
注释大小 |
第五个信息大小 |
音乐名称 |
||||
艺术家 |
||||
版权 |
||||
注释 |
||||
第五个信息 |
||||
2.扩展tag:40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50,这里面包含了专辑,流派,专辑封面等信息。其帧的结构如下:
头标识(16) |
帧大小(8) |
|||
信息个数(2) |
||||
信息表示的长度(2) |
标识内容 |
Flag(2) |
内容长度(2) |
内容 |
当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;当扩展信息名字为WM/Genre时,这个值代表的就是流派;"WM/Picture" 这个代码专辑的封面。这里重点说一下在arm上读取音乐文件里面的图片。
存储图片的结构如下:
WM/Picture |
Flag(2) |
Tag size (2) |
Unknown flag(1) |
Image length |
Unknown flag(2) |
Image Type |
|
Data |
在arm上读取图片的时候有它自己的类型如果类型不对,就会出错。可以通过ISHELL_GetHandle来得到IImage接口的classid。
3.wma头的扩展帧:B5 03 BF 5F 2E A9 CF 11 8E E3 00 C0 0C 20 53 65,这个tag里包含了很多信息,在扩展帧里可能又包含了很多子帧,有一个对写wma有用的就是padding的帧,这个帧可以作为扩展帧的子帧也可以独立成为一帧。这个帧可以在不重新写wma的情况下,可以对wma的头做改变。不管padding帧在哪里它的标识都是一样的:74 D4 06 18 DF CA 09 45 A4 BA 9A AB CB 96 AA E8,后面的8个字节表示帧的大小,其他的都是00。
在扩展帧里有
扩展帧的结构如下:
扩展帧头标识(16) |
帧的大小(8) |
保留位(16) |
保留位(2) |
数据大小(4) |
|
数据(包含很多帧) |
3.关于wma属性的帧,这个帧的16个字节的标识为:A1 DC AB 8C 47 A9 CF 11 8E E4 00 C0 0C 20 53 65,这个帧里包含了文件的大小,创建时间以及文件播放的一些数据如数据包的个数,码率等信息,这些我们就不用详细了解了。在帧开始的第24后跟的是关于文件大小的信息。
关于修改wma的头。
大部分的wma都有pading这个帧,所以不用重新写文件,将修改的内容写入padding就可以了,下面详细介绍写法:以修改音乐名称为例。
音乐名称是写在标准tag里的,所以要修改标准tag。如果pading帧在标准tag的后面那就要把从标准tag到padding tag的内容全部向后移动或者向前移动,总之保证新写入标准tag的大小。所以要修改padding,如果padding tag在extension tag里就要修改扩展头里的padding的大小,数据的大小,padding tag的大小,如果padding不是extension tag的子tag那就写该padding tag的大小就行了。然后修改标准头的大小,再修改音乐名称长度,在修改名称。还有一种情况就是如果没有标准tag,那就需要创建一个标准的tag,一般将它写在文件的开头。写wma头的时候一定要小心,因为如果一旦写错就会导致文件破坏不能播放。