毕业设计(论文)-基于Qt的音频管理系统的设计与实现.doc_第1页
毕业设计(论文)-基于Qt的音频管理系统的设计与实现.doc_第2页
毕业设计(论文)-基于Qt的音频管理系统的设计与实现.doc_第3页
毕业设计(论文)-基于Qt的音频管理系统的设计与实现.doc_第4页
毕业设计(论文)-基于Qt的音频管理系统的设计与实现.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

太原理工大学毕业设计(论文)用纸基于Qt的音频管理系统的设计与实现摘要随着互联网的的发展,PC机已经不能满足终端用户对音频的需要。虽然目前有各种各样的计算机操作系统,如WINDOWS,LINUX,UNIX,MAC OS等以及各种移动开发平台,如Android,BlackBerry OS,IOS,Windows Mobile,Windows Phone,Palm等,不同的操作系统需要不同的系统软件来开发对应的应用程序。同样的功能,却要开发多次,这给程序员带来了冗余的工作量。本文以Qt为基础,对音频管理系统的实际设计情况进行了需求分析,利用软件工程的开发流程及面向对象的思想,构建了音频管理系统的总体框架,为最终音频管理系统的实现提供了理论依据。测试结果表明,基于Qt的音频管理系统可以在Win7的Qt5.2中运行,也可以在ubuntu的Qt5.2中运行,代码只需做微小的调整,减轻程序员的代码量,节省开发成本,为未来的开发提供一个重要的参考。关键词 Qt;音频管理系统;设计;实现全套设计加扣 3012250582Design 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 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 corresponding 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 idea,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 only 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 采样率和采样大小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.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 播放列表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参考文献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/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 更适合在嵌入式环境下生存1,5-8,10-11。基于Qt跨平台的图形用户界面应用程序框架,用的是C+开发语言。C+语言简洁灵活,运算符的数据结构丰富、具有结构化控制语句、程序执行效率高,而且同时具有高级语言与汇编语言的优点,与其它语言相比,C语言具有可以直接访问物理地址的优点,与汇编语言相比又具有良好的可读性的可移植性。总得来说,C+语言的主要特点表现在两个方面,一是尽量兼容C,二是支持面向对象的方法。它操持了C的简洁、高效的接近汇编语言等特点,对C的类型系统进行了改革的扩充,因此C+比C更安全,C+的编译系统能检查出更多的类型错误。另外,由于C语言的广泛使用,因而极大的促进了C+的普及和推广。C+语言最有意义的方面是支持面向对象的特征。虽然与C的兼容使得C+具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。智能家居等将是一个发展的趋势,嵌入式产品也必将走入千家万户。而目前PC机的音频管理软件占用的磁盘空间以及内存较大所以基于Qt的音频管理系统的设计与实现有很重要的意义。基于这种形式的把握,也基于对这种技术的学习与理解,我选择了这个课题。对音频解码技术进行研究,有助于理解其内在的原理,能够帮助我们更好的实现代码功能。1.2 系统目标系统开发的总任务是设计并实现一个音频管理系统。通过本系统可以添加音频文件,以演唱者管理音频文件,以专辑管理音频文件2,4。你可以有一个播放列表,方便用户知道系统中有哪些音乐文件。当然了有播放列表,就要有播放功能。选中歌曲,用户可以点击播放按钮,播放音乐文件。当然有相应的控制功能,上一曲,下一曲。基本的音量控制,音量的高低调节,静音功能。1.3 基于Qt程序的音频管理系统的设计的必要性随着计算机技术、电子技术和通信技术的迅猛发展,嵌入式系统已经成为最热门、最有前途的IT应用领域之一,成为通讯和消费产品的共同发展方向。它广泛应用于人们在工作生活的各个方面,几乎包括了所有的电器设备。在嵌入式技术快速发展的同时,嵌入式音频设备已然成为当今人类生活中的热点。对于这些音乐文件的管理也将成为程序员考虑的重点。各种设备中的操作系统的种类不同,程序员在开发的时候总是要做重复的工作,不能把工作的重点放在设计上。基于Qt的平台正好给大家提供了一个这样的平台。代码不需要太多的改动,就可以运行在各种操作系统上。而且Qt是基于模块的设计思想,只需要加载你所需要的模块,符合嵌入式定制性强,模块简单的特点。所以基于Qt的音频管理系统非常的设计与实现非常必要。本系统主要基于Qt跨平台的图形用户界面应用程序框架,用的是C+开发语言,当前的计算机硬件配置也完全能满足开发的需求,因此在技术上是绝对可行的。软件方面:由于目前单机模式相对发展成熟,故软件的开发平台成熟可行,它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求。2 关键技术介绍2.1 音频编码的简单概念2.1.1 采样率和采样大小声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。采样率和采样大小的值越大,记录的波形更接近原始信号。2.1.2 有损和无损根据采样率和采样大小可以得知,相对自然界的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,相对自然界的信号,任何数字音频编码方案都是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。我们而习惯性的把MP3列入有损音频编码范畴,是相对PCM编码的。2.1.3 音频压缩技术PCM音频流的码率,采样率值采样大小值声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的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种方法,降低采样指标或者压缩。降低指标是不可取的,各种音频压缩编码所达到的音质和压缩比都不一样。2.1.4 频率和采样率采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,假设我们有2段正弦波信号,分别为20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是CD数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,在捕捉CD音轨的时候使用48KHz的采样率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,不要去尝试提高采样率。2.1.5 流特征随着网络的发展,人们对在线收听音乐提出了要求,因此也要求音频文件能够一边读一边播放,而不需要把这个文件全部读出后然后回放,这样就可以做到不用下载就可以实现收听了。也可以做到一边编码一边播放,正是这种特征,可以实现在线的直播,架设自己的数字广播电台成为了现实。2.2 音频编码2.2.1 PCM编码PCM 脉冲编码调制是Pulse Code Modulation的缩写。我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码的音频流的优点和缺点就可以了。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。2.2.2 WAV这是一种古老的音频文件格式,由微软开发。WAV是一种文件格式,符合RIFF (Resource Interchange File Format) 规范。所有的WAV都有一个文件头,这个文件头包含了音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。2.2.3 MP3MP3作为目前最为普及的音频压缩格式,为大家所大量接受,各种与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迅速被用户接受,随着网络的普及,MP3被数以亿计的用户接受。MP3编码技术的发布之初其实是非常不完善的,由于缺乏对声音和人耳听觉的研究,早期的mp3编码器几乎全是以粗暴方式来编码,音质破坏严重。随着新技术的不断导入,mp3编码技术一次一次的被改良,其中有2次重大技术上的改进。2.2.4 OGG编码Ogg Vorbis的音频编码,OGG是一个庞大的多媒体开发计划的项目名称,将涉及视频音频等方面的编码开发。整个OGG项目计划的目的就是向任何人提供完全免费多媒体编码方案。OGG的信念就是:OPEN,FREE,Vorbis。这几个个词汇成为了OGG项目中音频编码的正式命名。目前Vorbis已经开发成功,并且开发出了编码器。Ogg Vorbis是高质量的音频编码方案,官方数据显示:Ogg Vorbis可以在相对较低的数据速率下实现比MP3更好的音质。Ogg Vorbis这种编码也远比90年代开发成功的MP3先进,她可以支持多个声道,这意味着Ogg Vorbis在SACD、DTSCD、DVD AUDIO抓轨软件的支持下,可以对所有的声道进行编码,而不是MP3只能编码2个声道。多声道音乐的兴起,给音乐欣赏带来了革命性的变化,尤其在欣赏交响时,会带来更多临场感。这场革命性的变化是MP3无法适应的。和MP3一样,Ogg Vorbis是一种灵活开放的音频编码,能够在编码方案已经固定下来后还能对音质进行明显的调节和新算法的改良。因此,它的声音质量将会越来越好,和MP3相似,Ogg Vorbis更像一个音频编码框架,可以不断导入新技术逐步完善。和MP3一样,OGG也支持VBR。2.2.5 MP3PRO编码MP3PRO并不是一种全新的格式,完全是基于传统MP3编码技术的一种改良,本身最大的技术亮点就在于SBR(Spectral Band Replication 频段复制),这是一种新的音频编码增强算法。它提供了改善低位率情况下音频和语音编码的性能的可能。这种方法可在指定的位率下增加音频的带宽或改善编码效率。SBR最大的优势就是在低数据速率下实现非常高效的编码,与传统的编码技术不同的是,SBR更像是一种后处理技术,因此解码器的算法的优劣直接影响到音质的好坏。高频实际上是由解码器(播放器)产生的,SBR编码的数据更像是一种产生高频的命令集,或者称为指导性的信号源。MP3PRO其实是一种MP3信号流和SBR信号流的混合数据流编码。SBR技术可以改善低数据流量下的高频音质,改善程度约为30%,这种改善可以让64kbps的MP3达到128kbps的MP3的音质水平。2.2.6 ACC格式AAC(高级音频编码技术,Adavanced Audio Coding)是杜比实验室为音乐社区提供的技术。AAC号称最大能容纳48通道的音轨,采样率达96KHZ,并且在320Kbps的数据速率下能为5.1声道音乐提供相当于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个版本,但流行的播放软件一般只支持第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 Year4; /*出品年代*/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;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=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=Psychadelic;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=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=Folklore;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=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个字节的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 CE 6C”,用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息。也就是说从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。这一点和MP3文件的ID3V2信息比 较像。Tag信息分别保存在两个帧里,分别为标准Tag帧和扩展Tag帧。标准Tag帧只包含歌曲标题,艺术家,版权,备注四个内容。它的帧名是十六进制的“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 11 97 F000 A0 C9 5E A8 50”,在24字节的帧头(HeadFlag:16,HeadSize:8)后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数(ExNo)。紧接着是扩展信息。每一个扩展信息包含扩展信息名字大小(2字节)和对应的内容。先有一个两个字节的整数来表示扩展名字信息的大小,接着是扩展信息名称,然后有一个两个字节的整数标志(Flag)。然后又是一个两个字节的整数,表示值的大小。接着就是这个值。当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;当扩展信息名字为WM/Genre时,这个值代表的就是流派。很容易从扩展信息的名字看出这个值的用途。这些扩展信息的名字和值几乎都是用Unicode的字符串来存储的,到现在为止只发现对下面两个情况例外。标志Flag,只对WM/TrackNumber和WM/Track这两个扩展信息名字有用,当Flag为3的时候后面的值是以4个字节的整数的形式表示,当Flag为0的时候,曲目信息是以普通的字符串形式表示的。WMA格式有一个帧全部都是0,相当于缓冲区。如果写入的歌名比原来长的话,就减少缓冲区大小,歌名短就增加缓冲区。这样就可以保持文件头的大小不变,每次更新的话只需要重写文件头,不需要重写音频数据。这6个 字节其中前面4个字节为总标签帧数。2.3.3 OGG文件的解析“Ogg”意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。在Ogg的多媒体框架下,Theora提供有损的图像层面,而通常用音乐导向的Vorbis编解码器作为音效层面。针对语音设计的压缩编解码器Speex和无损的音效压缩编解码器FLAC与OggPCM也可能作为音效层面使用。OGG文件的组织形式,OGG是以页(page)为单位将逻辑流组织链接起来,每个页都有pageheader和pagedata。OGG page页结构,每个页之间相互独立,都包含了各自应有的信息,页的大小是可变的,通常为4K8KB,最大值不能超过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,那表示截止到本页,逻辑流的packet未结束;Serial_number:当前页中的流的id,4个字节,它是区分本页所属逻辑流与其他逻辑流的序号,我们可以通过这个值来划分流。(小端)。Page_seguence:本页在逻辑流的序号,4个字节。OGG解码器能据此识别有无页丢失;CRC_cbecksum:循环冗余校验码校验和,4个字节,包含页的32bit CRC校验和(包括头部零CRC校验和页数据校验),它的产生多项式为:0x04c11db7;Num _segments:给定本页在segment_table域中出现的segement个数,1个字节。其最大值为255.页最大物理尺寸为65307bytes,小于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的事件处理机制主要是基于QEvent类来实现的,QEvent类是其他事件类的基类。当一个事件产生时,Qt 就会构造一个QEvent子类的实例来表述该事件,然后将该事件发送到相应的对象上进行处理。编程人员可以对应用程序级别和对象级别中的事件进行监控和过滤。2.4.2 事件的创建大多数事件是由窗口系统生成的,它们负责向应用程序通知相关的用户操作,例如:按键、鼠标单击或者重新调整窗口大小。也可以从编程角度来模拟这类事件。在Qt中大约有50多种事件类型,最常见的事件类型是报告鼠标活动、按键、重绘请求以及窗口处理操作。编程人员也可以添加自己的活动行为,类似于内建事件的事件类型。通常,接收方如果只知道按键了或者松开鼠标按钮了,这是不够的。例如,它还必须知道按的是哪个键,松开的是哪个鼠标按钮以及鼠标所在位置。每一 QEvent 子类均提供事件类型的相关附加信息,因此每个事件处理器均可利用此信息采取相应处理。2.4.3 事件的交付Qt通过调用虚函数 QObject:event()来交付事件。出于方便起见,QObject:event()会将大多数常见的事件类型转发给专门的处理函数,例如:QWidget:mouseReleaseEvent()和QWidget:keyPressEvent()。开发人员在编写自己的控件时,或者对现有控件进行定制时,可以轻松地重新实现这些处理函数。有些事件会立即发送,而另一些事件则需要排队等候,当控制权返回至Qt事件循环时才会开始分发。Qt使用排队来优化特定类型的事件。例如,Qt会将多个paint事件压缩成一个事件,以便达到最大速度。通常,一个对象需要查看另一对象的事件,以便可以对事件做出响应或阻塞事件。这可以通过调用被监控对象的 QObject:installEventFilter() 函数来实现。实施监控对象的QObject:eventFilter() 虚函数会在受监控的对象在接收事件之前被调用。另外,如果在应用程序的 QApplication 唯一实例中安装一个过滤器,则也可以过滤应用程序的全部事件。系统先调用这类过滤器,然后再调用任何窗体特定的过滤器。开发人员甚至还可以重新实现事件调度程序 QApplication:notify(),对整个事件交付过程进行全面控制。2.4.4 事件循环模型Qt通过调用虚函数QObject:event()来交付事件。处于方便起见,Qobject:event()会将大多数的事件类型转发给专门的处理函数:例如:QWidget:mouseReleaseEvent()和 QWidget:keyPressEvent()。开发人员在编写自己的控件时,或者对现有控件进行定制时,可以轻松地重新实现这些处理函数。有些事件会立即发送,而另一些事件则需要排队等候,当控制权返回至Qt事件循环时才会开始分发。Qt使用排队来优化特定类型的事件。例如,Qt会将多个paint事件压缩成一个事件,以便达到最大速度。通常,一个对象需要查看另一对象的事件,以便可以对事件做出响应或阻塞事件。这可以通过调用被监控对象的 QObject:installEventFilter() 函数来实现。实施监控对象的QObject:eventFilter() 虚函数会在受监控的对象在接收事件之前被调用。另外,如果在应用程序的QApplication 唯一实例中安装一个过滤器,则也可以过滤应用程序的全部事件。系统先调用这类过滤器,然后再调用任何窗体特定的过滤器。开发人员甚至还可以重新实现事件调度程序 QApplication:notify(),对整个事件交付过程进行全面控制。2.4.5 自定义事件一般有下列5种方式可以用来处理和过滤事件,每种方式都有其使用条件和使用范围。重载paintEvent()、mousePressEvent()等时间处理器(event handler)重新实现像mousePressEvent(),keyPressEvent()和paintEvent()这样的event hangder是目前处理event所采用的最常见的方法。重载QcoreApplication:notify()函数这种方式能够对事件处理进行完全控制。也就是说,当你需要在事件处理器(event handler)之前得到所有事件的话,就可以采用这个方法,但是这样一来,因为只有一个notify()函数,所以每次只能有一个子类被激活。这与事件过滤器不同,因为后者可以有任意数目并且同时存在。在QCoreApplication:instance()上安装时间过滤器这样就可以处理所有部件上的所有事件,这和重载QcoreApplication:notify()函数的效果是类似的。一旦一个eventfilter被注册到qApp,程序里发到其它对象的事件发到其它的eventfilter之前,都要首先发到这个eventfileter上。重载QObject:event()函数通过重新实现的event()函数,在事件到达特定部件的事件过滤器前处理Tab事件。需要注意的是,当重新实现某个子类的event(),需要调用基类的event()来处理不准备显示处理的情况。在选定对象上安装事件过滤器该对象继承自QObject,这样就可以处理处理Tab和Shift-Tab以外的所有事件。当对象用installEventFilter()注册之后,所有发送到该对象的事件都会经过监测它的eventfilter()注册之后,所有发到该对象的事件都会先经过监测它的eventfilter。如果该object同时安装了多个eventfilter,那么这些filter会按照“后进先出”的规则依次被激活,及顺序是从最后安装的开始,到第一个被安装的为止。2.5 Qt核心机制信号与槽信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解。信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一。在我们所了解的其它GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们触发的动作,这个回调函数通常是一个指向某个函数的指针。在Qt中用信号和槽取代了上述机制。2.5.1 信号当对象的状态发生改变时,信号被某一个对象发射。只有定义过这个信号的类或者其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被执行,就像一个普通的函数调用一样。信号-槽机制独立于任何GUI事件循环。只有当所有的槽正确返回以后,发射函数才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地被执行,但是它们执行的顺序将会是不确定的,并且不能指定它们执行的顺序。信号的声明是在头文件中进行的,并且moc工具会注意不要将信号定义在实现文件中。Qt用signals关键字标识信号声明区,随后可声明自己的信号。2.5.2 槽槽是普通的C+成员函数,可以被正常调用,不同之处是它们可以与信号(signal)相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。槽也和普通成员函数一样有访问权限。槽的访问权限决定了谁可以和它相连。通常,槽也分为三种类型,即public slots、private slots和protected slots。public slots:在这个代码区段内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程来说非常有用:你生成了许多对象,它们互相并不知道,把它们的信号和槽连接起来,这样信息就可以正确地传递,并且就像一个小孩子喜欢玩耍的铁路轨道上的火车模型,把它打开然后让它跑起来。protected slots:在这个代码区段内声明的槽意味着当前类及其子类可以将信号与之相关联。这些槽只是类的实现的一部分,而不是它和外界的接口。private slots:在这个代码区段内声明的槽意味着只有类自己可以将信号与之相关联。这就是说这些槽和这个类是非常紧密的,甚至它的子类都没有获得连接权利这样的信任。通常,我们使用public和private声明槽是比较常见的,建议尽量不要使用protected关键字来修饰槽的属性。此外,槽也能够声明为虚函数。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论