Linux下图形界面mp3播放器的实现.docx
《Linux下图形界面mp3播放器的实现.docx》由会员分享,可在线阅读,更多相关《Linux下图形界面mp3播放器的实现.docx(34页珍藏版)》请在冰点文库上搜索。
Linux下图形界面mp3播放器的实现
Xx大学
本科生毕业论文(设计)
题 目
Linux下图形界面mp3播放器的实现
姓 名
xxx学号xxx
院 系
计算机科学学院
专 业
网络工程
指导教师
xxx职称讲师
200年月日
xxx教务处制
目录
摘要1
关键词1
Abstract1
Keywords1
引言2
1主要相关技术介绍3
1.1Linux的设计和用户界面3
1.2Linux下的编程3
1.3Makefile文件的编写3
1.4关于GTK+4
1.5GStreamer简介5
1.6回调函数5
1.7本程序的开发环境和使用到的一些工具6
2编译环境的搭建和检测6
2.1基本编译环境的搭建7
2.2安装GTK/GNOME编译环境7
2.3安装GStreamer编译环境8
3程序的设计目标和分析8
3.1程序设计目标8
3.2需求分析9
4程序的详细设计及编码10
4.1程序文件的组织10
4.2main.c文件10
4.3图形界面的结构11
4.4PLAY按钮12
4.5菜单13
4.6mp3文件的选取与文件名的显示14
4.7GStreamer和文件的播放15
4.8使用滑块来控制的播放进度18
4.9实现的一点补充20
5编译以及以后的工作21
5.1Makefile文件的编写21
5.2编译,安装,运行,卸载21
5.3制作源代码安装包22
结束语22
致谢23
参考文献:
23
Linux下图形界面mp3播放器的实现
网络工程专业学生xxx
指导教师xxx
摘要:
Linux作为自由和开源软件领域中最出色的例子,人们更多地了解其在服务器方面的应用。
不过,由于Linux具有可移植度高、自由、免费等特性,最近几年,它在移动设备和个人电脑领域的应用也越来越广泛。
鉴于以上应用领域对用户界面友好性方面的要求,几乎所有的此类应用都是采用图形用户界面。
基于GTK的GNOME,是Linux领域中最主要的桌面环境。
而GTK本身,则是创造图形用户界面的最流行的跨平台GUI工具箱之一。
这里将通过一个使用GTK和GStreamer技术的简单mp3播放器的实现,详细描述Linux环境下的图形界面编程技术。
关键词:
Linuxmp3播放器GTKGStreamerC语言
TheImplementationofGUIMp3PlayerinLinux
StudentmajoringinNetworkEngineeringxxx
Tutorxxx
Abstract:
Asoneofthemostdistinguishedexamplesoffreeandopensourcesoftwarecollaboration,Linuxispredominantlyknownforitsapplicationinservers.However,Linuxeditionsinstalledonbothmobiledevicesandpersonalcomputershavebecomeincreasinglycommonplaceinrecentyears,owinglargelytoitshighlyportabilityandhighdegreeoffreedom.Inviewoftheimportanceofuserfriendlyoperation,almostalloftheseeditionsarebasedonGraphicalUserInterface(GUI).BasedonGTK,oneofthemostpopularcross-platformwidgettoolkitsforcreatinggraphicaluserinterfaces,Gnomeisadominantdesktopenvironment—theGUIwhichrunsontopofacomputeroperatingsystem.ThispapermainlyfocusedontheimplementationofasimpleGUIinterfacedmp3playerusingGTKandGStreamertechnologyunderGnomeenvironment,willillustratedetailedstepsonLinuxGUIprogramming.
Keywords:
Linux;mp3Player;GTK;GStreamer;C
引言
随着半导体技术的高速发展,个人电脑和智能型掌上设备价格迅速下降,因而普及到学习、工作、生产等各个方面。
然而,与硬件价格的迅速下降相比,软件价格不仅没有下降,反而有上升的趋势。
一个典型的例子是,14年前,Windows95面世时,个人电脑硬件的价格在一万元以上,Windows95操作系统本身,只有一千多元;将于2009下半年发布的Windows7的价格预计却仍维持在一千元以上(终极版为两千元以上),而个人电脑硬件的价格却下降到两千元左右。
由此可见,软件成本已经成为信息化社会发展中不可忽视的一项支出。
降低软件成本,最有效的办法就是使用和推广自由和开源软件,使用可移植性高的平台,做到一次开发,多处使用。
Java就是一个成功的例子。
Java初期的卖点是可移植性高,目前在保持这个优势的同时,Java克服了速度方面的缺陷,取得了极大的成功。
而现在,Sun公司又推出了开源版的Java虚拟机,准备将Java的核心技术开源化。
但Java不是万能的,Java的适用范围有限。
在个人电脑领域和嵌入式系统的操作系统领域,我们有Linux。
Linux是自由软件基金会的杰作,当然也就是完全开源的,完全免费的,另外,它还是容易移植的。
Netcraft报告说,截止2006年9月,全球10大最可靠的因特网虚拟主机供应商中,有8家在他们的Web服务器上使用Linux。
在超级计算机领域,Linux成绩更是耀眼:
截止2008年12月,最快的500台超级计算机中,有439台使用各种Linux发行版本。
不过,在个人电脑和智能型掌上设备领域,Linux的成果就没有那么显著了。
我们看到,使用Windows或者Mactonish的PC,使用Symbian操作系统的诺基亚智能手机,使用移动型Mactonish的苹果iPhone,使用微软嵌入式Windows的掌上电子设备,占据了绝大部分的市场。
但是,凭借Linux的自由和免费,以及开发产品可移植性高的优势,Linux在硬件价格逐渐下降的过程中会逐渐显现出优势。
正如大家看到的,市场已经对此做出反应。
就本平台下的程序开发而言,与Windows相比,有国内开发人员少、中文相关学习材料不够的丰富、存在大量高质量的开源程序和软件,便于模仿学习、整个操作系统都是自由软件、所有源代码都可得到等特点。
由此可见,由于操作系统源代码的开源和大量开源程序的存在,开发人员自身开发水平提高的余地比在Windows平台下更大,并且更容易参与到国际开源项目中,提升自己的英文水平。
而GTK和GStreamer分别作为图形界面编程和媒体框架的两大技术,在Linux系统中有重要地位。
现在,也有很多把两者结合起来的很好的产品,比如著名的TotemMoviePlayer和RhythmboxMusicPlayer等,但网上并没有推出一个简易并融合了这两大技术的产品。
基于以上各方面的考虑,我将实现一个“Linux平台下的图形界面mp3播放器”作为毕业论文的课题。
开发的过程将涉及到Linux软件开发的各个方面,有助于提升个人整合项目的水平,并为Linux社区的发展做出贡献。
本文将结合GTK和GStreamer两大技术,同时使用Linux中几个代表性的软件,如:
Gcc编译器,make等,详细阐述如何制作一个简单的mp3播放器。
1主要相关技术介绍
1.1Linux的设计和用户界面
基于Linux内核的系统是一种模块化的类Unix系统。
它继承了Unix在上世纪70、80年代发展起来的基本设计原则。
这种系统使用单内核(与此相对应的是使用微内核的Windows)来处理进程控制、网络连接、外设和文件访问等应用。
设备驱动和内核直接集成在一起。
与内核交互的单独项目提供了系统的高级别功能。
GNU用户区(userland)是大多数基于Linux系统的重要组成部分,它提供了最多的C库的常用实现,比如shell和一些其它的Unix工具。
这些工具可以处理一些基本任务。
基于Linux的系统可以用命令行(CLI)、图形用户界面(GUI通常也是系统的默认设置)等方式进行控制。
在嵌入式设备上,也可以用设备本身的控制器进行控制。
在桌面系统上,虽然存在很多图形用户界面,但GNOME、KDE和Xfce是其中最流行的。
大多数流行的用户界面运行于XWindow系统之上,它提供了网络透明性,可以让一台机器上的图形界面来控制另一台机器上运行的程序。
当然,它也可以控制本机上的程序,这就是Linux图形用户界面的实现策略。
也就是说,天生就考虑到了远程控制。
用远程控制的思想来操纵本机上的程序,这对于Linux在大规模集群中的应用非常重要。
传统的Linux和某些低端嵌入式产品使用命令行的方式来控制,这与本文无关,不再介绍。
1.2Linux下的编程
大多数Linux发行版支持几十种编程语言。
对于Linux用户程序和Linux操作系统本身来说,最常用的工具是同样的GNU工具链,它包括GNU编译器集合(GNUCompilerCollection,GCC)和GNUbuildsystem。
Linux内核本身就是使用GCC编译的。
GCC支持的语言非常广泛,其中就包括Ada、C、C++、Java和Fortran,但最重要的是C。
GCC的原名叫做GNUCCompiler,是RichardStallman专门为C语言开发的自由编译器。
本文中的程序也将完全基于C语言。
大多数发行版也包括了对Perl、Ruby、ython等动态语言的支持,还支持一些不大广泛使用的语言,这里的一个例子是通过Mono项目提供了对C#的支持。
许多Java虚拟机和开发包也可以在Linux上使用,包括原版的SunMicrosystemJVM(HotSpot),以及IBM的J2SERE,还有很多开源的项目例如Kaffe[1]。
两个开发图形用户界面程序的主要框架是GNOME和KDE。
这两个项目分别基于GTK和Qtwidgettoolkits。
GTK和Qtwidgettoolkits也可以单独使用(本文中就是单独使用GTK,而不依赖于GNOME环境)。
这两种框架都支持多种开发语言。
[2]
Linux中还有很多集成开发环境,如Anjuta、ode:
:
Blocks、Ecpse、Kvelop、KnoDevelop、NBeans和OmnisStudio。
但历史悠久的两大编辑器,将在本文中使用的Vim和另一种Emacs还是很流行。
1.3Makefile文件的编写
很多Windows程序员并不知道“Makefile”是什么东西,“万能的”IDE帮他们完成了程序的组织工作。
如上文所说,Linux环境中也存在很多IDE和程序管理工具,但更多的人喜欢自己动手编写规则,让编译器按照自己的想法来编译,连接源程序。
编译程序时,如果源程序只有一两个文件,那么还可以使用特定的语言编译器进行编译和链接,但是,一旦源程序文件多达数十个,甚至上百,再使用语言编译器进行编译链接则是一件很繁琐的事。
在这种情况下,就需要使用make工具,而使用make工具时则需要编写Makefile(或makefile)的文件,以指示编译器的工作。
make的主要工作是读进一个文本文件Makefile。
这个文件里主要是有关哪些文件(“target”目的文件)是从哪些别的文件(“dependencies”依靠文件)中产生的,用什么命令来进行这个产生过程。
[3]有了这些信息,make会检查磁盘上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。
(目的文件不一定是最后的可执行文件,它可以是任何一个文件。
)。
一个Makefile主要含有一系列的规则:
target...:
prerequisites...
(Tab)command
target...:
prerequisites...
(Tab)command
例如,考虑以下的Makefile:
myprog:
foo.obar.o
gccfoo.obar.o-omyprog
foo.o:
foo.cfoo.hbar.h
gcc-cfoo.c-ofoo.o
bar.o:
bar.cbar.h
gcc-cbar.c-obar.o
这是一个非常基本的Makefile——make从最上面开始,把上面第一个目的:
“myprog”做为它的主要目标(一个它需要保证其总是最新的最终目标)。
给出的规则说明只要文件“myprog”比文件“foo.o”或“bar.o”中的任何一个旧,下一行的命令将会被执行。
但是,在检查文件foo.o和bar.o的时间戳之前,它会往下查找那些把foo.o或bar.o做为目标文件的规则。
首先它找到的是关于foo.o的规则,该文件的依靠文件是foo.c,foo.h和bar.h。
因为它从下面再找不到生成这些依靠文件的规则,它就开始检查磁盘上这些依靠文件的时间戳。
如果这些文件中任何一个的时间戳比foo.o的新,命令“gcc-ofoo.ofoo.c”将会执行,从而更新文件foo.o。
接下来对文件bar.o做类似的检查,依赖文件在这里是文件bar.c和bar.h。
现在,make回到“myprog”的规则。
如果刚才那两个规则中的任何一个被执行,myprog就需要重建(因为其中一个.o文件就会比“myprog”新),因此连接命令将被执行。
到这里,使用make工具来编译程序的优势就显而易见了:
make程序完成了程序中最繁琐的检查步骤——检查时间戳。
源代码文件中的任何一个简单改变都会造成那个文件被重新编译(因为.o文件依靠.c文件),进而可执行文件被重新连接(因为.o文件被改变了)。
其实这里最大的获益是当程序员改变一个header文件的时候,不再需要记住到底是哪个源码文件依靠它。
因为所有的信息都存放在Makefile文件里,make程序会自然的帮助程序员重新编译所有那些依靠这个header文件,而其自身内容又改变了的源代码文件。
如有需要,make将对生成的.o文件再重新进行连接。
1.4关于GTK+
GTK+(本文中使用其另一个简要名称GTK)最初是GIMP的专用开发库,后来发展为类Unix系统下开发图形界面的应用程序的主流开发工具之一。
GTK是自由软件,并且是GNU计划的一部分。
GTK的许可协议是LGPL。
[4]
GTK实质上是一个面向对象的应用程序接口(API)。
尽管完全用C写成的,但它是基于类和回调函数(指向函数的指针)的思想实现的。
也提供了C++(gtkmm)、Perl、Ruby、Java和Python(PyGTK)绑定,其他的绑定有Ada、D、Haskell、PHP和所有的.NET编程语言。
还有一个名为GLib的第三个组件,包含一些标准函数的替代函数,以及一些处理链表等数据结构的函数等。
这些替代函数被用来增强GTK的可移植性,因为它们所实现的一些函数在其它Unix系统上未实现或不符合标准,比如g_strerror()。
另一些是对libc的对应函数的增强,比如g_malloc()具有增强的调试功能。
在2.0版中,GLib又加入这样一些新内容:
构成GTK类层次基础的类型系统(typesystem),在GTK中广泛使用的信号系统,对各种不同平台的线程API进行抽象而得出一个线程API,以及一个加载模块的工具。
Pango作为最后一个组件,GTK使用了它的库来处理国际化文字输出。
与其他很多部件工具箱不同,GTK并不基于Xt。
这一决策优劣互见:
优点是GTK可以应用于其他系统,其灵活性也很强;而缺点就是它无法利用以传统方法为X11定制的X资源数据库。
GTK提供不同的显示引擎使得最终用户可以定制外观和感觉。
目前已经有一些可以模仿其他流行的平台或者工具箱(例如Windows95、Motif、Qt或者NEXTSTEP)的引擎。
Glade是GTK中常用的一个界面设计工具,但是它也包含了一种描述GUI界面的XML语言,它和libglade一起工作就可以直接使用GTK和GNOME控件;新的Glade-3不再直接支持生成编程语言源代码。
由于本文界面很简单,因此将手工写出界面,而不使用Glade。
1.5GStreamer简介
GStreame是一个创建流媒体应用程序的框架。
其基本设计思想来自于俄勒冈研究生学院有关视频管道的创意,同时也借鉴了DirectShow的设计思想。
GStreame的程序开发框架使得编写任意类型的流媒体应用程序成为可能。
在编写处理音频、视频或者两者都有的应用程序时,GStreame可以简化编程者的工作。
GStreamer并不受限于音频和视频处理,它能够处理任意类型的数据流。
管道设计的方法对于实际应用的滤波器几乎没有负荷,它甚至可以用来设计出对延时有很高要求的高端音频应用程序。
[5]
GStreamer最显著的用途是在构建一个播放器上。
GStreamer已经支持很多格式的文件了,包括:
MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、mod等等。
从这个角度看,GStreamer更象是一个播放器。
但是它主要的优点却在于:
它的可插入组件能够很方便的接入到任意的管道当中。
这个优点使得利用GStreamer编写一个万能的可编辑音视频应用程序成为可能。
本文将利用基本的Gstreamer功能,实现一个mp3播放器。
由于Gstreamer的高度标准化,扩展支持其它媒体,如ogg等,非常容易。
GStreamer框架是基于插件的,有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。
所有的插件都能够被链接到任意的已经定义了的数据流管道中。
GStreamer的管道能够被GUI编辑器编辑,能够以XML文件来保存。
这样的设计使得管道程序库的消耗变得非常少[6]。
GStreamer核心库函数是一个处理插件、数据流和媒体操作的框架。
GStreamer核心库还提供了一个API,这个API是开放给程序员使用的,可以用于使用其他的插件来编写需要的应用程序。
1.6回调函数
由于本程序中完全使用C语言,而GTK和Gstreamer中为了实现信号注册等功能,大量使用了C语言的回调函数。
由于回调函数在其它语言中并不被广泛使用,因此,在此介绍一下回调函数。
回调函数是一种非显式调用的函数,它是一种将自己的地址(函数指针)传给别的函数来间接调用自己的编程方式。
在使用回调函数时必须首先定义函数指针,然后才能使用函数指针实现回调。
[7]
也就是说,回调函数是一种将变量传给别的函数的函数。
通常,它可以让系统函数调用用户函数,而不是平时我们使用的让用户函数调用系统函数。
回调函数的实例程序:
#include
#include
void*sig(intsignum)
{
printf("Igotsmeasignalofnumber%d!
\n",signum);
}
intmain(intargc,char*argv[])
{
signal(SIGUSR1,&sig);
while
(1){};
return0;
}
这里的while程序不做任何事情,只是用于拖延时间并等待用户发消息。
对于类Unix系统而言,用户可以新开一个终端,输入“kill–USR1<进程号>”来给运行中的上述程序发消息。
无论何时发送,callback函数总是会响应,并打印出”Igotsmeasignalofnumber10”,这时因为SIGUSR1在Unix中被定义为10号信号。
1.7本程序的开发环境和使用到的一些工具
因本人长期使用Ubuntu做桌面系统,本软件就是在最新的Ubuntu8.10版下开发、调试的。
Ubuntu是一个以桌面应用为主的Linux发行版,它基于Debian发行版和GNOME桌面环境,每6个月便有一个新版本问世。
由于Ubuntu具有易于使用、安全、稳定、deb包管理方式可靠性高等优点,近年来已经取代了Redhat,成为Linux世界中最重要的发行版,占有率在30%以上。
8.10的数字意义是08年10月推出的正式发行版,本人写作此文时,9.04版的正式版即将发布。
此外,本程序中使用的Gcc编译器的版本号为4.3.2。
GTK的版本号为2.0,Gstreamer为0.10.21。
本程序中使用vim编辑器来书写程序代码。
本程序中还使用了ctags和taglist插件。
ctags是一种tag制作程序,用于配合vim编辑器使用。
ctags可以制作程序中变量和函数名字的索引,配合vim,可以方便地跨越文件来查看函数或变量或结构体之类的定义,浏览大型程序时极为有效。
taglist是一种配合ctags和vim使用的插件,它可以根据ctags生成的索引表,来列出当前文件中的主要变量和函数。
2编译环境的搭建和检测
由于GTK和Gstreamer编译环境需要大量的库,通常需要首先更新或者安装一系列新版本的依赖程序或库。
同时,由于软件包之间存在着依赖关系,对软件包的版本和安装顺序都有一定的要求,一般还需要对安装后的库进行一些必要的设置才能使用库,这对于初学者来说非常复杂。
不过,Ubuntu系统中利用Synaptic软件包管理系统,只需要几条命令,Synaptic即会自动在配置好的源服务器里下载相关的软件包,并利用高效的依赖算法,自动解决繁杂的依赖性问题,自行搭建好开发环境,非常方便。
由于本文的重点在于应用此开发环境进行开发,因此,本文只介绍在Ubuntu环境中使用命令进行搭建的方式,不再涉及其它搭建方式。
2.1基本编译环境的搭建
刚装好的系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译,因为它缺少一些必须的头文件。
这里可以选择安装build-essential这个软件包来解决这个问题,方法是在Synaptic里面搜索build-essential或在终端中输入下面命令:
sudoapt-getinstallbuild-essential
安装完成后写一个C语言程序testc.c测试一下:
#include
intmain()
{
printf("HelloUbuntu!
\n");
return0