logo资料库

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

第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
资料共25页,剩余部分请下载后查看
引言
1 主要相关技术介绍
1.1 Linux的设计和用户界面
1.2 Linux下的编程
1.3 Makefile文件的编写
1.4 关于GTK+
1.5 GStreamer简介
1.6 回调函数
1.7 本程序的开发环境和使用到的一些工具
2 编译环境的搭建和检测
2.1 基本编译环境的搭建
2.2 安装GTK/GNOME编译环境
2.3 安装GStreamer编译环境
3 程序的设计目标和分析
3.1 程序设计目标
3.2 需求分析
4 程序的详细设计及编码
4.1 程序文件的组织
4.2 main.c文件
4.3 图形界面的结构
4.4 PLAY按钮
4.5 菜单
4.6 mp3文件的选取与文件名的显示
4.7 GStreamer和文件的播放
4.8 使用滑块来控制的播放进度
4.9 实现的一点补充
5 编译以及以后的工作
5.1 Makefile文件的编写
5.2 编译,安装,运行,卸载
5.3 制作源代码安装包
结束语
致谢
参考文献:
Xx 大学 本科生毕业论文(设计) 题 目 Linux 下图形界面 mp3 播放器的实现 姓 院 专 名 系 业 xxx 学号 xxx 计算机科学学院 网络工程 指导教师 xxx 职称 讲师 200 年 月 日 xxx 教务处制
目 录 摘要 ·········································································································1 关键词 ······································································································1 Abstract ···································································································· 1 Key words ································································································· 1 引言 ·········································································································2 1 主要相关技术介绍 ·················································································· 3 1.1 Linux 的设计和用户界面 ····································································· 3 1.2 Linux 下的编程 ················································································· 3 1.3 Makefile 文件的编写 ···········································································3 1.4 关于 GTK+ ·······················································································4 1.5 GStreamer 简介 ··················································································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.2 main.c 文件 ····················································································10 4.3 图形界面的结构 ············································································· 11 4.4 PLAY 按钮 ···················································································· 12 4.5 菜单 ···························································································· 13 4.6 mp3 文件的选取与文件名的显示 ························································ 14 4.7 GStreamer 和文件的播放 ·································································· 15 4.8 使用滑块来控制的播放进度 ······························································ 18 4.9 实现的一点补充 ············································································· 20 5 编译以及以后的工作 ············································································21 5.1 Makefile 文件的编写 ········································································21 5.2 编译,安装,运行,卸载 ································································· 21 5.3 制作源代码安装包 ·········································································· 22 结束语 ···································································································22 致谢 ······································································································23 参考文献: ···························································································· 23 1
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 Abstract:As one of the most distinguished examples of free and open source software collaboration, Linux is predominantly known for its application in servers. However, Linux editions installed on both mobile devices and personal computers have become increasingly commonplace in recent years, owing largely to its highly portability and high degree of freedom. In view of the importance of user friendly operation, almost all of these editions are based on Graphical User Interface(GUI). Based on GTK, one of the most popular cross-platform widget toolkits for creating graphical user interfaces, Gnome is a dominant desktop environment—the GUI which runs on top of a computer operating system. This paper mainly focused on the implementation of a simple GUI interfaced mp3 player using GTK and GStreamer technology under Gnome 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 Movie Player 和 Rhythmbox Music Player 等,但网上并没有推出一个简易并融合了这两大技 术的产品。 基于以上各方面的考虑,我将实现一个“Linux 平台下的图形界面 mp3 播放器”作 为毕业论文的课题。开发的过程将涉及到 Linux 软件开发的各个方面,有助于提升个人 整合项目的水平,并为 Linux 社区的发展做出贡献。 本文将结合 GTK 和 GStreamer 两大技术,同时使用 Linux 中几个代表性的软件,如: Gcc 编译器,make 等,详细阐述如何制作一个简单的 mp3 播放器。 2
1 主要相关技术介绍 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 在大规模集群中的应用非常重要。 传统的 Linux 和某些低端嵌入式产品使用命令行的方式来控制,这与本文无关,不 再介绍。 1.2 Linux 下的编程 大多数 Linux 发行版支持几十种编程语言。对于 Linux 用户程序和 Linux 操作系统 本身来说,最常用的工具是同样的 GNU 工具链,它包括 GNU 编译器集合(GNU Compiler Collection, 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 JVM(HotSpot),以及 IBM 的 J2SE RE,还有很多开源的项目例如 Kaffe[1]。 两个开发图形用户界面程序的主要框架是 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)的文件, 以指示编译器的工作。 3
make 的主要工作是读进一个文本文件 Makefile。这个文件里主要是有关哪些文件( “target”目的文件)是从哪些别的文件( “dependencies”依靠文件)中产生的, 用什么命令来进行这个产生过程。[3]有了这些信息,make 会检查磁盘上的文件,如果目 的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,ma ke 就执行相应的命令,以便更新目的文件。(目的文件不一定是最后的可执行文件,它 可以是任何一个文件。)。 一个 Makefile 主要含有一系列的规则: target ... : prerequisites ... (Tab)command target ... : prerequisites ... (Tab)command 例如,考虑以下的 Makefile : myprog : foo.o bar.o gcc foo.o bar.o -o myprog foo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.o bar.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 是自由软件,并且是 GNU 计划的一部分。GTK 的许可协议是 LGPL。[4] GTK 实质上是一个面向对象的应用程序接口(API)。尽管完全用 C 写成的,但它是基 于类和回调函数 (指向函数的指针) 的思想实现的。也提供了 C++(gtkmm)、Perl、Ruby、 Java 和 Python(PyGTK)绑定,其他的绑定有 Ada、D、Haskell、PHP 和所有的 .NET 编 程语言。 4
还有一个名为 GLib 的第三个组件,包含一些标准函数的替代函数,以及一些处理 链表等数据结构的函数等。这些替代函数被用来增强 GTK 的可移植性,因为它们所实现 的一些函数在其它 Unix 系统上未实现或不符合标准,比如 g_strerror()。另一些是 对 libc 的对应函数的增强,比如 g_malloc() 具有增强的调试功能。 在 2.0 版中,GLib 又加入这样一些新内容:构成 GTK 类层次基础的类型系统 (type system),在 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
也就是说,回调函数是一种将变量传给别的函数的函数。通常,它可以让系统函数 调用用户函数,而不是平时我们使用的让用户函数调用系统函数。 printf("I gots me a signal of number %d!\n", signum); 回调函数的实例程序: #include #include void *sig(int signum) { } int main(int argc, char *argv[]) { signal(SIGUSR1,&sig); while(1){}; return 0; } 这里的 while 程序不做任何事情,只是用于拖延时间并等待用户发消息。对于类 Unix 系统而言,用户可以新开一个终端,输入“kill –USR1 <进程号>”来给运行中的上述 程序发消息。无论何时发送,callback 函数总是会响应,并打印出”I gots me a signal of 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 版的正式版即将发布。 此外,本程序中使用的 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 环境中使用命令进 行搭建的方式,不再涉及其它搭建方式。 6
分享到:
收藏