媒体播放器-项目.ppt
《媒体播放器-项目.ppt》由会员分享,可在线阅读,更多相关《媒体播放器-项目.ppt(75页珍藏版)》请在三一办公上搜索。
1、第27章 媒体播放器项目完整实践,在本书前面的章节已介绍了C语言的语法和Linux系统中各种常用的函数库,利用这些知识已可开发一些基本的应用程序。本章将这些知识综合应用到媒体播放器项目中,通过一个严格的项目管理制度对项目进行规划,并补充媒体播放器未实现的功能。如果该项目由多个人协同开发,则可以尝试分工协作,培养协同开发的经验。,27.1 软件工程实战,软件开发的过程中离不开软件工程思想的指导,即使在学习过程中也应该时刻将软件工程方法放在重要位置。如果在学习程序开发过程中就遭遇了项目失败,对于学习者来说,所造成的挫败感一直会影响到将来的实际工作中。而实践软件工程思想又能为将来实际工作打下扎实的基
2、础,因此本节结合媒体播放器项目来进行软件工程的实战。,27.1.1 项目需求分析,项目需求分析经常被作为一个独立的课题来研究,但对于开发人员来说,了解项目需求分析方法也是必不可少的。在朴素软件工程思想中,项目需求分析的方法使用的是实例分析法。,27.1.2 软件需求说明,软件需求说明(Software Requirement Specification,简称SRS)是项目需求分析所得到的文档。它的作用是提出需要解决的问题,作为下一步软件设计和编码的基础。1引言2任务概述3需求规定4运行环境规定5附录,27.1.3 项目视图的解决方案,项目视图指的是项目的实际需求,开发者在软件需求说明文档完成后
3、即可针对项目视图提出解决方案。在给出解决方案的同时也要陈述自己的理由,但应该避免在这个阶段进行软件设计。下面列举媒体播放器项目中主要问题的解决方啊。1媒体播放器界面设计2数据库的选择3读取MP3文件信息4媒体播放功能,27.2 软件设计,软件设计的内容很广泛,但结果只是总结出项目需求所列出功能的实现方法。这个实现方法必须清晰易懂,能够被所有参与项目的开发人员理解。因此,最终获得的应该是数据字典和流程图。本书前面部分已经对媒体库中大部分功能的实现进行了分步讲解,所以,这里讨论另外两个重要话题。第一是需求分析方法,即根据软件需求说明进行详细分析。第二是制订开发计划和分工,目的是帮助读者按步骤实现软
4、件。,27.2.1 需求分析,需求分析是指理解项目的需求,就软件的功能进行深入理解,并且给出明确的解决方案。,27.2.2 制订开发计划,媒体播放器中,首先应定义程序的主体结构,即实现核心控制模块。该模块是其他所有模块操作的基础,缺少该模块则难以进行后面的工作。然后在第二步可以同时进行媒体库模块和播放控制模块的实现,第三步进行用户界面模块和媒体文件解码模块的设计。最后的步骤是系统集成,把所有的模块关联起来,如图27.4所示。,27.2.3 分工协作,一个较大的项目往往需要分工协作,如何进行项目分配和如何执行分配到自身的计划也是开发者必须具备的能力。在这里需要引入一种称之为甘特图的图表,它是以图
5、示的方式通过活动列表和时间刻度形象地表示出软件项目的活动顺序与持续时间。,27.3 版本控制,无论是独立开发的软件项目还是协作开发,都需要进行版本控制。版本控制的作用是保护源代码,将每次对源代码的修改都记录起来。这样一方面能保证可以回溯到指定的时间点,另一方面在多人同时编辑一个源代码文件时不会相互覆盖对方的工作成果。目前版本控制工具有很多,Linux系统上使用最广泛的版本控制工具是CVS。该工具不仅能很好的支持C语言项目,而且能被Eclipse集成开发工具集成使用。,27.3.1 CVS服务器配置,CVS服务器是托管源代码的仓库,开发者通过访问CVS服务器获得源代码资源。在修改了相应的源代码后
6、,源代码及其改动信息又被存回到CVS服务器中。多人参与的项目只用建立一个CVS服务器,开发者通过网络访问该服务器。,27.3.2 CVS服务器管理,CVS是功能齐备的版本控制工具,在使用CVS服务器之前有几个重要概念必须了解。下面分别介绍这几个概念和操作方法。1仓库 2模块3导入 4签出5签入 6添加和删除7历史 8冲突解决9标记 10分支11远程访问 12局限性,27.4 在Eclipse中使用CVS客户端,Eclipse集成开发环境内置了CVS客户端插件,因此可直接使用Eclipse管理CVS服务器中的资源。对于Eclipse来说,CVS用于支持团队开发,是很多大型软件开发团队所选用的工具
7、。在Eclipse中使用CVS客户端的优势在于:Eclipse与CVS无缝连接,可直接通过Eclipse的界面和菜单进行CVS操作。Eclipse为CVS提供了图形用户接口,无需记忆复杂的操作命令。Eclipse支持将CVS模块作为项目操作。,27.4.1 从CVS服务器签出模块并创建项目,无论CVS服务器是在本地,还是在远端,都可以直接从CVS服务器中签出模块并创建项目。,27.4.2 签入文件,每一个文件名后显示该文件的版本号,如果文件在本地被改动过,文件名前面会显示一个小箭头,如图27.13所示。,27.4.3 使用Eclipse项目创建CVS模块,在Eclipse中可以将本地项目导入到
8、CVS服务器中,创建新的模块或签入到已有的模块中。该功能类似于CVS的导入操作和签入操作的集合。,27.4.4 比较文件,Eclipse可以比较本地文件与CVS仓库中文件的差异。在Eclipse主界面选择Window|Team Synchronize命令,将进入到团队同步界面,如图27.20所示。,27.4.5 管理CVS服务器,Eclipse提供了专门的界面管理CVS服务器。如图27.21所示。,27.4.6 断开项目与CVS服务器之间的关联,如果某一项目不在需要与CVS服务器关联起来,可以在项目浏览器中右击该项目,选择Team|Disconnect命令。这时,将弹出Confirm Disc
9、onnect from CVS对话框,如图27.22所示。,27.5 音量控制对话框,音量控制对话框的作用是调节系统音量。单击媒体播放器主界面上的音量调节开关按钮后,如果开关按钮的状态为按下,音量调节对话框将显示出来。如果开关按钮处于原始状态,音量调节对话框被隐藏。相关代码放在“interface.c”文件中。,27.5.1 创建对话框,音量调节对话框的类型属于弹出式窗口,因此它没有普通窗体的标题栏和边框。音量调节对话框出现的位置非常重要,按照GNOME桌面环境约定俗成的规则,通常显示在鼠标指针当前的位置。宏GTK_WIN_POS_MOUSE可返回鼠标当前的位置,它可作为gtk_window_
10、set_position()函数的实际参数。这样,每次音量调节对话框都会显示在鼠标光标指向的位置。,27.5.2 添加垂直比例尺,音量调节对话框内的主要部件是一个垂直比例尺,该比例尺用于调节音量和显示音量的比例。对话框中默认有一个活动区域,实际上它是横向按钮盒。音量调节对话框中没有任何按钮,因此要将活动区域屏蔽起来。本例屏蔽活动区域的方法为,先获得活动区域的地址,其后使用gtk_widget_set_sensitive()函数使活动区域不显示。但是,必须用gtk_button_box_set_layout()函数结束活动区域设置,否则会造成GTK+错误。最后,使用gtk_widget_grab
11、_default()函数让GTK+获得焦点。在创建音量控制对话框函数结尾处还要将diaVolume指针返回。,27.5.3 测试,下面用一个例子测试音量控制对话框的显示效果。在编写代码前,先要在媒体播放器源代码目录中添加C语言源代码文件“callback.c”和头文件“callback.h”。这两个文件用于放置所有回调函数的代码,在后面的开发过程中还将用到。,27.6 播放列表对话框,播放列表对话框由一组工具条按钮、一个树视图和一组按钮构成,下面分别介绍播放列表对话框中这几个部件的实现方法。,27.6.1 创建对话框,播放列表对话框是一个非模式对话框,可以在该对话框显示的同时操作媒体播放器主界
12、面。它与普通窗体的构件区别在于,非模式对话框没有最小化和最大化按钮。非模式对话框与模式对话框的区别在于,前者使用gtk_widget_show()函数显示,后者使用gtk_dialog_run显示。,27.6.2 创建工具条和工具条按钮,播放列表对话框的各种操作都放在工具栏中,对应有7个工具栏按钮。为了便于显示控制,工具条中使用的是工具条按钮。其中“添加”、“打开”、“保存”和“删除”按钮可直接通过图像库创建。但“添加目录”、“删除全部”和“排序”按钮并没有图像库中对于的项目,需要进行自定义。,27.6.3 创建树视图,播放列表的内容显示在树视图中,因此树视图被放置在播放列表对话框的主要位置。
13、播放列表的内容可能不能完全显示在播放列表对胡框中,所以在创建树视图前先要创建一个滚动条窗体容器。将滚动条窗体的水平滚动条屏蔽,设置其垂直滚动条为自动显示。代码中,滚动条窗体的阴影风格被设置为向内,与其他对话框保存统一。然后新建一个树视图,将树视图装入滚动条窗体容器中。,27.6.4 创建对话框按钮,播放列表对话框只需要放置一个按钮,用于关闭对话框。这时需要用到对话框的活动区域部分,代码如下所示:GtkWidget*dialog_action_area2;/用于保存活动区域地址 dialog_action_area2=GTK_DIALOG(diaPlaylist)-action_area;/获得
14、活动区域地址 gtk_widget_show(dialog_action_area2);/显示活动区域 gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area2),GTK_BUTTONBOX_END);/结束活动区域设置,27.6.5 测试,播放列表的实现与隐藏由媒体播放器主界面上的“播放列表”按钮控制。因此首先要为该按钮的clicked事件连接回调函数。,27.7 媒体库对话框,媒体库对话框的实现方法相对于播放列表对话框略为复杂,主要区别是媒体库对话框使用了2个树视图,一个用于显示分类,另一个用于显示媒体信息。媒体库以标题、艺术
15、家、专辑和流派作为分类的条件,因此需要在原型中显示出来。本例中将介绍树视图的初步实现方法。,27.7.1 创建对话框,媒体库对话框使用的是非模式对话框,很多时候还需要与播放列表对话框同时显示。但是代码量的多少并非是衡量开发者编码水平重要因素,程序清晰易读才是必须遵循的原则。有些时候增加代码复用会加大编码难度,这样将造成更多的编码错误,反而降低了效率。,27.7.2 创建工具条和工具条按钮,媒体库对话框的工具条中共有6个工具条按钮,下列源代码用于创建工具条和工具条按钮:GtkWidget*toolbar;/用于保存工具条容器地址 toolbar=gtk_toolbar_new();/创建工具条容
16、器 gtk_widget_show(toolbar);/显示工具条容器 gtk_box_pack_start(GTK_BOX(vbMedialib),toolbar,FALSE,FALSE,0);/将工具条容器装入纵向组装盒,27.7.3 创建分类部件和媒体信息显示部件,分类部件和媒体信息显示部件均选用树视图构件实现,但是使用的是树视图的两种不同模式。分类的方法有三种,分别是:按艺术家名称分类、按专辑分类和按流派分类。,27.7.4 创建搜索部件,搜索部件是文本输入框、组合框和按钮这3个构件的组合。文本输入框用于输入搜索字符串,组合框中放置着搜索条件。本例中搜索部件是横向排列的三个构件,因此在
17、代码中先要创建一个横向组装盒,将横向组装盒装入上一层的纵向组装盒中。然后分别创建文本输入框、组合框和查找按钮,将这些构件装入到横向组装盒中。搜索的5个条件已添加到组合框上,严格的程序开发过程中,这种用法并不规范。因此,必须用文档记录这几个条件的顺序,以确保在实现查找功能时不会出错。,27.7.5 创建对话框按钮,媒体库对话框只需要放置一个按钮用于关闭对话框。代码如下所示:GtkWidget*dialog_action_area4;/用于保存活动区域地址 dialog_action_area4=GTK_DIALOG(diaPlaylist)-action_area;/获得活动区域地址 gtk_w
18、idget_show(dialog_action_area4);/显示活动区域 gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area4),GTK_BUTTONBOX_END);/结束活动区域设置 GtkWidget*closebutton2;/用于保存关闭按钮地址,27.7.6 测试,本部分的测试内容主要是介绍树视图的简单操作,实现分类部件的初始化。首先要修改“interface.h”头文件中的结构体_interface,增加分类树视图的指针。,27.8 播放控制模块实现,播放控制模块是媒体播放器中最重要的核心。该模块的作用是架
19、起媒体播放器与GStreamer多媒体框架之间的桥梁,使媒体播放器能通过GStreamer多媒体框架实现MP3播放的功能。因为GStreamer函数库提供了非常简单的接口对播放进行控制,实现播放控制模块所需要的代码并不多。下面开始介绍播放控制模块实现的方法。,27.8.1 播放控制模块程序结构,播放控制模块的源代码放置在“play.h”头文件和“play.c”源代码文件中,先在媒体播放器项目的源代码目录中新建这两个文件。,27.8.2 MP3播放功能实现,上一节已经讨论了播放控制模块的程序结构,MP3播放功能实际上是在play()函数中通过调用GStreamer库实现。在创建函数前,先要为“p
20、lay.c”文件加上一些相关的头文件。1函数接口和相关数据类型的定义2播放指令处理3MP3文件播放,27.8.3 播放中的回调处理,在GStreamer管道进行播放时,会产生大量的信号。例如管道中的文件信息,播放时出现的错误信息和播放和播放结束的信息。play()函数将总线消息的回调设为bus_call()函数,下面介绍该函数的实现过程。1函数参数列表和数据转换2处理播放结束3获取MP3文件真实信息4错误处理5测试,27.9 系统集成,媒体播放器中的所有模块均已实现,在编码过程中的最后一步即系统集成。系统集成是让所有模块相互关联起来,共同工作,形成一个可用的程序。工序中,首先要设计一个主程序文
21、件,为所有模块初始化。然后以自上而下的方法实现界面上所有部件的功能。从主界面的实现开始,直到每个菜单项和按钮的功能都实现。,27.10 主程序文件实现,主程序文件由一个名为“main.c”的源代码文件和名为“main.h”的头文件组成。其中,最重要的函数就是主函数main()。主函数是一个程序的接口,实际的项目中,主函数的作用通常是对其他所有函数模块进行初始化,并且创建其他模块所需的数据结构。在主函数退出前,程序所占用的所有系统资源将被释放。,27.10.1 头文件和主函数入口,主程序中除了要放置基本的C语言标准库头文件外,还要放入GLib库、GTK+库、GStreamer库和SQLite库的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 媒体播放器 项目

链接地址:https://www.31ppt.com/p-6267927.html