Linux下图形界面mp3播放器的实现.docx

上传人:b****6 文档编号:7320170 上传时间:2023-05-11 格式:DOCX 页数:34 大小:220.24KB
下载 相关 举报
Linux下图形界面mp3播放器的实现.docx_第1页
第1页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第2页
第2页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第3页
第3页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第4页
第4页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第5页
第5页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第6页
第6页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第7页
第7页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第8页
第8页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第9页
第9页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第10页
第10页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第11页
第11页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第12页
第12页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第13页
第13页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第14页
第14页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第15页
第15页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第16页
第16页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第17页
第17页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第18页
第18页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第19页
第19页 / 共34页
Linux下图形界面mp3播放器的实现.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Linux下图形界面mp3播放器的实现.docx

《Linux下图形界面mp3播放器的实现.docx》由会员分享,可在线阅读,更多相关《Linux下图形界面mp3播放器的实现.docx(34页珍藏版)》请在冰点文库上搜索。

Linux下图形界面mp3播放器的实现.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2