关于wma头(续)

Wma开始有一个是16个字节的标识,表示是wma30 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.扩展tag40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50,这里面包含了专辑,流派,专辑封面等信息。其帧的结构如下:

头标识(16

帧大小(8

信息个数(2

信息表示的长度(2

标识内容

Flag2

内容长度(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的后面那就要把从标准tagpadding tag的内容全部向后移动或者向前移动,总之保证新写入标准tag的大小。所以要修改padding,如果padding tagextension tag里就要修改扩展头里的padding的大小,数据的大小,padding tag的大小,如果padding不是extension tag的子tag那就写该padding tag的大小就行了。然后修改标准头的大小,再修改音乐名称长度,在修改名称。还有一种情况就是如果没有标准tag,那就需要创建一个标准的tag,一般将它写在文件的开头。写wma头的时候一定要小心,因为如果一旦写错就会导致文件破坏不能播放。

 

 

你可能感兴趣的:(c,image,存储,扩展,音乐,extension)