admin 管理员组文章数量: 1184232
2023年12月25日发(作者:小说绝美白莲在线教程)
基于Linux的音乐播放器设计与实现
专 业:计算机科学与技术 学 号:
学 生: 指导教师:
摘要:作为一项与人们生活息息相关的应用,音乐播放器在人们的生活中发挥着不可替代的作用。本播放器在Linux(Debian 6.0)操作系统平台下进行开发,使用Qt程序开发框架实现播放器的GUI设计,并用Phonon多媒体API实现多媒体控制,最后再用C++编程实现。本播放器实现了音乐播放器的基本功能,包括“播放”、“暂停”、“上一曲”、“下一曲”、“添加文件”、“删除文件”、“切换背景图标”、“最小化到托盘”等功能。测试表明,本播放器能够流畅地运行,并能很好地实现各项功能,并且有一定的容错能力,达到了设计预期的效果。同时,本播放器在稳定性、经济成本等方面都有不错的表现。
关键词:音乐播放器;Linux;Qt;Phonon
The Design and Implementation of Music Player Based
on Linux
Specialty: Student Number:
Student:
Supervisor:
Abstract: As an application, which is closely related to the people's lives, music player plays an
irreplaceable role in people's life. This Music player is developed under Linux (Debian 6.0)
operating system with the Qt application development framework implementing the player's 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 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 of
functions mentioned before. The player is provided with fault tolerance as well. To sum up, the
player achieves the design's 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
目 录
绪 论 ......................................................................................................................................... 1
1 系统开发平台介绍 ............................................................................................................... 2
1.1 Linux简介 ...................................................................................................................... 2
1.2 Qt介绍 ............................................................................................................................ 3
1.3 集成开发环境 ................................................................................................................ 3
1.4 Phonon简介 .................................................................................................................... 4
2 系统分析 ............................................................................................................................... 5
2.1 播放器举例 .................................................................................................................... 5
2.2 功能需求分析 ................................................................................................................ 5
2.2.1 基本功能 .................................................................................................................. 6
2.2.2 播放器基本设置 ...................................................................................................... 6
2.2.3 快捷键设置 .............................................................................................................. 6
2.2.4 上下文菜单设置 ...................................................................................................... 6
2.3 可行性分析 .................................................................................................................... 6
2.3.1 经济可行性 .............................................................................................................. 7
2.3.2 技术可行性 .............................................................................................................. 7
2.3.3 应用分析 .................................................................................................................. 7
2.4 总结 ................................................................................................................................ 8
3 系统设计 ............................................................................................................................... 9
3.1 Qt信号与槽机制介绍 .................................................................................................... 9
3.1.1 信号 .......................................................................................................................... 9
3.1.2 槽 ............................................................................................................................ 10
3.1.3 信号与槽的关联 .................................................................................................... 11
3.1.4 Qt信号和槽机制的优点 ........................................................................................ 11
3.2 函数 .............................................................................................................................. 12
I
3.2.1 Phonon媒体框架 .................................................................................................... 12
3.2.2 Qlist容器类 ............................................................................................................ 15
3.3 播放器的基本功能 ...................................................................................................... 16
3.3.1 建立媒体对象 ........................................................................................................ 16
3.3.2 播放控制 ................................................................................................................ 16
3.4 播放器设置 .................................................................................................................. 20
3.4.1 QSettings介绍 ........................................................................................................ 20
3.4.2 QSettings的使用 .................................................................................................... 21
3.4.3 QSettings的乱码问题 ............................................................................................ 22
3.5 播放器界面设计 .......................................................................................................... 22
3.5.1 设置背景 ................................................................................................................ 22
3.5.2 设置系统托盘图标 ................................................................................................ 23
4 系统测试 ............................................................................................................................. 24
4.1 测试介绍 ...................................................................................................................... 24
4.1.1 软件测试的目的 .................................................................................................... 24
4.1.2 测试的方法 ............................................................................................................ 24
4.2测试设计 ....................................................................................................................... 25
4.2.1 添加文件 ................................................................................................................ 25
4.2.2 删除歌曲 ................................................................................................................ 26
4.2.3 播放歌曲 ................................................................................................................ 26
4.2.4 测试结果 ................................................................................................................ 28
4.3 总结 .............................................................................................................................. 28
结 论 ....................................................................................................................................... 29
参考文献 ................................................................................................................................. 30
致 谢 ....................................................................................................................................... 32
II
绪 论
随着经济的发展,人类社会发生了翻天覆地的变化,人民生活水平得到了提高,生活节奏变得更快,人们在精神上的需求甚至超过了物质上的需求,而音乐便是他们精神生活中不可缺少的一部分。现代科学技术不断发展,人们开始使用网络媒介和各种数据存储设备,使得各种音频和视频资源的传播更为便捷、迅速、广泛,于是各种音乐播放器也紧跟着发展了起来。音乐播放器作为一种用于播放各种音乐文件的多媒体播放软件,已经成为了大家电脑里面不可或缺的一项应用。因此设计一款优良的音乐播放器软件成了许多公司和个人的目标。
网络上已经存在着成各式各样的音乐播放器。但是,它们之中有许多都是根据特定的操作系统来开发的,其中很大一部分都没有实现跨平台的应用,为了应对不同的系操作统,它们只能重新开发新的版本。
本文主要研究的就是基于Linux的音乐播放器。它基于Qt开发框架,可以实现跨平台应用,能够在任何它所支持的平台上编译、执行相同的程序代码,而不需要修改源代码。另外,它还能依照不同的平台而表现出该平台特有的图形界面风格。
研究基于Linux的音乐播放器具有一定的意义。虽然Linux和Qt已经发展了很长的一段时间,但是对于很多国内计算机专业的大学生来说,它们还是比较陌生的事物。计算机行业是一个飞速发展的行业,我们必须跟上它的步伐,才不会被社会淘汰。
本文的目的是通过对流行音乐播放器的研究,设计并实现一款音乐播放器。本音乐播放器在播放音频文件方面主要选择播放本地文件,在功能方面主要具备一些基本的音乐操作功能,如:暂停、播放、音量调节、拖动、停止等。它在稳定性、视觉效果、歌曲库的大小等方面可能远不如当今的许多播放软件,但是它小巧并且易移植,能够实现跨平台运行。
1
1 系统开发平台介绍
1.1 Linux简介
Linux是一种自由和开放源码的计算机操作系统。目前存在着许多不同的Linux,但它们全都使用了Linux内核。Linux可安装在各种各样的电脑硬件设备,从手机、平板电脑、路由器和影音游戏控制台,到桌上型电脑,大型电脑和超级电脑。Linux是一个领先的操作系统,在2011年11月发布的TOP500中有91.4%的超级计算机使用的是Linux操作系统[1]。
Linux操作系统也是自由软件和开放源代码发展中最著名的例子。只要遵循GNU通用公共许可证,任何人和机构都可以自由地使用Linux的所有底层源代码,也可以自由地修改和再发布。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统(也被称为GNU/ Linux)。通常情况下,Linux被打包成供桌上型电脑和服务器使用的Linux发行版本。一些流行的主流Linux发行版本,包括Debian(及其衍生版本Ubuntu),Fedora和openSUSE等[2,3]。
Linux的发展现状
目前流行的桌面操作系统主要包括两大类:一类是主流商业桌面系统,包括微软的Windows系列、Apple的Macintosh等;第二类基于自由软件的桌面操作系统,特别是Linux桌面操作系统。近年来,特别在国内市场,Linux桌面的发展趋势非常迅猛。国内如中标软件、红旗等系统软件厂商推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。国外的Novell(SuSe)、Sun公司也相继推出了基于Linux的桌面系统。但是,从系统的整体功能、性能来看,Linux桌面系统与Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面,如音乐播放器。
Linux发展非常迅速,这与它具有的良好特性是分不开的。Linux具有的主要特性如下[4]:
(1) 开放性。系统遵循世界标准规范,凡遵循国际标准所开发的硬件和软件,都能彼此兼容。
(2) 多用户。系统资源可以被不同用户各自拥有和使用,即每个用户对自己的资源有特定权限,互不影响。
2
(3) 多任务。能够同时执行多个程序,而且各个程序相互独立运行。
(4) 设备独立性。将外部设备统一视为文件,只要安装它们的驱动程序,任何用户都可以像使用文件一样操纵、使用设备,而不必知道它们的具体存在形式。
1.2 Qt介绍
Qt是一个跨平台的C++应用程序开发框架[5]。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。Qt被OPIE、Skype、VLC media player、Adobe Photoshop、VirtualBox 与Mathematica所使用。它是诺基亚(Nokia)的Qt Development Frameworks部门的产品。Qt使用标准的C++。通过语言绑定,其他的编程语言也可以使用Qt。
Qt是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。所有版本都支持广泛的编译器,包括GCC的C++编译器和Visual Studio。使用Qt开发的软件,相同的程序码可以在任何支持的平台上编译与执行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格。除了C++外,Qt还为其它多种计算机语言提供了应用程序接口,您也可以使用这些语言开发Qt应用程序[6]。
Qt主要的优势如下:
(1) 面向对象。Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单。
(2) 丰富的API。Qt包括250个以上的C++类,还提供基于模板的collections,serialization,file,I/O device,directory management,date /time类。甚至还包括正则表达式的处理功能。
1.3 集成开发环境
Qt Creator是一款跨平台的集成开发环境,Qt Creator 是 Qt 被 Nokia收购后推出的一款新的轻量级IDE。此 IDE 能够跨平台运行,支持在桌面环境,如:Windows、Linux/X11和Mac OS。与移动设备,如:Symbian、Maemo和MeeGo上建构和运行Qt应用程序。允许开发者为多桌面环境及移动设备平台创建应用程序。它包括一个可视化侦错工具和整合的GUI版面和外形设计师。这个编辑器的功能包括语法高亮度显示和自动完成。根据官方描述,Qt Creator 的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。Qt Creator在 Linux上,使用GCC的C++编译器。在 Windows,预设安装它可以使用MinGW或MSVC。从原始码编译时,也3
可以使用cdb(Microsoft Console Debugger)。
在功能方面,Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等 。
Qt Creator主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。Qt Creator主要功能和优势如下:
(1) 使用强大的C++代码编辑器可快速编写代码。语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能。
(2) 使用浏览工具管理源代码。集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换。
(3) 为Qt跨平台开发人员的需求而量身定制。集成了特定于Qt的功能,如信号与槽(Signals/Slots)图示调试器,对Qt类结构可一目了然集成了Qt
Designer可视化布局和格式构建器只需单击一下就可生成和运行Qt项目。
1.4 Phonon简介
Phonon是KDE(Kool Desktop Environment)的多媒体API, 为使用音频和视频的应用程序开发提供的一个框架[7]。应用程序不用去管多媒体播放是通过什么实现的(如GStreamer),只需调用相应的接口就行,但这中间需要一个中转,被称为backend。Phonon提供一个稳定的API允许KDE4独立于任何一个声音系统服务器,Phonon从一开始就被设计成Qt函数的风格,Phonon并非只能运行于Unix系统,他的后端可以是在其它平台如 Microsoft Windows 并提供相同的功能。正是由于Phonon能够实现跨平台使用,使得Qt4.4和之后版本使用了Phonon,作为跨平台的音频和视频播放。
Phonon让各种后端提供界面给开发者所谓的“引擎”,每个引擎运作在一个具体的后端。每个后端都可让Phonon控制基本功能,如播放、暂停和搜寻。Phonon也支持更高层次的功能,如让音轨转化之间变微弱。使用Solid,Phonon将给予用户更多配件的控制能力如耳机、扬声器、麦克风。
4
2 系统分析
2.1 播放器举例
Windows下的音乐播放器:
Windows Media Player 是一款Windows系统自带的播放器,支持通过插件增强功能,在V7及以后的版本,支持换肤。1992年微软在Windows 3.1当中捆绑了WMP1.0,使Windows3.1成为第一代支持多媒体的Windows系统。后来,在Windows 98当中内置了WMP64,这个版本存在于后续的操作系统中,并被一直保留至今。
另外,Windows有千千静听、QQ音乐、酷狗音乐等优秀播放器,功能十分完善,界面十分华丽,设计人性化,操作灵活、简单,种类十分丰富。
Linux下的音乐播放器:
(1) Audacious与其它播放器的不同之处在于,它除了支持UTF-8字符集之外,还提供其它字符集的支持,这样能比较好的解决中文乱码的问题。更重要的一点是,它能很好的播放APE格式的音乐 。
(2) Juk是一个很易用的播放器,而且界面方面做得比较美观。但似乎它不能直接读取windows分区里的音乐文件,如果音乐都在NTFS分区里,会给用户带来不少不便。
(3) Bmpx相对前面两者的特色在于最小化到托盘后的播放提示。
(4) Rhythmbox 是一款集成化的音乐管理工具,创建灵感来源于iTunes播放器,以GNOME桌面系统和GStreamer媒体框架为基础。不仅可以播放多种格式的音乐文件,还可以连接到互联网中接受网络收音机或者到网上音乐商店购买音乐[4]。
虽然Linux上的音乐播放软件并不缺乏,但是很多的软件技术层面并不是非常超前,只是简简单单,一切都由插件搞定,只是靠它整合的完整性让人简简单单完成音乐播放的任务。在缺乏商业化因素的支持下,Linux音乐播放器的用户体验并不高。由于Linux在图形界面、用户操作方面的劣势,现在的Linux应用程序在在向windows学习,应用程序界面更加丰富,更加美观,更加人性化,种类也更加丰富。开发者也在想更加团队、专业发展。
2.2 功能需求分析
音乐播放器作为一款必不可少的应用程序,广泛应用于电脑、智能手机、嵌入式设备,有着庞大的客户人群。本文设计并实现一款简单的播放器,能够实现音乐播放器的5
一般基本功能。现将本播放器能够实现的功能做一些分析。
2.2.1 基本功能
实现音频的播放,这是开发一款音乐播放器的最基本要求,能够实现音频播放、暂停、停止、进度拖动、音量控制、上一首、下一首等基本功能。同时,在用户使用播放器的过程中,能够打开本地音频文件,将文件动态的添加到播放器当前播放列表,实现文件的打开操作[8]。
为了方便用户的使用,本文能够将用户的播放列表存储在本地文件中,当系统下次启动的时候,能够获取用户的历史播放列表,并且将其添加进播放器的播放列表中。同时,如果用户想删除某首歌曲,可以将其从当前播放列表中删除。为了能够使用户清楚自己的播放历史,播放器实现了播放历史记录功能,将用户的播放历史记录在本地文件中,可以方便用户的查看。
播放器还有一些其他的功能,如:双击播放器列表实现文件的播放,系统关闭提示,最小化到系统托盘,鼠标拖动窗口等。
2.2.2 播放器基本设置
为了让用户对播放器有更好的体验,本文实现了对播放器的设置功能,能够对播放器进行一些基本设置,将设置结果保存在播放器的配置文件中,每次播放器启动的时候,首先读取配置文件,根据其中的内容,配置播放器的相关项。
能够实现的基本配置有:背景图标的切换、语言切换、默认打开文件路径、是否最小化、播放器关闭提示。
2.2.3 快捷键设置
为了方便用户的操作,现在绝大部分的应用软件都设置有快捷键操作,能够实现对软件的快捷操作。本文也根据需要设置了相关的快捷键,实现对播放器的控制。
2.2.4 上下文菜单设置
在播放器的设计过程中,参照主流音乐播放器的一些特点,为本播放器的托盘图标,播放列表,和播放器的主窗体设置有相关的上下文菜单。当用户点击鼠标右键,能够弹出相应的菜单选项,提供不同的操作。比如,当用户右键播放器托盘图标的时候,弹出的菜单有:最小化、复原、设置等,当用户右击播放列表,弹出菜单有:删除此歌曲、删除全部歌曲、打开文件等功能。
2.3 可行性分析
对于基于Linux的音乐播放器的设计与实现的可行性,本文将从经济、技术和应用6
三方面进行分析。
2.3.1 经济可行性
Debian是一种自由和开放源码的类Unix操作系统,系统软件本身的安装和使用都不需要任何费用。
Qt分为两种版本:
(1) Qt商业版。提供给商业软件开发。它们提供传统商业软件发行版并且提供在协议有效期内的免费升级和技术支持服务。
(2) Qt开源版。仅仅为了开发自由和开放源码软件,提供了和商业版本同样的功能。GNU通用公共许可证下,它是免费的。
本系统采用Qt开源版,不需要任何费用。所以,基于Linux的音乐播放器在开发过程中,不需要任何的附加费用,能够实现“零成本”的可行性。
2.3.2 技术可行性
首先,基于Linux的音乐播放器,实现一般音乐播放器的基本功能(播放,暂停,快进),没有十分复杂的其他功能,如:网络下载,歌词下载等,这些都能够运用所学的知识实现,这些功能都可以通过调用Phonon的API来实现。
Qt对于大多数人来说,还是一个新事物,但是它只是一个跨平台应用程序和UI开发框架,而且这个项目对于Qt的运用不是很深入,只是对于某一些基本的理论知识的学习和运用。同时在Linux下使用Qt的集成开发环境 Qt Creator与在windows平台下没有太大差别。此项目使用过的编程语言是C++,作为一项高级语言,与C、C#、Java都有很多相似性。
最后,Linux、Qt作为开源软件,在网络上有许多开源社区,有很多开源爱好者,能够查到许多相关的源代码,通过充分运用这些网络资源,对自己完成设计有很大帮助。
2.3.3 应用分析
本文是在Debian操作系统平台上进行的开发,使用Qt实现C++图形用户界面开发,Phonon实现多媒体编程。由于Qt和Phonon都具有跨平台的特性,使用Qt开发的软件,相同的程序代码可以在任何支持的平台上编译与执行,而不需要修改源代码。只要操作系统安装有Qt和Phonon的相关类库,本播放器能够在 Linux、Windows、Mac OS X等操作系统上使用。所以能够支持播放器的操作系统十分广泛。本播放器实现了大部分基本功能,能够满足用户一般的播放需要。
资源获取途径方面,本播放器可以不受限制地获取本地计算机上的所有资源,同时7
资源获取方便快捷。界面观感方面,桌面应用程序除了自身的菜单栏和工具栏之外,没有多余的菜单栏和工具栏。
2.4 总结
本课题通过对Linux环境下的音乐播放器技术的相关研究,了解了Linux平台下的体系结构,以及QT开发平台使用,掌握了音乐播放器的实现原理以及过程,从而设计出一款用户界面友好的音乐播放器。通过以上分析,播放器的功能不是非常复杂,完成这个音乐播放器的知识大都已经具备,所以能够较好的完成。
主要研究内容包括以下几个方面:
(1) 查找相关书籍与文献,了解LINUX的构架并搭建LINUX平台。
(2) 查找相关资料,了解QT Creator的开发方式以及QT库的使用,搭建QT平台。
(3) 查找现阶段基于LINUX平台手机音乐播放器发展现状以及相关功能。
在上述基础上,做出音乐播放器的相关功能如下:
(1) 美观、时尚的操作界面。
(2) 滚动显示正在播放的歌曲及其长度信息。
(3) 音频的播放、暂停、停止、快进等功能。
(4) 显示歌曲的播放进度。
(5) 通过播放列表来选择播放曲目。
(6) 音乐播放器的控制设置功能。
(7) 音乐播放器的控制设置功能等。
在LINUX平台上完成该课题的软件,然后进行相应的软件测试。
8
3 系统设计
3.1 Qt信号与槽机制介绍
在以往的GUI用户界面中,用户操作一个窗口部件时,需要其他窗口部件的响应或者能够激活其他操作。在程序开发中,经常使用回调(callback)机制来实现。但是,QT不同于回调机制,他使用信号与槽机制。
信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT
区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta
Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码[9]。
在人们熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。
所有从 QObject 或其子类 (例如Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
3.1.1 信号
当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号与槽机制完全独立于9
任何 GUI 事件循环。只有当所有的槽返回以后发射函数emit()才返回。如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行,哪个后执行。
信号的声明是在头文件中进行的,QT 的 signals 关键字指出进入了信号声明区,随后即可 声明自己的信号。例如,下面定义了两个信号:
signals:
void mySignal();
void mySignal(int x);
在上面的定义中,signals 是 QT 的关键字,而非 C/C++ 的。接下来的一行void
mySignal() 定义了信号mySignal,这个信号没有携带参数;接下来的一行void
mySignal(int x) 定义了重名信号 mySignal,但是它携带一个整形参数,这有点类似于
C++ 中的虚函数。从形式上讲信号的声明与普通的C++函数是一样的,但是信号却没有函数体定义。另外,信号的返回类型都是void,不要指望能从信号返回什么有用信息。信号由moc自动产生,它们不应该在.cpp文件中实现[6]。
3.1.2 槽
槽是普通的 C++ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。
既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。
(1) public slots类型。在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
(2) protected slots类型。在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
(3) private slots类型。在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。
10
槽也能够声明为虚函数,这也是非常有用的。
槽的声明也是在头文件中进行的。例如,下面声明了两个槽:
public slots:
void mySlot();
void mySlot(int x);
在上面的定义中,slots是 QT 的关键字。接下来的一行void mySlot() 定义了槽mySlot,这个槽没有携带参数;接下来的一行void mySlot(int x)定义了重名槽 mySlot,但是它携带一个整形参数。槽的返回类型都是void。
3.1.3 信号与槽的关联
信号是一个特定的标识,槽就是一个函数,却与一般函数不同,槽函数能和信号关联,也能够被直接调用。Qt利用信号与槽(signals/slots)机制取代传统的callback来进行物件之间的沟通。当操作事件发生的时候,物件会发送出一个信号(signal);而槽(slot)则是一个函式接受特定信号并且执行槽本身设定的动作。
在程序中,使用QObject::connect()函数来将信号与槽关联。信号与槽的关联关系有以下几种模式:
(1) 一个信号和槽关联。
(2) 一个信号和多个槽关联。
(3) 多个信号和一个槽关联。
一个信号与多个槽关联的情况下,当发出信号的时候,与此信号关联的各个槽之间以任意的先后顺序立即执行,即:槽函数之间的执行顺序是随机的,与信号和槽关联的先后没有关系。同时,信号和槽机制是完全和GUI事件完全独立的,槽函数独立循环。
信号在任何执行点上皆可发射,甚至可以在槽里再发射另一个信号,信号与槽的连结不限定为一对一的连结,一个信号可以连结到多个槽或多个信号连结到同一个槽,甚至信号也可连接到信号。
3.1.4 Qt信号和槽机制的优点
信号和槽机制有以下优点[10]:
(1) 类型安全的。以往的callback缺乏类型安全,在呼叫处理函数时,无法确定是传递正确型态的参数。信号和其接受的槽之间传递的资料型态必须要相符合,需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数与接11
受该信号的槽的参数类型和参数个数相同;不过,一个槽的参数个数是可以少于信号的参数个数,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器会报错。信号和槽可接受任何数量、任何型态的参数,所以信号与槽机制是完全类型安全。
(2) 松散耦合的。Qt信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是哪个对象的哪个槽需要接收它发出的信号,它需要做的是在适当的时间发送适当的信号就可以了,而不需要知道也不必关心它的信号有没有被接收到,更不需要知道是哪个对象的哪个槽接收到了信号,也就是说一个信号可以呼叫所有可用的槽。同样的,对象的槽也不知道是哪些信号关联到了自己。而一旦关联信号和槽,Qt就保证了合适的槽得到调用。即使关联的对象在运行时被删除,应用程序也不会出现崩溃。此机制会确保当在“连接”信号和槽时,槽会接受信号的参数并且正确执行。
(3) 信号与槽的效率问题。信号和槽机制增强了对象间通信的灵活性,然而也损失了一些性能。与callback相比较,信号与槽有些慢。原因有:需要定位接受信号的对象;安全的遍历所有的关联(如:一个信号关联到多个槽);多线程,信号可能排队等待。但是,与创建堆对象时的new操作实例化对象,以及删除堆对象的delete操作相比较,信号与槽的代价只是他的很少的一部分。信号和槽带来的性能损耗,对实时应用程序是很小的。相对于信号与槽带来的灵活与简便,这点性能损失是可以接受的。
3.2 函数
基于Linux的播放器使用了Phonon多媒体框架和Qt框架的相关函数,现简要介绍如下。
3.2.1 Phonon媒体框架
Phonon 有三个基本概念:媒体对象、接收端和路径,图3-1是Phonon架构图[7]:
图3-1 Phonon框架
图3-1是Phonon的架构图。Media Object(媒体对象)管理一个Media Source(媒12
体源),比如一个音乐文件;它提供了简单的播放控制,比如开始、停止和暂停播放。Sink是输出多媒体,通常是一个播放的装置(如声卡),且只接受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所示:
图3-3 详细Phonon框架
图3-3是Phonon的详细框架图,由图可知Phonon框架实质上分4个部分:程序、Phonon库、Phonon后端插件(phonon_backend)、真正的后端。Phonon其实什么都不干,他只是提供了一套API接口,这套接口可以给你的程序调用,同时也是给编写后端插13
件提供一个规范。同样,Phonon库也不知道,他只管搜索符合自己规范的插件。并告诉这些插件,现在程序发出的指令是什么,从插件返回给程序现在的媒体状态和信息。而后端才是实际进行读入媒体、解码并且播放的部分,他们和后端插件是一一对应的。后端可以是任何形式,只要你写出了相应的后端插件。
Phonon函数成员如图3-4所示[7]:
图3-4 主要的Phonon类
播放器主要使用的Phonon类及使用方法介绍如下[11]:
(1) Phonon::MediaObject Class
MediaObject主要提供一个能够处理媒体播放的类。
MediaObject可说是处理多媒体文件最基本的一部份,它接受并管理来自于MediaSource的媒体文件。而媒体播放、暂停与停止都是由它来控制;而在此之前,mediaObject必须要与output node连接,如早先所讲的,这个nodes主要将媒体输出至底层的硬件,例如声卡或显卡等,而所需要的output node则是根据多媒体的内容而所不同,目前Phonon有两种output node:
1 AudioOutput-声音播放。
○2 VideoWidget-影像播放。
○14
用法:
Phonon::MediaObject *mediaObject=new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource("/mymusic/"));
(2) Phonon::AudioOutput Class
AudioOutput类别主要是用来把多媒体的声音送到声音输出装置。所以它能够经由类似喇叭等输出装置来播放声音,多媒体资料的来源必须要经过Phonon::createPath()与MediaObject连接。
在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 class
SeekSlider类别提供一个可滑动的slider来设定多媒体串流播放的位置。所以它会连接到MediaObject,并控制串流目前的位置。用法:
Phonon::SeekSlider *seekSlider = new Phonon::SeekSlider(this);
seekSlider ->setMediaObject(mediaObject);
seekSlider ->show();
(5) Phonon::VolumeSlider Class
VolumeSlider提供可以控制声音装置音量的类。用法其实与上面的SeekSlider类似,使用范例如下:
Phonon::VolumeSlider *volumeSlider = new Phonon::VolumeSlider;
volumeSlider->setAudioOutput(audioOutput);
3.2.2 Qlist容器类
QList不是Phonon的类成员,而是Qt的一个类库,它是一种表示链表的模板类。
Qlist
行快速索引,还提供了快速插入和删除等操作。QList
很适合使用Qlist来存储播放器的播放列表,用法:
QList
3.3 播放器的基本功能
在使用Phonon多媒体框架前,需要在项目额外设定使用Phonon模组,必须要在qmaek project file(即.pro)中加入:QT += phonon,将Phonon库添加进项目[6]。
3.3.1 建立媒体对象
首先实例化使用的Phonon类:
mediaObject =new Phonon::MediaObject(this);
audioOutput =new Phonon::AudioOutput(Phonon::MusicCategory,this);
seekSlider = new Phonon::SeekSlider(ui->progresswidget);
volumeSlider=new Phonon::VolumeSlider(ui->Volumewidget);
将媒体对象(mediaObject)和音频输出设备(audioOutput)使用函数Phon
on::createPath()连接起来:
Phonon::createPath(mediaObject, audioOutput);
将进度条seekSlider与媒体对象mediaObject进行关联,使得歌曲播放的进度和进度条,同时将音量控制条与音频输出设备连接:
seekSlider->setMediaObject(mediaObject);
volumeSlider->setAudioOutput(audioOutput);
最后,将进度条和音量控制条显示在主窗口中:
seekSlider->show();
volumeSlider->show();
3.3.2 播放控制
系统实现的功能如图3-5所示[12]:
16
图3-5 播放器的基本功能
图3-5是播放器的基本功能截图,包括:暂停、播放等功能。
(1) 播放
当点击播放按键时,播放器播放用户选中的歌曲,同时显示播放歌曲的长度和当前播放进度信息[13]。
代码实现:mediaObject->play();
显示歌曲长度,mediaObject在播放过程中发出tick(qint64)信号 ,将mediaObject的tick(qint64)信号和自定义槽showTime(qint64)关联。能够实现将歌曲长度和播放进度,在显示界面显示出来。
代码实现:
connect(mediaObject,SIGNAL(tick(qint64)),this,SLOT(showTime(qint64));
void MainWindow::showTime(qint64 time)
{
qint64 temp = mediaObject->totalTime();
QTime totalTime(0,(temp / 60000) % 60,(temp / 1000) % 60);
QTime curTime(0,(time / 60000) % 60,(time / 1000) % 60);
this->ui->totalTimeLable->setText(tr("%1 ") .arg(ng("mm:ss")));
this->ui->curTImeLabel->setText(tr("%1 ") .arg(ng("mm:ss")));
}
17
(2) 暂停
当播放器处于播放状态是,想暂停播放歌曲,可以点击暂停按键时,这时将暂停播放,再次点击此按键,将继续从当前歌曲暂停处播放。
代码实现:mediaObject->pause();
(3) 停止
当播放器处于播放、停止状态时,点击停止按键时,将停止对当前歌曲的播放。
代码实现:mediaObject->stop();
(4) 下一首
如果用户点击下一首按钮,系统会判断当前播放项是否是列表最后一项,如果是,同时允许循环播放,会跳转到第一首,如果不是则会提示用户。
代码实现:
int index = sourceList。indexOf(mediaObject->currentSource()) + 1;
mediaObject->stop();
mediaObject->setCurrentSource((index));
mediaObject->play();
(5) 上一首
如果用户点击上一首按钮,系统会判断当前播放项是否是列表第一项,如果是,同时允许循环播放,会跳转到最后一首,如果不是会提示用户。
代码实现:
int index = f(mediaObject->currentSource())-1;
mediaObject->stop();
mediaObject->setCurrentSource((index));
mediaObject->play();
(6) 播放进度的拖动
如果用户想自己选择播放进度,可以拖动进度条(seekSlider),由seekSlider自动调整到用户选择的播放进度。
(7) 打开文件
在播放器启动后,播放器的播放列表默认是空的,需要用户手动添加播放列表,此时用户可以通过打开按钮,弹出打开系统默认的打开文件对话框选择歌曲文件。
代码实现:
18
QStringList files=QFileDialog::getOpenFileNames(this,tr("Selec Files to play ") ,
defaultOpenDir, tr("*.mp3"));
int index=();
foreach(QString file,files)
{
(file);
mediaObject->setQueue(sourceList);
}
(8) 双击播放
在播放列表中显示着当前的播放播放列表,如果用户想播放其中的某一首歌曲,可以通过双击该项实现歌曲的播放。将播放列表双击信号与自定义槽doubleClicked(int
row, int )关联。
代码实现:
connect(this->ui->musicTable, SIGNAL(cellDoubleClicked(int,int)),this,
SLOT(doubleClicked(int,int)));
void MainWindow::doubleClicked(int row, int )
{
mediaObject->setCurrentSource(sourceList[row]);
}
(9) 双击系统图标
为了方便用户的使用,当用户双击播放器系统托盘图标时,可以实现播放器界面的显示与隐藏。将系统托盘trayIcon的activated()信号与槽iconActivated(QSystemTrayIcon ::ActivationReason)相关联。
代码实现:
connect(this->trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason)
{
19
case QSystemTrayIcon::DoubleClick:
if(this->isHidden())
{
this->showNormal();
this->setWindowState(Qt::WindowActive);
}
else
this->hide();
break;
}
}
这样当用户在双击系统托盘图标后,就会实现最小化和还原。
3.4 播放器设置
基于Linux的音乐播放器,在系统文件中存在一个系统配置文件:,用于保存播放器的相关配置信息。当用户选择Options选项时,会弹出播放器设置界面,对播放器进行一些设置。如果用户选择OK按钮,将保存设置。此时系统将修改配置文件。
播放器的设置界面如图3-6所示:
图3-6 播放器设置界面
20
3.4.1 QSettings介绍
Qsettings是Qt4.0提供的一个读取配置文件的类,提供独立于平台的程序设置,在windows平台,它提供了ini文件读些,注册表读写的功能,而且使用也非常简单。Qsettings的API是基于Qvariant,Qvariant是一种数据类型的集合,它包含了大部分通常的Qt数据类型,比如QString,QRec,QImage,等等。
函数原型:
QSettings(const QString& fileName,Format format, QObject * parent= 0);
其中QSettings::Format有两种:
(1) QSettings::NativeFormat在windows平台可以读写windows注册表;
(2) QSettings::IniFormat可以读写ini格式的配置文件。
在Unix/X11平台下这两个Format效果是一样的[14]。
3.4.2 QSettings的使用
在本文中使用QSettings类来实现播放器设置[15],将结果保存在系统文件中,配置文件内容如图3-7所示:
图3-7 文件
(1) minimizeToTray是否允许播放器最小化到托盘;
(2) defaultOpenDir默认添加文件打开目录;
(3) skinPath界面背景图像路径。
首先初始化 QSettings指针变量:
QSettings *musicSettings = new QSettings(“./config/”,QSettings::IniFormat);
如果Minimize被选中,则修改文件 minimizeToTray=true,
musicSettings->setValue("minimizeToTray","true");
当用户点击open按钮,选择默认打开文件目录时,首先获取默认打开目录,将打开文件对话框设置为此目录,然后弹出打开文件对话框,获取用户选择的文件目录,并且将新目录输入文本框中,然后修改配置文件 defaultOpenDir项的值。
Qstring oldOpenDir=musicSettings->value("defaultOpenDir").toString();
QString defaultOpenDir=QFileDialog::getExistingDirectory(this,"Select the default file
21
directory),oldOpenDir);
this->ui->filepathLEdit->setText(defaultOpenDir);
点击ok按钮,在于ok信号相关联的槽函数将执行,保存各项设置:
musicSettings->setValue("defaultOpenDir",this->ui->filepathLEdit->text());
3.4.3 QSettings的乱码问题
由于汉字的存储不同于英文字符,所以不能使用ASCII字符集进行编码,在使用QSettings的过程中,会出现乱码的情况。如图3-8所示:
图3-8打开文件路径存储乱码
在Default open path中,路径为:/media/E/音乐,但是当写入的defaultOpenDir时,出现了明显的乱码现象。为了让汉字不出现乱码情况,必须设置QSettings的编码方式:musicSettings->setIniCodec(QTextCodec::codecForName("UTF-8"));
正常显示的结果如图3-9所示:
图3-9打开文件路径存储正常显示
3.5 播放器界面设计
基于Linux的音乐播放器,系统配置文件:,用于保存系统的相关配置信息,系统启动的时候,会读取配置文件获取必要的界面配置信息,根据相关的配置信息设置播放器。
3.5.1 设置背景
根据配置文件获取设置图标路径,并且初始化图标
Qstring skinPath=musicSettings->value(“skinPath”).toString();
pauseIcon = QIcon(skinPath+“”);
运行效果如图3-10所示:
22
图3-10 播放器运行效果图
图3-10是播放器的运行效果图。窗体顶端是:最小化、关闭按钮,下方是“音量控制条”,再下面一排是:停止、上一曲、播放、下一曲、打开按钮,然后是:播放时间、播放进度条和歌曲长度,最下面是添加文件后的播放列表。
3.5.2 设置系统托盘图标
为程序添加体统托盘图标和上下文菜单:
QIcon icon=QIcon("./image/");
parent->setWindowIcon(icon);
parent->trayIcon = new QSystemTrayIcon(parent);
parent->trayIcon->setIcon(icon);
parent->trayIcon->setToolTip("music play");
parent->trayIcon->show();
QAction *minimizeAction = new QAction(QObject::tr("Minimize"), parent);
parent->trayIconMenu = new QMenu(parent);
parent->trayIconMenu->addAction(minimizeAction);
运行后右击托盘图标弹出菜单包含五个选项。其中“Options”选项提供播放器的设置功能;“Minimize”、“Restoration”选项用于实现播放器的最小化和恢复功能;“Show
History”选项用来实现显示播放历史的功能;“Quit”选项实现退出程序功能。
23
4 系统测试
4.1 测试介绍
软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件品质,并对其是否能满足设计要求进行评估的过程。
软件测试(Software Testing)是发现软件中错误和缺陷的主要手段,是保证软件质量的法宝之一。在一般情况下,软件测试过程与整个软件开发过程基
本上是平行进行的。当然,测试计划应该在需求分析阶段就已经开始制定了。
随后的工作则会伴随着软件开发的过程逐步展开[16]。
4.1.1 软件测试的目的
对于软件测试的目的,提出过以下观点:
(1) 测试是为了发现程序中的错误而执行程序的过程。
(2) 好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案。
(3) 成功的测试是发现了至今为止尚未发现的错误的测试。
总体来说,软件测试的目标是,以最小的工作量和成本尽可能多的发现软件系统中的潜在的各种错误和缺陷,以保证软件系统的正确性和可靠性[17]。
4.1.2 测试的方法
软件测试一般分为白箱测试和黑箱测试[17]。
黑箱测试:主要用于测试应用程式的功能,而不是其内部结构或运作。测试者不需具备应用程式的程式码、内部结构和编程语言的专门知识。测试案例是依应用系统应该做的功能,照规范、规格或要求等设计。测试者选择有效输入和无效输入来验证是否正确的输出。
此测试方法可适合大部分的软件测试,例如单元测试(unit testing)、整合测试(integration testing)以及系统测试(system testing)。
白箱测试:主要用于测试应用程式的内部结构或运作,而不是测试应用程式的功能。在白箱测试时,以编程语言的角度来设计测试案例。测试者输入资料验证资料流在程式中的流动路径,并确定适当的输出,类似测试电路中的节点。
白箱测试可以应用于单元测试(unit testing)、整合测试(integration testing)和系统的软件测试流程,可测试在整合过程中每一单元之间的路径,或者主系统跟子系统中的测试。
24
4.2测试设计
当程序开发完成以后,都需要进行软件测试,这样才能发现开发过程中存在的各种错误和缺陷。无论是黑盒测试还是白盒测试,关键都是选择高效的测试用例。黑盒测试和白盒测试都有各自的优缺点,构成互补关系[17]。
本文选择黑盒测试方法,主要注重于测试播放器的功能需求。对播放器功能不对、性能错误、初始化和终止错误这几类错误进行重点测试。测试用例由测试输入数据和与之对应的输出结果组成,测试用例的输入数据不仅包含合理的输入条件,也包含不合理的输入条件。
4.2.1 添加文件
本播放器实现了文件的添加,能够将文件添加到播放列表中。用户在主界面点击打开文件按钮,或者在播放列表中选择添加歌曲选项时,播放器将弹出“Select Files”打开文件对话框,实现添加文件的功能。如图4-1所示:
图4-1 播放器主界面与打开文件对话框
图4-1是播放器主界面和打开文件对话框截图。如图所示,用户点击“选中想要添加的歌曲。
”按钮,
图4-2 打开文件后
图4-2是用户成功添加文件后的播放器截图。如图所示,用户选择的歌曲已经成功25
的添加进播放列表中。如果是首次添加歌曲,播放器默认选中播放列表的第一首歌曲,当用户点击“”按钮时,将播放选中的歌曲。
结论:播放器能够顺利的添加文件到播放列表中。
4.2.2 删除歌曲
当用户在在播放列表中右击,在弹出的菜单中选择删除功能时,将会删除被选中的歌曲名。
图4-3 播放列表
图4-3是播放器的播放列表截图。如图所示,用户选中歌曲“斯琴高丽的伤心”,然后右击,在菜单中选择“删除此首歌曲”,将其从播放列表中删除,同时播放器能够自动刷新播放列表。
图4-4 删除歌曲后
图4-4是删除选中歌曲后的播放列表截图。如果用户在弹出的右击菜单中选择删除所有功能,将会删除播放列表中的所有歌曲,播放器自动刷新删除后的播放列表。
图4-5 删除全部歌曲后
图4-5是删除全部歌曲后的播放列表截图。如图所示,播放列表内的歌曲已经全部删除。
结论:播放器能够完成删除功能。
4.2.3 播放歌曲
当用户点击播放按钮时,如果存在播放文件,将播放选择的文件,如果不存在文件,则会给出提示信息。如果用户点击下一首,则会跳转到播放列表的下一个文件播放。在当前播放歌曲完成是,会自动跳转到播放列表的下一首歌曲播放。
26
图4-6 播放状态
图4-6是用户添加歌曲后处于播放状态的播放器截图。如图所示,用户点击“”按钮,播放器将播放“Shero”这首歌曲。在播放“Shero”这首歌曲的过程中,用户点击“”,播放器将跳转到播放列表的下一首歌曲播放“爱过来”。如图4-7所示:
图4-7 点击下一首
当用户添加文件到播放列表中后,如果由于某种原因(如文件删除、文件重命名)无法找到文件时,播放器将弹出提示信息。
图4-8 播放文件不存在
图4-8是播放文件不存在时播放器给出的提示信息截图。如图所示,将文件添加进播放列表,然后在磁盘上删除“红日”文件,当播放“红日”文件时,由于无法找到歌曲文件,播放器弹出提示信息“Could not locate media source”。
27
结论:播放器能够播放歌曲,播放结束时能够自动跳转到列表下一首歌曲,当文件不存在时,能够给出提示。
4.2.4 测试结果
由以上测试结果可以看出,系统能够顺利的完成歌曲列表的添加,删除操作。同时,当播放器处于运行状态时,能够很好的进行歌曲的切换、声音的控制、进度的拖动等。在播放过程中,如果播放的文件出现各种问题(如:文件已删除),都能够进行良好的判断,系统设置的快捷键能够很好的对播放器进行操作。
4.3 总结
通过对软件的各项功能的测试,基于Linux的音乐播放器,能够流畅运行,各项功能能够正确的执行。
28
结 论
本文是在Linux操作系统下,使用Qt和Phonon应用程序框架,使用C++语言编码实现。从系统分析到概要设计,再到详细设计,实现了一个简易的音乐播放器。
实现了音乐播放器的基本功能,包括“播放”、“暂停”、“上一曲”、“下一曲”、“显示播放日志”等功能,能够满足用户的基本需求。同时,根据实际需要进行了部分功能的拓展,增加了“提示”功能,在用户关闭播放器的时候能够进行提示;增加了“最小化到托盘功能”,在双击播放器界面时,能够将播放器主界面最小化。
经过对播放器的测试表明,本播放器能够流畅地运行,并能很好地实现各项功能,达到了设计预期的效果。
29
参考文献
[1] . Operating system Family share for 11/2011[DB/OL]. www. top500.
org/charts/list/38/osfam. [2011-11]
[2] 杨琳. 基于Linux内核的多功能媒体播放器的设计与实现[D]. 北京:北京邮电大学,2005:38-40
[3] William Stallings. Operating Systems Internals and Design Principles, Fifth Edition[M].
Publishing House of Electronics Industry, 2006
[4] 刘海燕,荆涛. Linux系统应用与开发教程(第二版)[M]. 北京:机械工业出版社,2010
[5] 王奇. 基于嵌入式Linux的多媒体音乐播放器的设计与实现[J]. 信息技术,2009,(6):102-104
[6] 蔡志明,卢传富,李立夏. 通Qt4编程(第2版)[M]. 北京:电子工业出版社,2012
[7] Summerfield, Mark. Advanced Qt Programming: Creating Great Software with C++ and
Qt 4[M]. Prentice Hall, 2011
[8] 朱浩悦,张红祥. 基于QT的视频媒体播放器的设计与实现[J]. 科技信息,2011,(30):274-275
[9] 倪继利. Qt及Linux操作系统窗口设计[M]. 北京:电子工业出版社,2006
[10] 曲威. 基于嵌入式Linux的网络MP3播放器的设计与实现[D]. 四川:西南交通大学,2010:9-10
[11] Sigrid. Phonon multimedia framework [DB/OL]. /doc/ qt-4.8/
. [2012-05]
[12] 汪永好,周延森. 基于嵌入式Linux的MP3播放器的设计与实现[J]. 计算机工程与设计,2009,30(17): 3948-1949
[13] Bjarne Stroustrup. Programming Principles and Practice Using C++ [M]. China Machine
Press, 2009
[14] 成洁,卢紫毅. Linux 窗口程序设计:Qt4 精彩实例分析[M]. 北京:清华大学出版社,2008
[15] Blanchette.J, Summerfield.M. C++ GUI Programming with Qt 4, Second Edition[M].
Prentice Hall, 2008
30
[16] 王森林. 基于嵌入式Linux的多媒体播放器设计[D]. 四川:西南交通大学,2007:52-53
[17] 许家珆. 软件工程-方法与实践[M]. 北京:电子工业出版社,2007
31
致 谢
我的毕业设计终于完成了,虽然与心目中的有一定差距,但却是我自己不断地查阅资料、思考和动手的结果。经过半年的准备与实践,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。
在这里首先要感谢黎忠文老师,在与黎老师相处的日子里,她深深的影响了我。每次学院有什么信息她总是不辞辛苦的通知我们,让我们能够及时了解学院的信息。在指导我们毕业设计过程中,老师严格要求我们,细心指导我们完成毕业设计。
其次要感谢其他的每一位科任老师的指导和建议,在我们的本次设计中,你们勤奋工作,为我们克服了许多我们曾经碰到的困难来帮助我们完成此次毕业设计,给了我很大的帮助。如果没有你们的帮助,这次设计的完成将变得更加困难。
同时感谢成都大学,四年来的辛勤培养,没有学校,就没有我们的今天。在成大的四年本科学业就即将结束,未来将继续踏上学业的征程,送上最真心的祝福,祝愿成都大学未来更美好,明天更辉煌。
最后,要感谢我的父母。无论在什么时候,都有来自他们鼓励与关心,让我在任何时候都不放弃希望,坚强前行!
32
版权声明:本文标题:基于Linux的音乐播放器设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1703436290a451306.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论