《基于Linux的音乐播放器设计与实现.doc》由会员分享,可在线阅读,更多相关《基于Linux的音乐播放器设计与实现.doc(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于Linux的音乐播放器设计及实现专 业:计算机科学及技术 学 号:学 生: 指导教师:摘要:作为一项及人们生活息息相关的应用,音乐播放器在人们的生活中发挥着不可替代的作用。本播放器在Linux(Debian 6.0)操作系统平台下进行开发,使用Qt程序开发框架实现播放器的GUI设计,并用Phonon多媒体API实现多媒体控制,最后再用C+编程实现。本播放器实现了音乐播放器的基本功能,包括“播放”、“暂停”、“上一曲”、“下一曲”、“添加文件”、“删除文件”、“切换背景图标”、“最小化到托盘”等功能。测试表明,本播放器能够流畅地运行,并能很好地实现各项功能,并且有一定的容错能力,达到了设计预
2、期的效果。同时,本播放器在稳定性、经济成本等方面都有不错的表现。关键词:音乐播放器;Linux;Qt;PhononThe Design and Implementation of Music Player Based on LinuxSpecialty: Student Number: Student: Supervisor: Abstract: As an application, which is closely related to the peoples lives, music player plays an irreplaceable role in peoples life. T
3、his Music player is developed under Linux (Debian 6.0) operating system with the Qt application development framework implementing the players GUI design. Phonon multimedia APIs is used for multimedia control and at last coded by C+ programming language. The music player has realized basic functions
4、 of ordinary music player, including Play function, Pause function, Previous track function, Next track function, Add files function, Delete files function, Switch background icon function, Minimize to tray function and so on. The testing results show that the player can run smoothly and realize all
5、 of functions mentioned before. The player is provided with fault tolerance as well. To sum up, the player achieves the designs expected result. At the same time, the music player has a well performance in operational stability and economic cost.Key words: Music player; Linux; Qt; Phonon第 38 页目 录绪 论
6、11 系统开发平台介绍21.1 Linux简介21.2 Qt介绍31.3 集成开发环境31.4 Phonon简介42 系统分析52.1 播放器举例52.2 功能需求分析52.2.1 基本功能62.2.2 播放器基本设置62.2.3 快捷键设置62.2.4 上下文菜单设置62.3 可行性分析72.3.1 经济可行性72.3.2 技术可行性72.3.3 应用分析72.4 总结83 系统设计93.1 Qt信号及槽机制介绍93.1.1 信号93.1.2 槽103.1.3 信号及槽的关联113.1.4 Qt信号和槽机制的优点113.2 函数123.2.1 Phonon媒体框架123.2.2 Qlist容
7、器类163.3 播放器的基本功能163.3.1 建立媒体对象163.3.2 播放控制173.4 播放器设置203.4.1 QSettings介绍213.4.2 QSettings的使用213.4.3 QSettings的乱码问题223.5 播放器界面设计233.5.1 设置背景233.5.2 设置系统托盘图标234 系统测试254.1 测试介绍254.1.1 软件测试的目的254.1.2 测试的方法25264.2.1 添加文件264.2.2 删除歌曲274.2.3 播放歌曲274.2.4 测试结果294.3 总结29结 论30参考文献31致 谢33绪 论随着经济的发展,人类社会发生了翻天覆地的
8、变化,人民生活水平得到了提高,生活节奏变得更快,人们在精神上的需求甚至超过了物质上的需求,而音乐便是他们精神生活中不可缺少的一部分。现代科学技术不断发展,人们开始使用网络媒介与各种数据存储设备,使得各种音频与视频资源的传播更为便捷、迅速、广泛,于是各种音乐播放器也紧跟着发展了起来。音乐播放器作为一种用于播放各种音乐文件的多媒体播放软件,已经成为了大家电脑里面不可或缺的一项应用。因此设计一款优良的音乐播放器软件成了许多公司与个人的目标。网络上已经存在着成各式各样的音乐播放器。但是,它们之中有许多都是根据特定的操作系统来开发的,其中很大一部分都没有实现跨平台的应用,为了应对不同的系操作统,它们只能
9、重新开发新的版本。本文主要研究的就是基于Linux的音乐播放器。它基于Qt开发框架,可以实现跨平台应用,能够在任何它所支持的平台上编译、执行相同的程序代码,而不需要修改源代码。另外,它还能依照不同的平台而表现出该平台特有的图形界面风格。研究基于Linux的音乐播放器具有一定的意义。虽然Linux与Qt已经发展了很长的一段时间,但是对于很多国内计算机专业的大学生来说,它们还是比较陌生的事物。计算机行业是一个飞速发展的行业,我们必须跟上它的步伐,才不会被社会淘汰。本文的目的是通过对流行音乐播放器的研究,设计并实现一款音乐播放器。本音乐播放器在播放音频文件方面主要选择播放本地文件,在功能方面主要具备
10、一些基本的音乐操作功能,如:暂停、播放、音量调节、拖动、停止等。它在稳定性、视觉效果、歌曲库的大小等方面可能远不如当今的许多播放软件,但是它小巧并且易移植,能够实现跨平台运行。1 系统开发平台介绍1.1 Linux简介Linux是一种自由与开放源码的计算机操作系统。目前存在着许多不同的Linux,但它们全都使用了Linux内核。Linux可安装在各种各样的电脑硬件设备,从手机、平板电脑、路由器与影音游戏控制台,到桌上型电脑,大型电脑与超级电脑。Linux是一个领先的操作系统,在2011年11月发布的TOP500中有91.4%的超级计算机使用的是Linux操作系统1。Linux操作系统也是自由软
11、件与开放源代码发展中最著名的例子。只要遵循GNU通用公共许可证,任何人与机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改与再发布。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具与数据库的操作系统(也被称为GNU/ Linux)。通常情况下,Linux被打包成供桌上型电脑与服务器使用的Linux发行版本。一些流行的主流Linux发行版本,包括Debian(及其衍生版本Ubuntu),Fedora与openSUSE等2,3。Linux的发展现状目前流行的桌面操作系统主要包括两大类:一
12、类是主流商业桌面系统,包括微软的Windows系列、Apple的Macintosh等;第二类基于自由软件的桌面操作系统,特别是Linux桌面操作系统。近年来,特别在国内市场,Linux桌面的发展趋势非常迅猛。国内如中标软件、红旗等系统软件厂商推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。国外的Novell(SuSe)、Sun公司也相继推出了基于Linux的桌面系统。但是,从系统的整体功能、性能来看,Linux桌面系统及Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面,如音乐播放器。Linux发展非常迅速,
13、这及它具有的良好特性是分不开的。Linux具有的主要特性如下4:(1) 开放性。系统遵循世界标准规范,凡遵循国际标准所开发的硬件与软件,都能彼此兼容。(2) 多用户。系统资源可以被不同用户各自拥有与使用,即每个用户对自己的资源有特定权限,互不影响。(3) 多任务。能够同时执行多个程序,而且各个程序相互独立运行。(4) 设备独立性。将外部设备统一视为文件,只要安装它们的驱动程序,任何用户都可以像使用文件一样操纵、使用设备,而不必知道它们的具体存在形式。1.2 Qt介绍Qt是一个跨平台的C+应用程序开发框架5。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制
14、台工具与服务器。Qt被OPIE、Skype、VLC media player、Adobe Photoshop、VirtualBox 及Mathematica所使用。它是诺基亚(Nokia)的Qt Development Frameworks部门的产品。Qt使用标准的C+。通过语言绑定,其他的编程语言也可以使用Qt。Qt是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。所有版本都支持广泛的编译器,包括GCC的C+编译器与Visual Studio。使用Qt开发的软件,相同的程序码可以在任何支持的平台上编译及执行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格。除了
15、C+外,Qt还为其它多种计算机语言提供了应用程序接口,您也可以使用这些语言开发Qt应用程序6。Qt主要的优势如下:(1) 面向对象。Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。(2) 丰富的API。Qt包括250个以上的C+类,还提供基于模板的collections,serialization, device,directory management,date /time类。甚至还包括正则表达式的处理功能。1.3 集成开发环境Qt
16、 Creator是一款跨平台的集成开发环境,Qt Creator 是 Qt 被 Nokia收购后推出的一款新的轻量级IDE。此 IDE 能够跨平台运行,支持在桌面环境,如:Windows、Linux/X11与Mac OS。及移动设备,如:Symbian、Maemo与MeeGo上建构与运行Qt应用程序。允许开发者为多桌面环境及移动设备平台创建应用程序。它包括一个可视化侦错工具与整合的GUI版面与外形设计师。这个编辑器的功能包括语法高亮度显示与自动完成。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。Qt Creator在 Lin
17、ux上,使用GCC的C+编译器。在 Windows,预设安装它可以使用MinGW或MSVC。从原始码编译时,也可以使用cdb(Microsoft Console Debugger)。在功能方面,Qt Creator 包括项目生成向导、高级的 C+ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等 。Qt Creator主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。Qt Creator主要功能与优势如下:(1) 使用强大的C+代码编
18、辑器可快速编写代码。语法标识与代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配与括号选择模式高级编辑功能。(2) 使用浏览工具管理源代码。集成了领先的版本控制软件,包括Git、Perforce与Subversion开放式文件,无须知晓确切的名称或位置搜索类与文件跨不同位置或文件沿用符号在头文件与源文件,或在声明与定义之间切换。(3) 为Qt跨平台开发人员的需求而量身定制。集成了特定于Qt的功能,如信号及槽(Signals/Slots)图示调试器,对Qt类结构可一目了然集成了Qt Designer可视化布局与格式构建器只需单击一下就可生成与运行Qt项目。1.4 Ph
19、onon简介Phonon是KDE(Kool Desktop Environment)的多媒体API, 为使用音频与视频的应用程序开发提供的一个框架7。应用程序不用去管多媒体播放是通过什么实现的(如GStreamer),只需调用相应的接口就行,但这中间需要一个中转,被称为backend。Phonon提供一个稳定的API允许KDE4独立于任何一个声音系统服务器,Phonon从一开始就被设计成Qt函数的风格,Phonon并非只能运行于Unix系统,他的后端可以是在其它平台如 Microsoft Windows 并提供相同的功能。正是由于Phonon能够实现跨平台使用,使得Qt4.4与之后版本使用了P
20、honon,作为跨平台的音频与视频播放。Phonon让各种后端提供界面给开发者所谓的“引擎”,每个引擎运作在一个具体的后端。每个后端都可让Phonon控制基本功能,如播放、暂停与搜寻。Phonon也支持更高层次的功能,如让音轨转化之间变微弱。使用Solid,Phonon将给予用户更多配件的控制能力如耳机、扬声器、麦克风。2 系统分析2.1 播放器举例Windows下的音乐播放器:Windows Media Player 是一款Windows系统自带的播放器,支持通过插件增强功能,在V7及以后的版本,支持换肤。1992年微软在Windows 3.1当中捆绑了WMP1.0,使Windows3.1成
21、为第一代支持多媒体的Windows系统。后来,在Windows 98当中内置了WMP64,这个版本存在于后续的操作系统中,并被一直保留至今。另外,Windows有千千静听、QQ音乐、酷狗音乐等优秀播放器,功能十分完善,界面十分华丽,设计人性化,操作灵活、简单,种类十分丰富。Linux下的音乐播放器:(1) Audacious及其它播放器的不同之处在于,它除了支持UTF-8字符集之外,还提供其它字符集的支持,这样能比较好的解决中文乱码的问题。更重要的一点是,它能很好的播放APE格式的音乐 。(2) Juk是一个很易用的播放器,而且界面方面做得比较美观。但似乎它不能直接读取windows分区里的音
22、乐文件,如果音乐都在NTFS分区里,会给用户带来不少不便。(3) Bmpx相对前面两者的特色在于最小化到托盘后的播放提示。 (4) Rhythmbox 是一款集成化的音乐管理工具,创建灵感来源于iTunes播放器,以GNOME桌面系统与GStreamer媒体框架为基础。不仅可以播放多种格式的音乐文件,还可以连接到互联网中接受网络收音机或者到网上音乐商店购买音乐4。虽然Linux上的音乐播放软件并不缺乏,但是很多的软件技术层面并不是非常超前,只是简简单单,一切都由插件搞定,只是靠它整合的完整性让人简简单单完成音乐播放的任务。在缺乏商业化因素的支持下,Linux音乐播放器的用户体验并不高。由于Li
23、nux在图形界面、用户操作方面的劣势,现在的Linux应用程序在在向windows学习,应用程序界面更加丰富,更加美观,更加人性化,种类也更加丰富。开发者也在想更加团队、专业发展。2.2 功能需求分析音乐播放器作为一款必不可少的应用程序,广泛应用于电脑、智能手机、嵌入式设备,有着庞大的客户人群。本文设计并实现一款简单的播放器,能够实现音乐播放器的一般基本功能。现将本播放器能够实现的功能做一些分析。2.2.1 基本功能实现音频的播放,这是开发一款音乐播放器的最基本要求,能够实现音频播放、暂停、停止、进度拖动、音量控制、上一首、下一首等基本功能。同时,在用户使用播放器的过程中,能够打开本地音频文件
24、,将文件动态的添加到播放器当前播放列表,实现文件的打开操作8。为了方便用户的使用,本文能够将用户的播放列表存储在本地文件中,当系统下次启动的时候,能够获取用户的历史播放列表,并且将其添加进播放器的播放列表中。同时,如果用户想删除某首歌曲,可以将其从当前播放列表中删除。为了能够使用户清楚自己的播放历史,播放器实现了播放历史记录功能,将用户的播放历史记录在本地文件中,可以方便用户的查看。播放器还有一些其他的功能,如:双击播放器列表实现文件的播放,系统关闭提示,最小化到系统托盘,鼠标拖动窗口等。2.2.2 播放器基本设置为了让用户对播放器有更好的体验,本文实现了对播放器的设置功能,能够对播放器进行一
25、些基本设置,将设置结果保存在播放器的配置文件中,每次播放器启动的时候,首先读取配置文件,根据其中的内容,配置播放器的相关项。能够实现的基本配置有:背景图标的切换、语言切换、默认打开文件路径、是否最小化、播放器关闭提示。2.2.3 快捷键设置为了方便用户的操作,现在绝大部分的应用软件都设置有快捷键操作,能够实现对软件的快捷操作。本文也根据需要设置了相关的快捷键,实现对播放器的控制。2.2.4 上下文菜单设置在播放器的设计过程中,参照主流音乐播放器的一些特点,为本播放器的托盘图标,播放列表,与播放器的主窗体设置有相关的上下文菜单。当用户点击鼠标右键,能够弹出相应的菜单选项,提供不同的操作。比如,当
26、用户右键播放器托盘图标的时候,弹出的菜单有:最小化、复原、设置等,当用户右击播放列表,弹出菜单有:删除此歌曲、删除全部歌曲、打开文件等功能。2.3 可行性分析对于基于Linux的音乐播放器的设计及实现的可行性,本文将从经济、技术与应用三方面进行分析。2.3.1 经济可行性Debian是一种自由与开放源码的类Unix操作系统,系统软件本身的安装与使用都不需要任何费用。Qt分为两种版本:(1) Qt商业版。提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级与技术支持服务。(2) Qt开源版。仅仅为了开发自由与开放源码软件,提供了与商业版本同样的功能。GNU通用公共许可证
27、下,它是免费的。本系统采用Qt开源版,不需要任何费用。所以,基于Linux的音乐播放器在开发过程中,不需要任何的附加费用,能够实现“零成本”的可行性。2.3.2 技术可行性首先,基于Linux的音乐播放器,实现一般音乐播放器的基本功能(播放,暂停,快进),没有十分复杂的其他功能,如:网络下载,歌词下载等,这些都能够运用所学的知识实现,这些功能都可以通过调用Phonon的API来实现。Qt对于大多数人来说,还是一个新事物,但是它只是一个跨平台应用程序与UI开发框架,而且这个项目对于Qt的运用不是很深入,只是对于某一些基本的理论知识的学习与运用。同时在Linux下使用Qt的集成开发环境 Qt Cr
28、eator及在windows平台下没有太大差别。此项目使用过的编程语言是C+,作为一项高级语言,及C、C#、Java都有很多相似性。最后,Linux、Qt作为开源软件,在网络上有许多开源社区,有很多开源爱好者,能够查到许多相关的源代码,通过充分运用这些网络资源,对自己完成设计有很大帮助。2. 应用分析本文是在Debian操作系统平台上进行的开发,使用Qt实现C+图形用户界面开发,Phonon实现多媒体编程。由于Qt与Phonon都具有跨平台的特性,使用Qt开发的软件,相同的程序代码可以在任何支持的平台上编译及执行,而不需要修改源代码。只要操作系统安装有Qt与Phonon的相关类库,本播放器能够
29、在 Linux、Windows、Mac OS X等操作系统上使用。所以能够支持播放器的操作系统十分广泛。本播放器实现了大部分基本功能,能够满足用户一般的播放需要。资源获取途径方面,本播放器可以不受限制地获取本地计算机上的所有资源,同时资源获取方便快捷。界面观感方面,桌面应用程序除了自身的菜单栏与工具栏之外,没有多余的菜单栏与工具栏。2.4 总结本课题通过对Linux环境下的音乐播放器技术的相关研究,了解了Linux平台下的体系结构,以及QT开发平台使用,掌握了音乐播放器的实现原理以及过程,从而设计出一款用户界面友好的音乐播放器。通过以上分析,播放器的功能不是非常复杂,完成这个音乐播放器的知识大
30、都已经具备,所以能够较好的完成。主要研究内容包括以下几个方面:(1) 查找相关书籍及文献,了解LINUX的构架并搭建LINUX平台。(2) 查找相关资料,了解QT Creator的开发方式以及QT库的使用,搭建QT平台。(3) 查找现阶段基于LINUX平台手机音乐播放器发展现状以及相关功能。在上述基础上,做出音乐播放器的相关功能如下:(1) 美观、时尚的操作界面。(2) 滚动显示正在播放的歌曲及其长度信息。(3) 音频的播放、暂停、停止、快进等功能。(4) 显示歌曲的播放进度。(5) 通过播放列表来选择播放曲目。(6) 音乐播放器的控制设置功能。(7) 音乐播放器的控制设置功能等。在LINUX
31、平台上完成该课题的软件,然后进行相应的软件测试。3 系统设计3.1 Qt信号及槽机制介绍在以往的GUI用户界面中,用户操作一个窗口部件时,需要其他窗口部件的响应或者能够激活其他操作。在程序开发中,经常使用回调(callback)机制来实现。但是,QT不同于回调机制,他使用信号及槽机制。信号与槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号与槽有所了解。信号与槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号与槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C+ 语言,因此要正确的处理信号与槽,必须借助一个称为 moc(
32、Meta Object Compiler)的 QT 工具,该工具是一个 C+ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码9。在人们熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号与槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号与槽能携带任意数量与任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。所有从 QObject 或其子类 (例如Qwidget) 派生的类都能够包含信号与槽。当对象改变其状态时,信
33、号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号及自己相连接。而且,对象并不了解具体的通信机制。可以将很多信号及单个的槽进行连接,也可以将单个的信号及很多的槽进行连接,甚至于将一个信号及另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号及槽构造了一个强大的部件编程机制。3.1.1 信号当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义
34、过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,及其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号及槽机制完全独立于任何 GUI 事件循环。只有当所有的槽返回以后发射函数emit()才返回。如果存在多个槽及某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行,哪个后执行。信号的声明是在头文件中进行的,QT 的 signals 关键字指出进入了信号声明区,随后即可 声明自己的信号。例如,下面定义了两个信号:signals: void mySignal(); void mySignal
35、(int x); 在上面的定义中,signals 是 QT 的关键字,而非 C/C+ 的。接下来的一行void mySignal() 定义了信号mySignal,这个信号没有携带参数;接下来的一行void mySignal(int x) 定义了重名信号 mySignal,但是它携带一个整形参数,这有点类似于 C+ 中的虚函数。从形式上讲信号的声明及普通的C+函数是一样的,但是信号却没有函数体定义。另外,信号的返回类型都是void,不要指望能从信号返回什么有用信息。信号由moc自动产生,它们不应该在.cpp文件中实现6。3.1.2 槽槽是普通的 C+ 成员函数,可以被正常调用,它们唯一的特殊性就
36、是很多信号可以及其相关联。当及其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此及其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够及其相关联。同普通的 C+ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 与 protected slots。(1) public slots类型。在这个区内声明的槽意味着任何对象都可将信号及之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号及槽进行连接以便信息能够正确的传递。(2) protected slots类型。在这个区
37、内声明的槽意味着当前类及其子类可以将信号及之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。(3) private slots类型。在这个区内声明的槽意味着只有类自己可以将信号及之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。槽的声明也是在头文件中进行的。例如,下面声明了两个槽:public slots: void mySlot(); void mySlot(int x); 在上面的定义中,slots是 QT 的关键字。接下来的一行void mySlot() 定义了槽mySlot,这个槽没有携带参数;接下来的一行void mySlot(int
38、 x)定义了重名槽 mySlot,但是它携带一个整形参数。槽的返回类型都是void。3.1.3 信号及槽的关联信号是一个特定的标识,槽就是一个函数,却及一般函数不同,槽函数能与信号关联,也能够被直接调用。Qt利用信号及槽(signals/slots)机制取代传统的callback来进行物件之间的沟通。当操作事件发生的时候,物件会发送出一个信号(signal);而槽(slot)则是一个函式接受特定信号并且执行槽本身设定的动作。在程序中,使用QObject:connect()函数来将信号及槽关联。信号及槽的关联关系有以下几种模式:(1) 一个信号与槽关联。(2) 一个信号与多个槽关联。(3) 多个
39、信号与一个槽关联。一个信号及多个槽关联的情况下,当发出信号的时候,及此信号关联的各个槽之间以任意的先后顺序立即执行,即:槽函数之间的执行顺序是随机的,及信号与槽关联的先后没有关系。同时,信号与槽机制是完全与GUI事件完全独立的,槽函数独立循环。信号在任何执行点上皆可发射,甚至可以在槽里再发射另一个信号,信号及槽的连结不限定为一对一的连结,一个信号可以连结到多个槽或多个信号连结到同一个槽,甚至信号也可连接到信号。3.1.4 Qt信号与槽机制的优点信号与槽机制有以下优点10:(1) 类型安全的。以往的callback缺乏类型安全,在呼叫处理函数时,无法确定是传递正确型态的参数。信号与其接受的槽之间
40、传递的资料型态必须要相符合,需要关联的信号与槽的签名必须是等同的,即信号的参数类型与参数个数及接受该信号的槽的参数类型与参数个数相同;不过,一个槽的参数个数是可以少于信号的参数个数,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号与槽的签名不符,编译器会报错。信号与槽可接受任何数量、任何型态的参数,所以信号及槽机制是完全类型安全。(2) 松散耦合的。Qt信号与槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是哪个对象的哪个槽需要接收它发出的信号,它需要做的是在适当的时间发送适当的信号就可以了,而不需要知道也不必关心它的信号有没有被接收到,更不需要知道是哪个对象的哪个槽接收到了信
41、号,也就是说一个信号可以呼叫所有可用的槽。同样的,对象的槽也不知道是哪些信号关联到了自己。而一旦关联信号与槽,Qt就保证了合适的槽得到调用。即使关联的对象在运行时被删除,应用程序也不会出现崩溃。此机制会确保当在“连接”信号与槽时,槽会接受信号的参数并且正确执行。(3) 信号及槽的效率问题。信号与槽机制增强了对象间通信的灵活性,然而也损失了一些性能。及callback相比较,信号及槽有些慢。原因有:需要定位接受信号的对象;安全的遍历所有的关联(如:一个信号关联到多个槽);多线程,信号可能排队等待。但是,及创建堆对象时的new操作实例化对象,以及删除堆对象的delete操作相比较,信号及槽的代价只
42、是他的很少的一部分。信号与槽带来的性能损耗,对实时应用程序是很小的。相对于信号及槽带来的灵活及简便,这点性能损失是可以接受的。3.2 函数基于Linux的播放器使用了Phonon多媒体框架与Qt框架的相关函数,现简要介绍如下。3.2.1 Phonon媒体框架Phonon 有三个基本概念:媒体对象、接收端与路径,图3-1是Phonon架构图7:图3-1 Phonon框架图3-1是Phonon的架构图。Media Object(媒体对象)管理一个Media Source(媒体源),比如一个音乐文件;它提供了简单的播放控制,比如开始、停止与暂停播放。Sink是输出多媒体,通常是一个播放的装置(如声卡
43、),且只接受MediaObject来的数据。多媒体由MediaObject控制播放,而由Sink来处理这些多媒体。Path是用来连接 Phonon对象的,比如,一个媒体对象与一个接收端,从而构成了Phonon 中的MediaGraph,如图3-2所示:图3-2 媒体文件播放过程图3-2是媒体文件的播放过程,这些在不同的系统中实现方式不同,如:在Linux环境下,通常使用GStreamer库,在Max OS X 环境下,使用QuickTime,在windows下,使用Direct X与SirectShow库。而Qt中的phonon作为跨平台的多媒体解决方案,就应该为用户屏蔽掉这些差异,如图3-3
44、所示:图3-3 详细Phonon框架图3-3是Phonon的详细框架图,由图可知Phonon框架实质上分4个部分:程序、Phonon库、Phonon后端插件(phonon_backend)、真正的后端。Phonon其实什么都不干,他只是提供了一套API接口,这套接口可以给你的程序调用,同时也是给编写后端插件提供一个规范。同样,Phonon库也不知道,他只管搜索符合自己规范的插件。并告诉这些插件,现在程序发出的指令是什么,从插件返回给程序现在的媒体状态与信息。而后端才是实际进行读入媒体、解码并且播放的部分,他们与后端插件是一一对应的。后端可以是任何形式,只要你写出了相应的后端插件。Phonon函
45、数成员如图3-4所示7:图3-4 主要的Phonon类播放器主要使用的Phonon类及使用方法介绍如下11:(1) Phonon:MediaObject ClassMediaObject主要提供一个能够处理媒体播放的类。MediaObject可说是处理多媒体文件最基本的一部份,它接受并管理来自于MediaSource的媒体文件。而媒体播放、暂停及停止都是由它来控制;而在此之前,mediaObject必须要及output node连接,如早先所讲的,这个nodes主要将媒体输出至底层的硬件,例如声卡或显卡等,而所需要的output node则是根据多媒体的内容而所不同,目前Phonon有两种ou
46、tput node: AudioOutput声音播放。 VideoWidget影像播放。用法:Phonon:MediaObject *mediaObject=new Phonon:MediaObject(this);mediaObject-setCurrentSource(Phonon:MediaSource(/mymusic/barbi.wav);(2) Phonon:AudioOutput Class AudioOutput类别主要是用来把多媒体的声音送到声音输出装置。所以它能够经由类似喇叭等输出装置来播放声音,多媒体资料的来源必须要经过Phonon:createPath()及MediaO
47、bject连接。在Phonon术语中,我们要创建的AudioOutput对象叫做音频接收槽。它是直接及音频驱动器通信的层的组成部分,并充当MediaObject的虚拟音频设备。MediaObject位于这一层的上层,增加了诸如暂停、播放与倒带之类的功能。用法:AudioOutput *audioOutput=new AudioOutput(Phonon:MusicCategory, this);(3) Phonon:createPath()这是相当重要的一个函数,主要用于建立一个Path,连接两个MediaNodes,就是Source及Sink。如果只是利用Phonon来播放多媒体影音文件,其实只要记得它是用来连接source及输出装置即可。用法:Phonon:Path path=Phonon:createPath(mediaObject, audioOutput);(4) Phonon:SeekSlider classSeekSlider类别提供一个可滑动的slider来设定多媒体串流播放的位置。所以它会连接到MediaObject,并控制串流目前的位置。用法:Phonon:SeekSlider *seekSlider = new Phonon:SeekSlider(this);seekSlide