主题:[原创]Wma文件的数据结构以及读取信息的代码
Wma文件的数据结构以及读取信息的代码
wma文件的基本组织单元叫做对象,wma文件宏观上由三个顶级对象组成:头对象(Header Object)、
数据对象(Data Object)、其它顶级对象(Other top-level objects),其中前两个对象是必须的。
头对象里又包含很多其他的子对象。头对象包含的对象主要有: Wma头(顶级的,实际上是头对象
的前30个字节)、文件属性对象(全局文件属性)、流属性对象(定义一个媒体流及其属性)、内容描
述对象(包含所有目录信息)、部件下载对象(提供播放部件信息)、流组织对象(逻辑上把多个媒体
流组织在一起),等等。这些对象主要描述了非音频压缩数据的一些信息。例如作者,曲目信息,用户
加入的命令信息,码流的码率等信息。每个对象相当于一个信息描述符。
数据对象以数据包的形式存储压缩的音频数据,以便于实现网络传输。
所有的对象都由一个16字节的GUID(对象标识符,又称“对象ID”)、一个8字节的对象大小和一个
可变长的对象数据组成。你只需识别对象后,按对象格式读结构,就能找到所需要的信息。
与非音频压缩数据的信息有关的对象主要有:编码译码器列表对象;内容描述符对象(又称“标准
标签对象”);扩展内容描述符对象(又称“扩展标签对象”)。而我们自编的程序一般就只要获取或
修改后两个对象的信息就行了。
一、一些比较重要的头对象
表1 Wma头的数据结构
--------------------------------
域名称 数据类型 大小(字节)
--------------------------------
对象ID GUID 16
对象大小 QWORD 8
头对象总数 DWORD 4
保留 BYTE 2
--------------------------------
说明:
1.对象ID固定为 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C。此ID是全局性的WmaID。
2.保留字节的编码固定为01 02。
3.头对象总数是指其它所有的子对象,这些子对象也被称为头对象,但我们要弄清之间的关系。
4.本表以及下面各表中的数据类型是按C语言而定的,与VB是有差异的,这一点请注意。
5.对象大小是包括对象ID、对象大小项本身、以及对象数据在内的总长度。而本表的对象大小也可
以看作是数据对象的起始偏移量。
6.本表以及下面各表中的对象大小或长度单位的字节,均为低位在前高位在后。
7.保留字节后面紧接着就是各个头对象了。
表2 文件属性对象的数据结构(共104字节)
---------------------------------------
域名 数据类型 大小(字节)
---------------------------------------
对象ID GUID 16
对象大小 QWORD 8
文件ID GUID 16
文件大小 QWORD 8
创建日期 QWORD 8
数据包总数 QWORD 8
播放持续时间 QWORD 8
发送持续时间表 QWORD 8
预巻 QWORD 8
Flags DWORD 4
播放标志 1(位)
查找标志 1(位)
保留 30(位)
最小数据包大小 DWORD 4
最大数据包大小 DWORD 4
最大比特率 DWORD 4
---------------------------------------
说明:
1.对象ID固定为 A1 DC AB 8C 47 A9 CF 11 8E E4 00 C0 0C 20 53 65。
2.每个wma文件的文件ID不相同,但它与本文件数据对象中的文件ID是相同的(见表16),当wma文
件修改时,这个值也会改变。
3.数据包总数必须与数据对象中的数据包总数相等(见表16)。
4.求总的播放时间时要减去预巻的值。
5.最小数据包大小和最大数据包大小是固定相等的。
表3 流组织对象的数据结构
--------------------------------------------
域名 数据类型 大小(字节)
--------------------------------------------
对象ID GUID 16
对象大小 QWORD 8
流类型ID GUID 16
纠错类型 DWORD 4
时间补偿 WORD 2
编码器版本字符数 WORD 2
编码器版本 WCHAR 不定(一般=48)
位速 WCHAR 不定(一般=18)
采样频率 WCHAR 不定(一般=16)
是否立体声 WCHAR 不定(一般=28)
是否固定位率 WCHAR 不定(一般=8)
译码器特定数据大小 WORD 2
译码器特定数据 BYTE 不定(一般=2)
--------------------------------------------
说明:
1.对象ID固定为 40 52 D1 86 1D 31 D0 11 A3 A4 00 A0 C9 03 48 F6。
2.流类型ID固定为 41 52 D1 86 1D 31 D0 11 A3 A4 00 A0 C9 03 48 F6。
3.WCHAR类型的字符均为Unicode字符。
4.编码器版本字符数×2=实际的编码器版本项所占用的字节数。
5.从编码器版本的字串到是否固定位率的字串,各字串中间并没有特定的分隔符,只是在所有字串
的最后用两个00 00结束。
6.这个结构是笔者根据多个实际的wma文件研究出来的,但不知“流组织对象”这个名称及其包含
的域名称是否正确。
表4 流属性对象的数据结构
--------------------------------------------
域名 数据类型 大小(字节)
--------------------------------------------
对象ID GUID 16
对象大小 QWORD 8
流类型 GUID 16
纠错类型 GUID 16
时间补偿 QWORD 8
特定类型数据长度 DWORD 4
纠错数据长度 DWORD 4
Flags WORD 2
流编号 7(位)
保留 8(位)
加密标志 1(位)
保留 DWORD 4
****以下星号内是特定类型数据****
译码器ID/格式标签 WORD 2
声道数 WORD 2
采样率 DWORD 4
平均每秒字节数 DWORD 4
块对齐 WORD 2
位速 WORD 2
译码器特定数据大小 WORD 2
译码器特定数据 BYTE 不定
********************************
纠错数据 BYTE 不定
--------------------------------------------
说明:
1.对象ID固定为 91 07 DC B7 B7 A9 CF 11 8E E6 00 C0 0C 20 53 65
2.流类型固定为 40 9E 69 F8 4D 5B CF 11 A8 FD 00 80 5F 5C 44 2B
3.纠错类型固定为 50 CD C3 BF 8F 61 CF 11 8B B2 00 AA 00 B4 E2 20
表5 头扩展对象
----------------------------------
域名称 数据类型 大小(字节)
----------------------------------
对象ID GUID 16
对象大小 QWORD 8
保留域1 GUID 16
保留域2 WORD 2
头扩展数据大小 DWORD 4
头扩展数据 BYTE 不定
----------------------------------
说明:
1.对象ID固定为 B5 03 BF 5F 2E A9 CF 11 8E E3 00 C0 0C 20 53 65
2.保留域1固定为 11 D2 D3 AB BA A9 CF 11 8E E6 00 C0 0C 20 53 65
3.头扩展对象也可以包含子对象。
表6 标准标签对象
--------------------------------------
顺号 域名称 数据类型 大小(字节)
--------------------------------------
⑴ 对象ID GUID 16
⑵ 对象大小 QWORD 8
⑶ 标题项长度 WORD 2
⑷ 艺术家项长度 WORD 2
⑸ 版权项长度 WORD 2
⑹ 注释项长度 WORD 2
⑺ 比率项长度 WORD 2
⑻ 标题 WCHAR 由⑶确定
⑼ 艺术家 WCHAR 由⑷确定
⑽ 版权 WCHAR 由⑸确定
⑾ 注释 WCHAR 由⑹确定
⑿ 比率 WCHAR 由⑺确定
--------------------------------------
说明:
1.对象ID固定为 33 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C。
2.WCHAR类型的文本均用Unicode字符表示,每个字符串后面都用2个00结束。
3.标准标签又称“内容描述符”。
表7 扩展标签对象结构
-------------------------------
域名称 数据类型 大小(字节)
-------------------------------
对象ID GUID 16
对象大小 QWORD 8
帧总数 WORD 2
帧1 不定
……
帧N 不定
-------------------------------
说明:
1.对象ID固定为:40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50。
2.帧的结构见表8。
3.扩展标签又称“扩展内容描述符”。