【PHP开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了PHP开源代码-Linux下图形界面mp3播放器的实现【毕业论文,绝对精品】 - 毕业设计的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
目 录摘要 1关键词 1Abstract1Key words1引言 21 主要相关技术介绍 31.1 Linux 的设计和用户界面31.2 Linux 下的编程31.3 Makefile 文件的编写31.4 关于 GTK41.5 GStreamer 简介 51.6 回调函数 51.7 本程序的开发环境和使用到的一些工具 62 编译环境的搭建和检测 62.1 基本编译环境的搭建 62.2 安装 GTK/GNOME 编译环境 72.3 安装 GStreamer 编译环境 83 程序的设计目标和分析 83.1 程序设计目标 83.2 需求分析 94 程序的详细设计及编码 104.1 程序文件的组织 104.2 main.c 文件 104.3 图形界面的结构 114.4 PLAY 按钮 124.5 菜单 134.6 mp3 文件的选取与文件名的显示 144.7 GStreamer 和文件的播放154.8 使用滑块来控制的播放进度 184.9 实现的一点补充 205 编译以及以后的工作 215.1 Makefile 文件的编写215.2 编译,安装,运行,卸载 215.3 制作源
代码安装包 22结束语 22致谢 23参考文献: 23 Linux 下图形界面 mp3 播放器的实现 网络工程专业学生 xxx 指导教师 xxx摘要:Linux 作为自由和
开源软件领域中最出色的例子,人们更多地了解其在服务器方面的应用。
不过,由于 Linux 具有可移植度高、自由、免费等特性,最近几年,它在移动设备和个人电脑领域的应用也越来越广泛。
鉴于以上应用领域对用户界面友好性方面的要求,几乎所有的此类应用都是采用图形用户界面。
基于 GTK 的 GNOME,是 Linux 领域中最主要的桌面环境。
而 GTK 本身,则是创造图形用户界面的最流行的跨平台 GUI 工具箱之一。
这里将通过一个使用 GTK 和 GStreamer 技术的简单 mp3 播放器的实现,详细描述 Linux 环境下的图形界面编程技术。
关键词:Linux mp3 播放器 GTK GStreamer C 语言 The Implementation of GUI Mp3 Player in Linux Student majoring in Network Engineering xxx Tutor xxx AsAbstract: one of the most distinguished examples of free and open source software collaboration Linuxis predominantly known for its application in servers. However Linux editions installed on both mobiledevices and personal computers have become increasingly commonplace in recent years owing largely toits highly portability and high degree of freedom. In view of the importance of user friendly operationalmost all of these editions are based on Graphical User InterfaceGUI. Based on GTK one of the mostpopular cross-platform widget toolkits for creating graphical user interfaces Gnome is a dominant desktopenvironment—the GUI which runs on top of a computer operating system. This paper mainly focused onthe implementation of a simple GUI interfaced mp3 player using GTK and GStreamer technology underGnome environment will illustrate detailed steps on Linux GUI programming.Key
words: Linux;mp3 Player;GTK;GStreamer;C 1引言 随着半导体技术的高速发展,个人电脑和智能型掌上设备价格迅速下降,因而普及到
学习、工作、生产等各个方面。
然而,与硬件价格的迅速下降相比,软件价格不仅没有下降,反而有上升的趋势。
一个典型的例子是,14 年前,Windows 95 面世时,个人电脑硬件的价格在一万元以上,Windows 95 操作系统本身,只有一千多元;将于 2009下半年发布的 Windows 7 的价格预计却仍维持在一千元以上(终极版为两千元以上) ,而个人电脑硬件的价格却下降到两千元左右。
由此可见,软件成本已经成为信息化社会发展中不可忽视的一项支出。
降低软件成本,最有效的办法就是使用和推广自由和
开源软件,使用可移植性高的平台,做到一次开发,多处使用。
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 系统中有重要地位。
现在,也有很多把两者结合起来的很好的产品, 比如著名的 Totem MoviePlayer 和 Rhythmbox Music Player 等,但网上并没有推出一个简易并融合了这两大技术的产品。
基于以上各方面的考虑,我将实现一个“Linux 平台下的图形界面 mp3 播放器”作为
毕业论文的课题。
开发的过程将涉及到 Linux
软件开发的各个方面,有助于提升个人整合项目的水平,并为 Linux 社区的发展做出贡献。
本文将结合 GTK 和 GStreamer 两大技术, 同时使用 Linux 中几个代表性的软件, 如:Gcc 编译器,make 等,详细阐述如何制作一个简单的 mp3 播放器。
21 主要相关技术介绍1.1 Linux 的设计和用户界面 基于 Linux 内核的系统是一种模块化的类 Unix 系统。
它继承了 Unix 在上世纪 70、80 年代发展起来的基本设计原则。
这种系统使用单内核 (与此相对应的是使用微内核的Windows)来处理进程控制、
网络连接、外设和文件访问等应用。
设备驱动和内核直接集成在一起。
与内核交互的单独项目提供了系统的高级别功能。
GNU 用户区(userland)是大多数基于 Linux 系统的重要组成部分,它提供了最多的 C 库的常用实现,比如 shell 和一些其它的 Unix 工具。
这些工具可以处理一些基本任务。
基于 Linux 的系统可以用命令行(CLI)、图形用户界面(GUI 通常也是系统的默认设置)等方式进行控制。
在嵌入式设备上,也可以用设备本身的控制器进行控制。
在桌面
系统上,虽然存在很多图形用户界面,但 GNOME、KDE 和 Xfce 是其中最流行的。
大多数流行的用户界面运行于 X Window 系统之上,它提供了网络透明性,可以让一台机器上的图形界面来控制另一台机器上运行的程序。
当然,它也可以控制本机上的程序,这就是 Linux 图形用户界面的实现策略。
也就是说,天生就考虑到了远程控制。
用远程控制的思想来操纵本机上的程序, 这对于 Linux 在大规模集群中的应用非常重要。
1.2 Linux 下的编程 大多数 Linux 发行版支持几十种编程语言。
对于 Linux 用户程序和 Linux 操作系统本身来说,最
常用的工具是同样的 GNU 工具链,它包括 GNU 编译器集合(GNU CompilerCollection GCC)和 GNU build system。
Linux 内核本身就是使用 GCC 编译的。
GCC 支持的语言非常广泛,其中就包括 Ada、C、C、Java 和 Fortran,但最重要的是 C。
GCC 的原名叫做 GNU C Compiler,是 Richard Stallman 专门为 C 语言开发的自由编译器。
本文中的程序也将完全基于 C 语言。
大多数发行版也包括了对 Perl、 Ruby、ython 等动态语言的支持,还支持一些不大广泛使用的语言, 这里的一个例子是通过 Mono 项目提供了对 C的支持。
许多 Java 虚拟机和开发包也可以在 Linux 上使用,包括原版的 Sun Microsystem JVMHotSpot,以及 1IBM 的 J2SE RE,还有很多
开源的项目例如 Kaffe 。
两个开发图形用户界面程序的主要框架是 GNOME 和 KDE。
这两个项目分别基于 GTK和 Qt widget toolkits。
GTK 和 Qt widget toolkits 也可以单独使用(本文中就是单独使用 GTK,而不依赖于 GNOME 环境)。
这两种框架都支持多种开发语言。
2 Linux 中还有很多集成开发环境,如 Anjuta、ode::Blocks、Ecpse、Kvelop、KnoDevelop、NBeans 和 Omnis Studio。
但历史悠久的两大编辑器,将在本文中使用的Vim 和另一种 Emacs 还是很流行。
1.3 Makefile 文件的编写 很多 Windows 程序员并不知道“Makefile”是什么东西,“万能的”IDE 帮他们完成了程序的组织
工作。
如上文所说,Linux 环境中也存在很多 IDE 和程序管理工具,但更多的人喜欢自己动手编写规则,让编译器按照自己的想法来编译,连接源程序。
编译程序时,如果源程序只有一两个文件 那么还可以使用特定的语言编译器进行编译和链接 但是 一旦源程序文件多达数十个 甚至上百 再使用语言编译器进行编译链接则是一件很繁琐的事。
在这种情况下 就需要使用 make 工具,而使用 make 工具时则需要编写 Makefile或 makefile的文件 以指示编译器的工作。
make 的主要工作是读进一个文本文件 Makefile。
这个文件里主要是有关哪些文件 ( 3“target”目的文件)是从哪些别的文件( “dependencies”依靠文件)中产生的,用什么命令来进行这个产生过程。
3有了这些信息,make 会检查磁盘上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,make 就执行相应的命令,以便更新目的文件。
(目的文件不一定是最后的可执行文件,它 )可以是任何一个文件。
。
一个 Makefile 主要含有一系列的规则:target ... : prerequisites ... Tabcommandtarget ... : prerequisites ...Tabcommand 例如,考虑以下的 Makefile :myprog : foo.o bar.o gcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.obar.o : bar.c bar.h gcc -c bar.c -o bar.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 -o foo.o foo.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 是自由软件,并且是 4GNU 计划的一部分。
GTK 的许可协议是 LGPL。
GTK 实质上是一个面向对象的应用程序接口API。
尽管完全用 C 写成的,但它是基于类和回调函数 指向函数的指针 的思想实现的。
也提供了 C 、 (gtkmm) Perl、Ruby、Java 和 Python(PyGTK)绑定,其他的绑定有 Ada、D、Haskell、
PHP 和所有的 .
NET 编程语言。
还有一个名为 GLib 的第三个组件,包含一些标准函数的替代函数,以及一些处理 4链表等数据结构的函数等。
这些替代函数被用来增强 GTK 的可移植性, 因为它们所实现的一些函数在其它 Unix 系统上未实现或不符合标准,比如 g_strerror。
另一些是对 libc 的对应函数的增强,比如 g_malloc 具有增强的调试功能。
在 2.0 版中, GLib 又加入这样一些新内容: 构成 GTK 类层次基础的类型系统 typesystem,在 GTK 中广泛使用的信号系统,对各种不同平台的线程 API 进行抽象而得出一个线程 API,以及一个加载模块的工具。
Pango 作为最后一个组件,GTK 使用了它的库来处理国际化文字输出。
与其他很多部件工具箱不同,GTK 并不基于 Xt。
这一决策优劣互见:优点是 GTK 可以应用于其他系统,其灵活性也很强;而缺点就是它无法利用以传统方法为 X11 定制的X 资源数据库。
GTK 提供不同的显示引擎使得最终用户可以定制外观和感觉。
目前已经有一些可以模仿其他流行的平台或者工具箱(例如 Windows 95、Motif、Qt 或者 NEXTSTEP)的引擎。
Glade 是 GTK 中常用的一个界面
设计工具, 但是它也包含了一种描述 GUI 界面的 XML语言,它和 libglade 一起工作就可以直接使用 GTK 和 GNOME 控件;新的 Glade-3 不再直接支持生成编程语言源
代码。
由于本文界面很简单,因此将手工写出界面,而不使用Glade。
1.5 GStreamer 简介 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 也就是说,回调函数是一种将变量传给别的函数的函数。
通常,它可以让系统函数 5调用用户函数,而不是平时我们使用的让用户函数调用系统函数。
回调函数的实例程序: include ltstdio.hgt include ltsignal.hgt void sigint signum printfquotI gots me a signal of number dnquot signum int mainint argc char argv signalSIGUSR1ampsig while1 return 0 这里的 while 程序不做任何事情,只是用于拖延时间并等待用户发消息。
对于类 Unix系统而言,用户可以新开一个终端,输入“kill –USR1 lt进程号gt”来给运行中的上述程序发消息。
无论何时发送,callback 函数总是会响应,并打印出”I gots me a signalof number 10”,这时因为 SIGUSR1 在 Unix 中被定义为 10 号信号。
1.7 本程序的开发环境和使用到的一些工具 因本人长期使用 Ubuntu 做桌面系统,本软件就是在最新的 Ubuntu 8.10 版下开发、调试的。
Ubuntu 是一个以桌面应用为主的 Linux 发行版, 它基于 Debian 发行版和 GNOME桌面环境,每 6 个月便有一个新版本问世。
由于 Ubuntu 具有易于使用、安全、稳定、deb 包管理方式可靠性高等优点,近年来已经取代了 Redhat,成为 Linux 世界中最重要的发行版,占有率在 30以上。
8.10 的数字意义是 08 年 10 月推出的正式发行版,本人写作此文时,9.04 版的正式版即将发布。
此外, GTK 本程序中使用的 Gcc 编译器的版本号为 4.3.2。
的版本号为 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 几乎什么文件都不能编译,因为它 6缺少一些必须的头文件。
这里可以选择安装 build-essential 这个软件包来解决这个
问题,方法是在 Synaptic 里面
搜索 build-essential 或在终端中输入下面命令: sudo apt-get install build-essential 安装完成后写一个 C 语言程序 testc.c 测试一下: includeltstdio.hgt int main printfquotHello Ubuntunquot return 0 编译运行: gcc -Wall testc.c -o testc ./testc Hello Ubuntu .