《基于Qt的音频管理系统的设计与实现本科论文.doc》由会员分享,可在线阅读,更多相关《基于Qt的音频管理系统的设计与实现本科论文.doc(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、北京邮电大学毕业设计 基于Qt的音频管理系统的设计与实现摘要随着互联网的的发展,PC机已经不能满足终端用户对音频的需要。虽然目前有各种各样的计算机操作系统,如WINDOWS,LINUX,UNIX,MAC OS等以及各种移动开发平台,如Android,BlackBerry OS,IOS,Windows Mobile,Windows Phone,Palm等,不同的操作系统需要不同的系统软件来开发对应的应用程序。同样的功能,却要开发多次,这给程序员带来了冗余的工作量。本文以Qt为基础,对音频管理系统的实际设计情况进行了需求分析,利用软件工程的开发流程及面向对象的思想,构建了音频管理系统的总体框架,为
2、最终音频管理系统的实现提供了理论依据。测试结果表明,基于Qt的音频管理系统可以在Win7的Qt5.2中运行,也可以在ubuntu的Qt5.2中运行,代码只需做微小的调整,减轻程序员的代码量,节省开发成本,为未来的开发提供一个重要的参考。关键词 Qt;音频管理系统;设计;实现Design and implementation of audio management system based on QtAbstractWith the development of the Internet,the PC has been unable to meet the needs of the audio
3、terminal user.Despite various of computer operating system,such as WINDOWS,LINUX,UNIX,MACOS etc,and various of mobile development platform,such as Android,BlackBerry,OS,IOS,WindowsMobile,Windows Phone,Palm etc,different operating systems require different software systems to develop the correspondin
4、g application .The same function needs to develop several times,which brings redundant work for the programmer. This paper,based on the Qt,carrying on the demand analysis of the actual design of the audio management system,using the development process of software engineering and object-oriented ide
5、a,constructing the general framework of audio management system,and provides a theoretical basis for the implementation of the final audio management system finally.The test results show that Qt audio management system can run in Win7 based on the Qt5.2 and it can also run on ubuntu Qt5.2,the code o
6、nly minor adjustments,reducing the amount of code programmers,saving development costs,providing an important reference for future development. Key words Qt;audio management system;design; implementationii目 录摘要iAbstractii1 绪论11.1 开发背景11.2 系统目标11.3 基于Qt程序的音频管理系统的设计的必要性12 关键技术介绍32.1 音频编码的简单概念32.1.1 采样
7、率和采样大小32.1.2 有损和无损32.1.3 音频压缩技术32.1.4 频率和采样率32.1.5 流特征42.2 音频编码42.2.1 PCM编码42.2.2 WAV42.2.3 MP342.2.4 OGG编码52.2.5 MP3PRO编码52.2.6 ACC格式52.3 音频解析52.3.1 MP3文件解析52.3.2 WMA文件解析72.3.3 OGG文件的解析82.4 Qt的事件模型82.4.1 事件的概念92.4.2 事件的创建92.4.3 事件的交付92.4.4 事件循环模型92.4.5 自定义事件102.5 Qt核心机制信号与槽102.5.1 信号102.5.2 槽112.5.
8、3 信号与槽的关联113 需求分析123.1 需求概述123.2 系统用例图123.3 系统关键领域类134 系统设计144.1 系统介绍144.2 主要功能144.3 系统总体模块144.3.1 系统总体模块介绍144.3.2 系统层次图154.4 系统界面模块介绍154.4.1 主页面154.4.2 以演唱者分类,显示演唱者所对应的歌曲名164.4.3 以专辑名称分类,显示该专辑所对应的歌曲名164.4.4 播放列表174.4.5 播放控制相关按钮174.4.6 播放进度条174.4.7 打开按钮174.5 系统功能模块划分174.5.1 音频文件管理184.5.2 播放控制184.5.3
9、 播放列表194.6 系统开发环境195 系统实现205.1 树形结构显示205.1.1 主要相关代码及说明205.1.2 关键技术应用中问题的解决225.2 播放列表225.2.1 主要相关代码及说明225.2.2 功能实现265.3 读取MP3音频文件265.3.1 主要相关代码265.3.2 写代码时的思路依据295.4 播放控制295.4.1 主要相关功能的部分代码295.4.2 媒体对象状态的简单介绍345.5 播放进度条345.5.1 主要相关功能的部分代码346 系统测试376.1 测试的意义376.2 测试方法376.3 测试过程376.4 单元测试386.5 测试总结38参考
10、文献40致谢41外文原文42外文翻译551 绪论1.1 开发背景Qt是1991年奇趣科技(Trolltech)开发的一个跨平台的C+图形用户界面应用程序框架3,9。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt很容易扩展,并且允许真正地组件编程。2012年,Qt被Digia收购,之后发布Qt5.1、5.2版本,提供Qt for Android(Alpha) 、Qt for IOS 。Qt的优势在于,良好的可移植性,可支持大多数操作系统,如 Microsoft Windows 7, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF
11、/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等 ; 面向对象,Qt良好的封装机制使得Qt模块化程度非常高,代码可重用性较好,很方便用户开发丰富的API,Qt包含250个以上的C+类,并且有相应的帮助文档;支持2D 3D图形渲染,支持XML。Qt针对嵌入式环境推出了Qt Embeeded产品,Qt Embedded具有跨平台的特点,省掉了不少移植软件的功夫,用模块化设计,有弹性,Qt Embedded 最小可以缩到800KB左右,最多可以长到3MB(for Intel x86),使得Qt Embedded 更适合在嵌入式环境下生
12、存1,5-8,10-11。基于Qt跨平台的图形用户界面应用程序框架,用的是C+开发语言。C+语言简洁灵活,运算符的数据结构丰富、具有结构化控制语句、程序执行效率高,而且同时具有高级语言与汇编语言的优点,与其它语言相比,C语言具有可以直接访问物理地址的优点,与汇编语言相比又具有良好的可读性的可移植性。总得来说,C+语言的主要特点表现在两个方面,一是尽量兼容C,二是支持面向对象的方法。它操持了C的简洁、高效的接近汇编语言等特点,对C的类型系统进行了改革的扩充,因此C+比C更安全,C+的编译系统能检查出更多的类型错误。另外,由于C语言的广泛使用,因而极大的促进了C+的普及和推广。C+语言最有意义的方
13、面是支持面向对象的特征。虽然与C的兼容使得C+具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。智能家居等将是一个发展的趋势,嵌入式产品也必将走入千家万户。而目前PC机的音频管理软件占用的磁盘空间以及内存较大所以基于Qt的音频管理系统的设计与实现有很重要的意义。基于这种形式的把握,也基于对这种技术的学习与理解,我选择了这个课题。对音频解码技术进行研究,有助于理解其内在的原理,能够帮助我们更好的实现代码功能。1.2 系统目标系统开发的总任务是设计并实现一个音频管理系统。通过本系统可以添加音频文件,以演唱者管理音频文件,以专辑管理音频文件2,4。你可以有一个播放列表,方便用户知道系统中有
14、哪些音乐文件。当然了有播放列表,就要有播放功能。选中歌曲,用户可以点击播放按钮,播放音乐文件。当然有相应的控制功能,上一曲,下一曲。基本的音量控制,音量的高低调节,静音功能。1.3 基于Qt程序的音频管理系统的设计的必要性随着计算机技术、电子技术和通信技术的迅猛发展,嵌入式系统已经成为最热门、最有前途的IT应用领域之一,成为通讯和消费产品的共同发展方向。它广泛应用于人们在工作生活的各个方面,几乎包括了所有的电器设备。在嵌入式技术快速发展的同时,嵌入式音频设备已然成为当今人类生活中的热点。对于这些音乐文件的管理也将成为程序员考虑的重点。各种设备中的操作系统的种类不同,程序员在开发的时候总是要做重
15、复的工作,不能把工作的重点放在设计上。基于Qt的平台正好给大家提供了一个这样的平台。代码不需要太多的改动,就可以运行在各种操作系统上。而且Qt是基于模块的设计思想,只需要加载你所需要的模块,符合嵌入式定制性强,模块简单的特点。所以基于Qt的音频管理系统非常的设计与实现非常必要。本系统主要基于Qt跨平台的图形用户界面应用程序框架,用的是C+开发语言,当前的计算机硬件配置也完全能满足开发的需求,因此在技术上是绝对可行的。软件方面:由于目前单机模式相对发展成熟,故软件的开发平台成熟可行,它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求。2 关键技术介绍2.1 音频编码的简单概念2.1.1
16、 采样率和采样大小声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。采样率和采样大小的值越大,记录的波形更接近原始信号。2.1.2 有损和无损根据采样率和采样大小可以得知,相对自然界
17、的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,相对自然界的信号,任何数字音频编码方案都是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。我们而习惯性的把MP3列入有损音频编码范畴,是相对PCM编码的。2.1.3 音频压缩技术PCM音频流的码率,采样率值采样大小值声道数 bps。一个采样率为44.1KHz,采样大小为16b
18、it,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K162 =1411.2 Kbps。我们常说128K的MP3,对应的WAV的参数,就是这个1411.2 Kbps,这个参数也被称为数据带宽,它和ADSL中的带宽是一个概念。将码率除以8,就可以得到这个WAV的数据速率,即176.4KB/s。这表示存储一秒钟采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的音频信号,需要176.4KB的空间,1分钟则约为10.34M,这对大部分用户是不可接受的,尤其是喜欢在电脑上听音乐的朋友,要降低磁盘占用,只有2种方法,降低采样指标或者压缩。降低指标是不可取的,各种音频压缩编码所达
19、到的音质和压缩比都不一样。2.1.4 频率和采样率采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,假设我们有2段正弦波信号,分别为20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是CD数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,在捕捉CD音轨的时候使用48KHz的采样
20、率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,不要去尝试提高采样率。2.1.5 流特征随着网络的发展,人们对在线收听音乐提出了要求,因此也要求音频文件能够一边读一边播放,而不需要把这个文件全部读出后然后回放,这样就可以做到不用下载就可以实现收听了。也可以做到一边编码一边播放,正是这种特征,可以实现在线的直播,架设自己的数字广播电台成为了现实。2.2 音频编码2.2.1 PCM编码PCM 脉冲编码调制是Pulse Code Modul
21、ation的缩写。我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码的音频流的优点和缺点就可以了。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。2.2.2 WAV这是一种古老的音频文件格式,由微软开发。WAV是一种文件格式,符合RIFF (Resource Interchange File Format) 规范。所有的WAV都有一个文件头,这个文件头包含了音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频
22、流进行编码。WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。2.2.3 MP3MP3作为目前最为普及的音频压缩格式,为大家所大量
23、接受,各种与MP3相关的软件产品层出不穷,而且更多的硬件产品也开始支持MP3,我们能够买到的VCD/DVD播放机都很多都能够支持MP3,还有更多的便携的MP3播放器等等,虽然几大音乐商极其反感这种开放的格式,但也无法阻止这种音频压缩的格式的生存与流传。MP3发展已经有10个年头了,他是MPEG(MPEG:Moving Picture Experts Group) Audio Layer-3的简称,是MPEG1的衍生编码方案,1993年由德国Fraunhofer IIS研究院和汤姆生公司合作发展成功。MP3可以做到12:1的惊人压缩比并保持基本可听的音质,在当年硬盘天价的日子里,MP3迅速被用户
24、接受,随着网络的普及,MP3被数以亿计的用户接受。MP3编码技术的发布之初其实是非常不完善的,由于缺乏对声音和人耳听觉的研究,早期的mp3编码器几乎全是以粗暴方式来编码,音质破坏严重。随着新技术的不断导入,mp3编码技术一次一次的被改良,其中有2次重大技术上的改进。2.2.4 OGG编码Ogg Vorbis的音频编码,OGG是一个庞大的多媒体开发计划的项目名称,将涉及视频音频等方面的编码开发。整个OGG项目计划的目的就是向任何人提供完全免费多媒体编码方案。OGG的信念就是:OPEN,FREE,Vorbis。这几个个词汇成为了OGG项目中音频编码的正式命名。目前Vorbis已经开发成功,并且开发
25、出了编码器。Ogg Vorbis是高质量的音频编码方案,官方数据显示:Ogg Vorbis可以在相对较低的数据速率下实现比MP3更好的音质。Ogg Vorbis这种编码也远比90年代开发成功的MP3先进,她可以支持多个声道,这意味着Ogg Vorbis在SACD、DTSCD、DVD AUDIO抓轨软件的支持下,可以对所有的声道进行编码,而不是MP3只能编码2个声道。多声道音乐的兴起,给音乐欣赏带来了革命性的变化,尤其在欣赏交响时,会带来更多临场感。这场革命性的变化是MP3无法适应的。和MP3一样,Ogg Vorbis是一种灵活开放的音频编码,能够在编码方案已经固定下来后还能对音质进行明显的调节
26、和新算法的改良。因此,它的声音质量将会越来越好,和MP3相似,Ogg Vorbis更像一个音频编码框架,可以不断导入新技术逐步完善。和MP3一样,OGG也支持VBR。2.2.5 MP3PRO编码MP3PRO并不是一种全新的格式,完全是基于传统MP3编码技术的一种改良,本身最大的技术亮点就在于SBR(Spectral Band Replication 频段复制),这是一种新的音频编码增强算法。它提供了改善低位率情况下音频和语音编码的性能的可能。这种方法可在指定的位率下增加音频的带宽或改善编码效率。SBR最大的优势就是在低数据速率下实现非常高效的编码,与传统的编码技术不同的是,SBR更像是一种后处
27、理技术,因此解码器的算法的优劣直接影响到音质的好坏。高频实际上是由解码器(播放器)产生的,SBR编码的数据更像是一种产生高频的命令集,或者称为指导性的信号源。MP3PRO其实是一种MP3信号流和SBR信号流的混合数据流编码。SBR技术可以改善低数据流量下的高频音质,改善程度约为30%,这种改善可以让64kbps的MP3达到128kbps的MP3的音质水平。2.2.6 ACC格式AAC(高级音频编码技术,Adavanced Audio Coding)是杜比实验室为音乐社区提供的技术。AAC号称最大能容纳48通道的音轨,采样率达96KHZ,并且在320Kbps的数据速率下能为5.1声道音乐提供相当
28、于ITU-R广播的品质。和MP3比起来,它的音质比较好,它能够节省大余额30%的存储空间与带宽。它是遵循MPEG-2的规格所开发的技术。2.3 音频解析2.3.1 MP3文件解析MP3的文件格式称为ID3,一般是位于一个MP3文件的开头或末尾的若干字节内,附加了关于该MP3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版。其中:v1版的ID3在MP3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息。其中流派一共定义了79种。v2版一般位于mp3的开头,可以存储歌词,该专辑的图片等大容量的信息。ID3V2一共有4个版本,但流行的
29、播放软件一般只支持第3版,即ID3v2.3。由于ID3V1记录在MP3文件的末尾,ID3V2就只好记录在MP3文件的首部了。也正是由于这个原因,对ID3V2的操作比ID3V1要慢。而且ID3V2结构比ID3V1的结构要复杂得多,但比前者全面且可以伸缩和扩展。ID3V1比较简单,它是存放在MP3文件的末尾,用16进制的编辑器打开一个MP3文件,查看其末尾的128个顺序存放字节,数据结构定义如下:char Header3; /*标签头必须是TAG否则认为没有标签*/char Title30; /*标题*/char Artist30; /*作者*/char Album30; /*专集*/char Y
30、ear4; /*出品年代*/char Comment30; /*备注*/char Genre; /*类型*/ID3V1的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30个字节,则使用0补足,否则将造成信息错误。Genre使用原码表示,对照表如下:/* Standard genres */0=Blues;1=ClassicRock;2=Country;3=Dance;4=Disco;5=Funk;6=Grunge;7=Hip-Hop;8=Jazz;9=Metal;10=NewAge;11=Oldies;12=Other;13=Pop;14=R&B;15=Rap;16=Reggae
31、;17=Rock;18=Techno;19=Industrial;20=Alternative;21=Ska;22=DeathMetal;23=Pranks;24=Soundtrack;25=Euro-Techno;26=Ambient;27=Trip-Hop;28=Vocal;29=Jazz+Funk;30=Fusion;31=Trance;32=Classical;33=Instrumental;34=Acid;35=House;36=Game;37=SoundClip;38=Gospel;39=Noise;40=AlternRock;41=Bass;42=Soul;43=Punk;44=
32、Space;45=Meditative;46=InstrumentalPop;47=InstrumentalRock;48=Ethnic;49=Gothic;50=Darkwave;51=Techno-Industrial;52=Electronic;53=Pop-Folk;54=Eurodance;55=Dream;56=SouthernRock;57=Comedy;58=Cult;59=Gangsta;60=Top40;61=ChristianRap;62=Pop/Funk;63=Jungle;64=NativeAmerican;65=Cabaret;66=NewWave;67=Psych
33、adelic;68=Rave;69=Showtunes;70=Trailer;71=Lo-Fi;72=Tribal;73=AcidPunk;74=AcidJazz;75=Polka;76=Retro;77=Musical;78=Rock&Roll;79=HardRock;/* Extended genres */80=Folk;81=Folk-Rock;82=NationalFolk;83=Swing;84=FastFusion;85=Bebob;86=Latin;87=Revival;88=Celtic;89=Bluegrass;90=Avantgarde;91=GothicRock;92=
34、ProgessiveRock;93=PsychedelicRock;94=SymphonicRock;95=SlowRock;96=BigBand;97=Chorus;98=EasyListening;99=Acoustic;100=Humour;101=Speech;102=Chanson;103=Opera;104=ChamberMusic;105=Sonata;106=Symphony;107=BootyBass;108=Primus;109=PornGroove;110=Satire;111=SlowJam;112=Club;113=Tango;114=Samba;115=Folklo
35、re;116=Ballad;117=PowerBallad;118=RhythmicSoul;119=Freestyle;120=Duet;121=PunkRock;122=DrumSolo;123=Acapella;124=Euro-House;125=DanceHall;126=Goa;127=Drum&Bass;128=Club-House;129=Hardcore;130=Terror;131=Indie;132=BritPop;133=Negerpunk;134=PolskPunk;135=Beat;136=ChristianGangstaRap;137=HeavyMetal;138
36、=BlackMetal;139=Crossover;140=ContemporaryChristian;141=ChristianRock;142=Merengue;143=Salsa;144=TrashMetal;145=Anime;146=JPop;147=Synthpop;每个ID3V2.3的标签都由一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。标签头在文件的首部顺序记录10个字节的ID3V2.3的头部。在文件的首部顺序记录10个
37、字节的ID3V2.3的头部。数据结构如下:char Header3; /*必须为ID3否则认为标签不存在*/char Ver; /*版本号;ID3V2.3就记录03,ID3V2.4就记录04*/char Revision; /*副版本号;此版本记录为00*/char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/char Size4; /*标签大小,包括标签帧和扩展标签头。(不包括标签头的10个字节)*/2.3.2 WMA文件解析每一个WMA文件,它的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62
38、CE 6C”,用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息。也就是说从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。这一点和MP3文件的ID3V2信息比 较像。Tag信息分别保存在两个帧里,分别为标准Tag帧和扩展Tag帧。标准Tag帧只包含歌曲标题,艺术家,版权,备注四个内容。它的帧名是十六
39、进制的“3326 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,在24个字节的帧头后紧跟着5个分别为2个字节的整数,分别表示歌曲标题,艺术家,版权,备注,未知信息的大小,未知信息大部分情况下是不使用的,即它的大小为0的。在这10个字节后,这五个信息的内容就按顺序存放了。记住,在WMA文件里,所有的文字都是按Unicode宽字符的编码方式储存的,而且每个字符串后面都有一个0x00 0x00结束字符的。扩展Tag帧里面包含的信息的个数是不确定的,每个信息也是按照像帧一样的方式组织起来的。扩展Tag帧的帧名是十六进制的“40 A4 D0 D2 07 E3 D2
40、 11 97 F000 A0 C9 5E A8 50”,在24字节的帧头(HeadFlag:16,HeadSize:8)后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数(ExNo)。紧接着是扩展信息。每一个扩展信息包含扩展信息名字大小(2字节)和对应的内容。先有一个两个字节的整数来表示扩展名字信息的大小,接着是扩展信息名称,然后有一个两个字节的整数标志(Flag)。然后又是一个两个字节的整数,表示值的大小。接着就是这个值。当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;当扩展信息名字
41、为WM/Genre时,这个值代表的就是流派。很容易从扩展信息的名字看出这个值的用途。这些扩展信息的名字和值几乎都是用Unicode的字符串来存储的,到现在为止只发现对下面两个情况例外。标志Flag,只对WM/TrackNumber和WM/Track这两个扩展信息名字有用,当Flag为3的时候后面的值是以4个字节的整数的形式表示,当Flag为0的时候,曲目信息是以普通的字符串形式表示的。WMA格式有一个帧全部都是0,相当于缓冲区。如果写入的歌名比原来长的话,就减少缓冲区大小,歌名短就增加缓冲区。这样就可以保持文件头的大小不变,每次更新的话只需要重写文件头,不需要重写音频数据。这6个 字节其中前面
42、4个字节为总标签帧数。2.3.3 OGG文件的解析“Ogg”意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。在Ogg的多媒体框架下,Theora提供有损的图像层面,而通常用音乐导向的Vorbis编解码器作为音效层面。针对语音设计的压缩编解码器Speex和无损的音效压缩编解码器FLAC与OggPCM也可能作为音效层面使用。OGG文件的组织形式,OGG是以页(page)为单位将逻辑流组织链接起来,每个页都有pageheader和pagedata。OGG page页结构,每个页之间相互独立,都包含了各自应有的信息,页的大小是可变的,通常为4
43、K8KB,最大值不能超过65307bytes(27255255*255=65307)。OGG页头部结构,页标识:ASCII字符,0x4f O 0x67 g 0x67 g 0x53 S,4个字节大小,它标识着一个页的开始。其作用是分离Ogg封装格式还原媒体编码时识别新页的作用; 版本id:一般当前版本默认为0,1个字节;Header_type:标识当前的页的类型,1个字节;Granule_position:媒体编码相关的参数信息,8个字节,对于音频流来说,它存储着到本页为止逻辑流在PCM输出中采样码的数目,可以由它来算得时间戳。对于视频流来说,它存储着到本页为止视频帧编码的数目。若此值为-1,那
44、表示截止到本页,逻辑流的packet未结束;Serial_number:当前页中的流的id,4个字节,它是区分本页所属逻辑流与其他逻辑流的序号,我们可以通过这个值来划分流。(小端)。Page_seguence:本页在逻辑流的序号,4个字节。OGG解码器能据此识别有无页丢失;CRC_cbecksum:循环冗余校验码校验和,4个字节,包含页的32bit CRC校验和(包括头部零CRC校验和页数据校验),它的产生多项式为:0x04c11db7;Num _segments:给定本页在segment_table域中出现的segement个数,1个字节。其最大值为255.页最大物理尺寸为65307byte
45、s,小于64KB;Segment_table:从字面看它就是一个表,表示着每个segment的长度,取值范围是0255。由segment可以得到packet的值,每个packet的大小是以最后一个不等于255的segment结束的,从页头中的segment_table可以得到每个packet长度。2.4 Qt的事件模型Qt中的事件模型十分重要。2.4.1 事件的概念应用程序对象将系统消息接收为Qt事件。应用程序可以按照不同的粒度对事件加以监控、过滤并做出响应。在Qt中,事件是指从QEvent继承的对象。Qt将事件发送给每个QObject对象,这样对象便可对事件做出响应。也就是说,Qt的事件处理
46、机制主要是基于QEvent类来实现的,QEvent类是其他事件类的基类。当一个事件产生时,Qt 就会构造一个QEvent子类的实例来表述该事件,然后将该事件发送到相应的对象上进行处理。编程人员可以对应用程序级别和对象级别中的事件进行监控和过滤。2.4.2 事件的创建大多数事件是由窗口系统生成的,它们负责向应用程序通知相关的用户操作,例如:按键、鼠标单击或者重新调整窗口大小。也可以从编程角度来模拟这类事件。在Qt中大约有50多种事件类型,最常见的事件类型是报告鼠标活动、按键、重绘请求以及窗口处理操作。编程人员也可以添加自己的活动行为,类似于内建事件的事件类型。通常,接收方如果只知道按键了或者松开鼠标按钮了,这是不够的。例如,它还必须知道按的是哪个键,松开的是哪个鼠标按钮以及鼠标所在位置。每一 QEvent 子类均提供事件类型的相关附加信息,因此每个事件处理器均可利用此信息采取相应处理。2.4.3 事件的交付Qt通过调用虚函数 QObject:event()来交付事件。出于方便起见,QObject:event()会将大多数常见的事件类型转发给专门的处理函数,例如:QWidget:mouseReleaseEvent()和QWidge