WmaFileStyle

Wma文件头结构图

WMAHead

wmaheadAllSize

Unknow

 

Frame1

Frame2

Frame3

……….

每一个WMA文件,它的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C” 用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息,我们在这里就不深入了解了。那个整数接下来的6个字节还没搞清楚是什么用的,不过不影响我们对Tag信息的读写。
   
也就是说从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。这一点和MP3文件的ID3V2信息比较像。

由于我们只需要读写Tag信息,而Tag信息又分别保存在两个帧里,分别为标准Tag帧和扩展Tag帧,所有我们只需要处理这两个帧,其他帧完全可以根据获得的帧长度来跳过。

标准Tag结构图

FrameHead

FrameSize

SizeA

SizeB

SizeC

SizeD

SizeE

ConlentA (Title)

ConlentB (Artist)

ConlentC (Copyright)

ConlentD (Comment)

ConlentE (Unknow)

标准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结构图

FrameHead

FrameSize

ExtNo

 

Section 1

Section 2

………...

Section ExtNo

扩展Tag帧,这里就比较麻烦了,里面包含的信息的个数是不确定的,每个信息也是按照像帧一样的方式组织起来的。扩展Tag帧的帧名是十六进制的“40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50”,在24字节的帧头后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数(ExtNo)。

扩展Tag帧内段结构图

SizeN

SectionName

Flag

SizeV

SectionValue

每一个扩展信息包含扩展信息名字和对应的值。先有一个两个字节的整数来表示扩展名字信息的大小,接着是扩展信息,然后有一个两个字节的整数标志(Flag),这个后面再讲。然后又是一个两个字节的整数,表示值的大小。接着就是这个值。
   
当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;当扩展信息名字为WM/Genre时,这个值代表的就是流派;同理,很容易从扩展信息的名字看出这个值的用途的。这些扩展信息的名字和值几乎都是用Unicode的字符串来存储的,到现在为止只发现对下面两个情况例外。(关于所有扩展信息的名字可以从很多地方查到,比如SDK帮助,MSDN
   
下面再来看看那个标志Flag,这个基本上是为没什么用的(通常值为0),只对WM/TrackNumberWM/Track这两个扩展信息名字有用,当Flag3的时候后面的值(也就是曲目信息)是以4个字节的整数的形式表示,当Flag0的时候,曲目信息是以普通的字符串形式表示的。

在研究wma格式的时候发现,它有一个帧是全都是 0 的,相当于缓冲区。如果写入的歌名比原来长的话,就减少缓冲区大小,歌名短就增加缓冲区。这样就可以保持文件头的大小不变,每次更新的话只需要重写文件头,不需要重写音频数据。这6个字节其中前面4个字节应该为总标签帧数。(猜测)理由如下:  个人写了个更改WMA头文件的程序,为WMA增加了一个自定义帧,插入后的结果是该文件无法播放,遍查不得其果,想到这6BYTE可能有所相关,就对比了两个WMA文件,发现这6BYTE中头一个BYTE不一样,猜测这个数据应该为帧数,于是更改该数据,发现更改后WMA文件解码正常。后经对比,证实这个数据确实为帧数,但唯一不能确定的是这个数据究竟是否是int型、short型、又或者是BYTE型。从文件上看个人认为是int型的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值