计算机科学与技术毕业论文-基于Python的音频播放器的设计与实现_第1页
计算机科学与技术毕业论文-基于Python的音频播放器的设计与实现_第2页
计算机科学与技术毕业论文-基于Python的音频播放器的设计与实现_第3页
计算机科学与技术毕业论文-基于Python的音频播放器的设计与实现_第4页
计算机科学与技术毕业论文-基于Python的音频播放器的设计与实现_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论1.1研究背景随着人们不断寻求更高层次的精神生活的今天,聆听音乐已是人们最为普遍的一种爱好。现在的网络上,各种声音的播放器可以说是各具特色,各有千秋。一款用于播放多种类型的歌曲的播放机。包含:MP3、WMA、MP4等多个不同的播放机,它们不仅有着美观简约的界面,而且又有简易的使用方法,将你带入一个完美的音乐世界。而作为音频解码器的一个可视化的界面,它的实质就是对不同的语音进行音频编码格式的解码器。大部分的音乐播放器都是采用了不同的编码方式,并且有一个相同的回放界面,因此音乐播放器能够很容易的实现聆听各种音乐的功能。也正是由于这个音乐播放器只是音频解码器打包,而且音频的解码是相同的,所以从道理上来说,每一款音乐播放器的声音都是一模一样的,根本不存在什么音乐播放器中的最佳声音。有些音乐家会在解码器外接一个DSP插件式的解码器外接程序,将原来的曲子经过变形,以满足用户的要求,这种方式被称为音色。这可能会让某些曲子听起来更好听,但同时也会影响到其他曲子的质量。它具有良好的用户界面和可扩充性,大部分的商用版本的音乐回放程序倾向于拥有很好的用户界面和很容易使用的功能,但是它们缺少可扩充的功能,而且对音乐的支援也不是很强。开放源码的回放软件通常具有良好的伸缩性和支援多种不同的曲目,但其界面通常较为单一,难以引起使用者的兴趣。1.2Java语言的特征首先,

Java是一门完整的OOP设计语言,它具有OOP的特点。Java的多态性是建立在时滞binding或Dynamicbinding基础上的,所以Java天生就能够识别出一个对象的种类。然而,c++并不支持动态捆绑,而且捆绑发生在编译时,因此,c++希望实现多机运行的结果,就需要用到虚函数。另外,尽管C++已经有了封装、继承等功能,但是多态依然是基于编译器的约束,需要用虚拟的函数来完成。而且,在C++中,由于其指针运算可以采用goto语句,以及诸如多继承这样的特点,使得C++无法与OOP的概念完全一致。其次,Java是完全独立于平台的,它采用了一种虚拟机,将不同的平台隔离开来。Java是由Java的源程序通过编译而形成的类文件,这种类文件的结构与传统的编译器所生成的二进制文件有很大的区别,需要通过虚拟机口译来实现,是一种具有解释性的语言。虚拟机起到了一个中间体的作用,它将被编译的类文件转化成另一个平台上的指示。而在不同的C,

C++编译器中,各个数据类型所占的空间可能是不相同的,这就会对程序的可移植性产生影响。另外,在存储管理上,Java通过对虚拟机上的冗余存储进行自动化的处理,能够根据数据的变化,自动判定出哪些存储已经被用户所占用;因此,在软件开发过程中,使用者不必再进行冗长的记忆体管理。C、c++等程序设计中,如果在没有被利用到的情况下,必须重新利用其所具有的储存能力,那么就有可能出现储存能力的短缺,从而出现储存缺陷。同时,由于Java本身属于解释型语言,因此,其生成的Java类文件必须经过虚拟机上的解释才能被操作系统直接使用;因此其效率与C++和C++还是有一些距离的。在运行时,程序的发行比较麻烦,因为用Java写成的软件需要被安装到OS的虚拟机上。在图1.1中显示了一个

Java应用的经过编辑的执行流程图1.1JAVA程序的运行过程

2关于JMF技术2.1关于JMF技术JMF

(JavaMediaFramework),也就是

Java2的标准版本。J2SE

(J2SE)是一种面向多媒体内容采集、播放、传输及编码变换的通用平台,是一种面向多媒体内容采集、播放、传输及编码变换的通用平台。JMF技术能够为Java的开发和应用带来更多的便利。其内容有:媒体捕获、压缩、流转、回放,并对M-JPEG、H.263、MP3、RTP/RTSP(即时传输协议和即时流转协议)、

MacromediasFlash、IBM的HotMedia和Beatniks的RichMediaFormat

(RMF)等多种主流媒体格式和编码的支持。同时,

JMF2.1.1也对诸如快速时序,微软

AVI,

MPEG-1等常见的媒体进行了支援。另外,JMF还包含了一套开放式媒体体系结构,使得开发者可以使用多种媒体播放,捕捉组件,或者使用自己的自定义插入组件。JMF(JAVA

MediaFramework)是一种基于JAVA声的层次结构。JMF在它的声音过程中确实使用了Java声音。JMF提供了更多的声音和播放能力,但是它缺乏对Java声音的底层存取。此外,该规范的JDK分发没有包含JMF,而是包含了

JavaSound。JavaSound:(1)增加Audio和MIDI功能(2)可在

JDK1.3和以后的版本中使用(3)是最轻的。(4)自身对(AIFF,

WAV,

AU)几种音频格式的支持也比较有限(5)可以利用

Java声学的ServiceMobileInterface(SPI)来扩展JMF:(1)增加对音频、视频及其他时基于数据的支持(2)对多个媒体格式进行同步和控制(3)目前未使用任何JDK来提供(4)除了MPEG和其他格式外,它还支持多种音频格式(AIFF,

WAV等)。(5)包括对编码器/译码器介质的可扩充支持2.2JMF常用类JMF通常有下列类:●数据来源●媒体定位器●播放器●处理器●数据池●数据格式●管理程序2.2.1数据源(DataSource)在JMF中,一个资料来源是资料来源,可以是从收集装置取得的资料、一个多媒体档案或从网际网路上下载的资料。在数据源对象中,只要你决定了其所在的地点和类别,那么这个对象就会包括一个可以用来播放这个多媒体的地点和软件。一旦数据源对象被创建,你就可以把这个数据源对象放进播放器对象,而不用担心数据源中的媒体是怎样被获取的,也不用担心数据源中的媒体是怎样被获取的。2.2.2媒体定位器(MediaLocator)数据源的定义一般有两个方面,一个是媒体定位,另一个是URL。媒体定位器与URL相似,可以被

URL所构建,甚至不需要对应的协议处理机构就可以构建媒体定位器(对于Java来说,一个URL只能在一个

URL协议的处理机构被设置在系统中时才可以被构建)。媒体定位器用于定位采集装置,本地媒体文件,网络上的媒体文件和网络上的

RTP数据流。数据源的定义一般有两个方面,一个是媒体定位,另一个是URL。媒体定位器与URL相似,可以被

URL所构建,甚至不需要对应的协议处理机构就可以构建媒体定位器(对于Java来说,一个URL只能在一个

URL协议的处理机构被设置在系统中时才可以被构建)。媒体定位器用于定位采集装置,本地媒体文件,网络上的媒体文件和网络上的

RTP数据流。2.2.3播放器(Player)正如在图2-1中所见,

Player对象将一个声音和一个图像的流作为一个输入,接着把它输出到一个扩音器或者一个画面上,就好像一个玩家从DV的录音机中读出一个信息,再把一个声音的声音和一个视频的声音传到一个声音上,再把这个声音传到另一个声音上。图2.1JMF播放器模型播放器对象具有不同的状态,在

JMF中已有6个定义,见图2.2。通常,在播放多媒体之前,

Player对象必须经过每一个状态。以下是关于这些国家的描述。图2.2播放器的状态转换图●没有显示:此时,玩家对象已被执行,但没有显示其想要显示的多媒体内容。●在调用实时方法时,播放器对象的状态从未实时转换为实时。在这个状态中,播放器对象将决定其所需的资源。●一个真实的:在这个情况下,播放器对象会决定他所需要的资源,而且还会了解什么媒体要被播放。●在Prefetching被调用时,播放器对象的状态由实时转换为Prefetching。在这种情况下,Player是为了进行多媒体的播放而进行的,它包含了多媒体数据的装载、获取所需的专用资源等等。这种方法叫做预先提取。●已预获取:在播放器对象完成预先获取后,将达到这个状态。●开始:在使用开始方式之后,玩家将会进入这个状态,并且播放多媒体内容。玩家从一种状态切换到另外一种状态时,会生成一个转变事件(详情参见2.3的事件模式)。有了控制器,你的程序就能判断玩家的状态,然后做出对应的响应。通过这个事件报表,您可以在您呼叫玩家的方法之前判断玩家是否处于正确的状态。为避免出现这种情况,在玩家的全部状态中,无法调用全部的方法。如果玩家在目前的情况下,使用了不合法的方法,玩家会抛出一个例外或者一个错误。2.2.4处理器(Processor)一个与一个处理机(处理机)相对应的一个界面微处理机。还可以使用JMFAPI中的处理程序来播放介质数据。这是一个专门用于处理输入的介质流的玩家。该处理器提供了对所有播放机的回放控制。从图2-3中可以看出,处理器不仅可以把介质数据传送给回放终端,而且也可以把介质数据传送给数据源,这个过程可以用处理器的获取数据输出方式来完成。此资料来源可用作其它牌手的资料来源。该数据或者由其他处理器使用以进行后续的操作,或者作为DataSink的一个参数使用,或者保存在一个文档中或者传送到一个互联网上。图2.3处理器模型从图2.4可以看出,处理对象包含了除玩家中提及的六个状态外的两个新的状态。这两个状态分别位于未重置状态的后面和重置状态的前面。(1)在配置方法被调用之后,处理对象将进入这个状态。在这个状态中,处理程序物件会连结至资料来源,并且取得输入资料的格式化资讯。(2)在资料来源连结结束,取得资料格式资讯后,处理物件便进入配置中。图2.4处理器的状态转换图2.2.5数据池(DataSink)数据池用于从数据源(DataSink)中读取媒体数据,并将其输出到指定的目标地点,此处的目标地点与上面提到的扬声器或屏幕不同。某一种特殊的DataSink可以将资料输出至档案,也可以将资料传送至网络,也可以将资料传送至RTP。与Player类似,数据Sink对象使用数据源作为一个参数,并使用它的管理者去构建。2.2.6数据格式(Format)在JMF体系结构中,介质的格式化信息被存储在数据格式化对象中。该算法既没有包含编码参数,也没有包含整体的时域信息。在音频格式中,对声音的格式进行了说明,例如取样频率,每个取样的资料位元等。在视频格式中,对H.263等视频数据进行了说明。图2.5表示JMF对音频格式和视频格式的定义:图2.5JMF的媒体数据格式2.2.7管理器(Manager)JMF提供了下面四种管理器(Manager):(1)管理器是两个类间的一个接口。举例来说,如果您想要播放数据源,您可以用管理对象的CreatePlayer()方法来创建一个播放器对象。通过管理器对象,您可以创建播放器,处理器,数据源,以及数据链接对象。(2)JMF类的注册信息在这个管理员中被保存。(3)在这个管理员中有一个被捕获装置的登记资料。(4)在这个管理员中,你可以看到JMF插件的登记信息。2.3事件模型JMF通过事件报表的方式,使得JMF可以通过该报表向JMF报表的应用程序提供对媒体系统的实时信息,使得该应用程序可以根据该报表的变化作出相应的处理。无论何时,只要有一个JMF对象想要回报其目前的状况,就会产生一个媒体事件。媒体事件的子类包含控制器事件,数据事件,Gainchange事件,RTPEVent。对于能够传送媒体事件的任意一个

JMF对象,JMF都会定义一个对应的监听界面。如果要在某个媒体事件出现的时候能够获得相关的消息,那么就需要实现一个合适的监听接口,并且在相应的类中覆盖这个接口中处理媒体事件的方法本体,并且使用addListener方法来接收这个媒体事件。如图2.6中所示,JMF中的控制器对象,诸如玩家(Player)、处理器(Processor),以及诸如GainControl之类的控制器对象,都能够发出媒体事件。(播放器和处理器从控制器类继承)图2.6JMF的事件模型图2.7JMF控制器事件图2.7所示为控制器(例如播放器或处理器)所生成的控制器事件,控制器事件可以被划分为三种类型:变更通知、关机事件,以及状态转换事件。1.更改事件,例如Rate变更事件,持续时间最新事件,格式变更事件表示某些控制器的属性发生了变化。2.状态转换事件会让您的程序响应控制器对象的状态转换。玩家在从一种状态转换到另一种状态时,会生成转换事件。3.控制器在被关机时会生成一个关机事件。

3系统架构和功能模块设计3.1MVC模式概述MVC体系结构被称为“Model-View-Controller”,它把“建模、查看和控件”看作是构建一个软件的三个基本元素。事件使控制器更改模型或视图,或二者都更改。一旦控制器更改了模型中的资料或特性,就会立即更新这些视图。同样地,当控制器更改视图时,视图也会从可能的模型中提取数据并更新自身。与此对应的是,该系统也采用了

MVC思想来引导设计,实现了模块细化,分工明确,模块之间的三大目标。流程如图3.1所示图3.1流程图3.2系统目标在音乐播放中,要使用者能够使用最简便、最完整的音乐播放系统。最起码要有播放,暂停,停止,音量和进程的拖放等功能。一个好的播放机,在最基础的操作之外,还有很多其他的特性,可以用来凸显这个播放机的特点,比如这个播放机的歌词。在这种条件下,玩家的设计目标就是可以实现以下功能:(1)在使用者界面视窗上的控制:播放机主视窗、播放清单视窗、歌曲显示视窗;(2)支持多媒体文件的播放,包括播放,暂停,停止,拖拽等;(3)多媒体档案的管理功能:增加歌曲,增加目录,删除歌曲,清空清单,保存清单,加载清单;(4)声音档案资料展示:向使用者展示声音档案的资料,并可由使用者自行设定资料。3.3系统功能模块概要设计该系统还使用了MVC的开发方式,实现了控件、信息和视图三个部分的独立,并且存在着紧密的交互联系,互相调用,并对它们进行了约束和依赖。所以,我们可以把该体系划分成五大部分,这些部分分别是:其相互关系如图3.2所示图3.2相互关系图3.3.1用户界面模块为使软件产品接口具有友好性和简洁性,而又要确保其功能的完整性,对玩家进行游戏的控制窗口的设计就变得更为关键。首先,我们来看一下这个接口的构成成分,见表3.1。表3.1控制窗口的设计把如此多的控制项放在一个很小的窗口上,会让窗户变得非常杂乱,不利于使用,因此要考虑好它的放置位置。根据其作用将控制面板、播放列表面板、

LRC面板分为3类。通过这种方式,就能够实现软件产品界面的友好性与简洁性,条理清晰,在保证软件产品功能完整性的同时,也给用户提供了便利。每个板之间的联系见图3.3。图3.3板块联系图3.3.2播放控制模块其中,播放器的主要功能是生成播放器,对播放器进行控制,并设定播放器的内容。该方法与每一个模块都有紧密联系,具体实施如下:3.3.3播放信息模块播放信息模块是由三个层级的嵌套构成的,分别是:图3.4播放信息模块图首先看看在播放信息中,由播放状态构成的几个基本成分:3.3.4播放列表控制模块3.3.5歌词控制模块3.4音频文件播放逻辑3.4.1对音频文件的传递在此过程中,语音文件的传送主要是为了对歌曲的曲目进行整理。玩家在玩游戏时,首先要做的就是把游戏中的音乐文件从原来的地方转换成原来的地方,再把原来的地方转换成原来的地方。在要播放这个文件的时候,就要从演奏信息模块中将目前索引所指向的这个文件地址抽取出来,并将这个位置传递到了演奏控制模块,之后再将这个位置分配给管理者

Manager的新生成的媒体定位器对象(MediaLocator),

Manager在生成了播放机(Player)之后,其余的工作全部由Player来完成,来完成对语音文件的播放。声音档案的传输流程在附图3.5中显示。图3.5声音档案的传输流程图3.4.2对歌词文件的传递其中,对歌曲进行LRC的数据分析和数据分析,对歌曲进行LRC的数据分析和数据分析。因为LRC歌曲的歌曲往往位于多个地点,所以它的存取及资料的处理都比较繁琐。详细的工艺过程见图3-2。同时,也会把音乐档案的所在传送至磁碟上的播放清单。在需要重放一个档案时,先将档案的所在位置移至重放控制视窗,再将档案所在的地方移至重放控制视窗。这样,就能得到与MP3档案相同的档案所在的位址。将该音频文件的所在及该音频文件的所在之处传递给播放资讯模组。正在播放消息模块中,首先对音频文件中的TAG信息进行读出,之后将其最后的内容传送到歌词处理模块,并对其进行检验,确认此音频文件中是否有歌词,若有歌词,就将时间信息与歌词文字分开,并返回;当没有嵌入的歌词时,就会对

LRC的歌词文件进行检验,若有,就会把它交给歌词处理器,然后将它从歌词中提取出来,然后返回;若没有,请自行移动相关的歌曲资料夹中的歌曲。如果有,就把它传送到歌词控制模块,将它从歌词文字中剥离出来,再传送到播放控制模块;当有一首曲子出现时,它就会被传送到曲子显示视窗中,而这个视窗是用来控制曲子的。若以上三个地方均无一首歌曲,您可以通过右击歌曲目录中的歌曲相关功能,来进行歌曲相关,见图3.6。图3.6对歌词文件的传递图3.4.3播放控制流程自始至终,播放器都有一套由JMF写成的可被调用的方法。这个程序也有一套可以执行回放、暂停、停止、拖拉等操作的程序:图3.7播放控制流程图

4系统详细设计与实现4.1开发平台及环境这个软件采用了一个Eclipse3.2的软件平台,这个平台由IBM提供。Eclipse是一个开源的,可扩展的,并且是基于Java的。可扩充的软体,是现今最受欢迎的一种跨平台的,自由的,整合的软体开发环境。Eclipse自身很大,并且采用了“全部由插件构成”的设计哲学。还有几个功能与Eclipse通过插件很好地整合在一起,并且一起工作。比如,Eclipse(SWT/JFace)的图形开发环境,Java开发环境的插件,多语言软件包等等。在

Eclipse开始之后,要想真的用到一个插件,这个插件就会被自动加载到记忆中,而在合适的时间里,那些不再被用到的插件会被清理出记忆,在这个系统中,用到的一个典型的插件的实例就是,在这个过程中,用到的

VisualEditor就是一个很好的例子。4.2用户界面模块详细设计与实现在用户接口中,存在着三个主要的工作,那就是(1)接收更改后的信息,并对接口信息进行显示/更新(2)对用户/玩家进行事件的侦听(3)向其他控制模块传送更改的信息最主要的工作就是在无意中侦听到使用者/玩家发生的事情,然后做出回应。4.2.1对播放拖动条添加拖动事件监听器拖动TimeSlider可以得到一个事件发生在什么时候,这样就可以将一个事件监听程序添加到TimeSlider来捕捉这个事件。同时,在播放过程中,在定时器线程中,TimeSlider的值要被设置为currentpercent*100,也就是当前的音乐播放比例X100,具体的代码如图4.1所示:图4.1播放拖动条添加拖动事件监听器4.2.2音量拖动条添加拖动事件监听器该音量控制拉杆控制器是一种与该“声音”相关的回放信息,该音量控制拉杆的拉杆位置发生变化时,该音量显示屏幕上所显示的数值也随之发生变化。音量显示器上显示的是0和100,代表的是最大音量的百分数,具体的代码如图4.2所示。图4.2音量控制拖动条添加拖动事件监听器4.2.3对鼠标点击放开事件添加监听器主框架的使用者介面上有许多按键,每按一下就会触发一次事件,所以要为每一个按键增加一个监听者是一件相当困难的事情,所以我们想出了新办法。在MainFrame类中,实现MouseListener,ActionListener接口,而通用类MainFrame扩展JFrame,则可以实现ActionListener,MouseListener。因此,如果我们在MainFrame上实现一个界面的方法,那么我们将会主要响应MouseReleasedEvent,其具体的步骤见图4.3:图4.3鼠标点击放开事件添加监听器4.2.4时间线程在

MainFrame中,将创建一个新的时间线程Timer,它将在每1秒对

TimeLabel和

TimeSlider进行一次更新,同时还将对LRC进行更新,当

isPaused为

false,且没有拖动事件发生的时候,Timer将会运行run

,代码如图4.4所示:图4.4时间线程代码4.2.5最小化托盘通过对系统托盘图标的设定,可以让玩家在后台进行播放,如果想要将玩家叫醒到前台,只要双击右下角的小图标,就可以将玩家推出来,这样就可以让玩家的操作界面变得更友好,具体代码如图4.5所示:图4.5系统托盘图标4.3播放控制模块详细设计与实现4.3.1播放函数在多媒体播放机的众多控制中,回放功能最为关键。没有游戏规则,游戏者无法游戏,因此不能被称作游戏者。该播放机在按下回放按钮后,将出现两种切换:一种为暂停回放,一种为暂停回放;第二个是从“暂停”到“回放”的过程。二是由“停”向“放”的转换。“回放”指令是在按下“回放”键后,生成一个单独的“回放”指令。在玩家接收到回放指令之后,将按如下顺序进行:(1)对玩家的当前状态进行检验,也就是对布尔变量

isPaused在挂起状态下的值进行判定。如果游戏被挂起,就让玩家继续玩,时间计时器会启动时间,把“不玩”的数值设为假,然后就会离开游戏控制流;在没有被挂起的情况下,执行步骤2;(2)查看播放清单中有无介质文件,若无介质文件,就通过

ListController中增加歌曲的程序来增加,再重新执行这个程序来进行播放;如有档案在播放清单中,则按第3步进行;(3)检查该播放表的索引,并确定该播放表中的该歌曲是否已被选择并正在播放。如未找到,请从该曲目中选取最早的曲目,再按第四步进行。若有一首歌被选出来,就会立即进行第四步;(4)确定待放的曲目在播放清单中的先后顺序,若为前一曲目,前一曲目将被关闭,若为前一曲目,前一曲目将被激活;当播放到上一曲时,下一曲键将被关闭,否则将被激活;(5)确认播放方式是否为单行本,若为单行本,前一首歌及下一首歌均为无效,若为正常,(6)获得被选择的歌曲的播放地址,利用播放器控制进行播放,并调用歌词显示功能来显示歌词如图4.6所示:图4.6显示歌词代码4.3.2停止函数这里有两种方式来终止目前正在播放的音乐。第一种是在播放到目前的档案结束后,系统就会自动关闭;二是通过按下“暂停”键,使用户可以终止当前的多媒体文件。在开始的两个阶段,一是在播放阶段,二是在播放阶段;二是停机,即玩家进入停机状态后,停机都失去了作用,玩家只有进入停机状态后,玩家方可继续工作,正在播放中。这两种函数类似。在此,我们仅举例一种歌曲的功能,即“上/下”按钮。首先你要对你的音乐清单的下拉情况做出一个判断。当指数位于首位时,前一位的特性将会失效。如果指数位于尾端,那么接下来的追踪功能就会将指数置于首端。这段代码的主要内容如图4.7所示:图4.7停止播放器4.3.4暂停函数在播放者接到暂停命令的时候,它会让播放者暂停,停止计时器,将暂停状态变量

isPaused为

True,将暂停按钮隐藏起来,在显示出播放按钮后,就可以结束暂停的功能流程,代码如图4.8所示:图4.8暂停函数4.3.5对播放至文件播放至末尾结束事件的处理在玩家中加入控制器

Listener之后,在音乐的末尾将生成一个可以被控制器Listener捕捉的EndOfMediaEvent。这个时候,首先要看的是什么情况。若是只有一次的话,便会被终止。如果只有一个周期,则会再次播放。按序播放,首先破坏现有的播放器,再添加1个播放器,以获得下一首歌的资料,再创建一个播放器播放。因为JMF类执行控制器列表界面,所以在控制器对象生成事件时,必须在界面中执行控制器更新方法。代码如图4.9所示:图4.9末尾结束事件的处理总体流程图如图4.10图4.10总体流程图4.4播放信息模块详细设计与实现4.4.1播放信息模块其中,回放信息模块的功能是对玩家在游戏中的各项操作进行记录,并为玩家在游戏中的操作提供

get/set功能。因为该显示信息模块包含有显示清单(picturelist)模块,故该显示信息模块包含显示清单(picturelist)的动作。在列表控制器中,如果想要操纵该列表,就必须使用该功能来间接地调用该功能。以下是关键变数如图4.11所示:图4.11播放信息模块因为播放信息是一层一层地嵌套在一起的,包括了一个音乐节点的播放清单。4.4.2.播放列表我们可以把它看成一个容器。每一个playlist物件都会储存很多的歌节点。它的功能是对音乐进行编辑,比如添加文件,删除列表条目,清空列表等等。以下是增加、删除、清除清单的代码如图4.12所示:图4.12播放列表4.4.3歌曲信息节点“TAG”,3个字节的标记,30个字节的MP3标题,30个字节的歌手,30个字节的唱片集,4个字节的时间,30个字节的注释,1个字节的MP3歌曲信息一个关键的关键是一个构建函数,如图4.13所示:图4.13歌曲信息节点4.5播放列表控制模块详细设计与实现其中,播放目录的作用是对目录进行处理,包括创建目录,删除目录,加载目录,保存目录等。4.5.1打开文件函数在打开文件的时候,可以调用系统的文件选择器,创建一个

JFileChooser对象,并对其进行一些筛选,你只可以打开.

wav和.mp3格式的文件,如果你没有取消选择,你可以将文件组添加到当前列表中,如图4.14所示。图4.15打开文件函数4.5.2保存/装载列表函数一旦建立了一个对象,只要有必要,它就会一直在那里,但是一旦使用完毕,所有的对象就都消失了。在一些实际的应用中,为了在下一个应用程序开始运行时能够及时的保存数据,需要通过JAVA的I/O来完成。序列化(例如,保存你的音乐清单)(1)由于需要有一个输出物,因此有必要建立一个输出流。(2)把输出数据流包装为一个对象输出数据流。ObjectOutputStream是一种特殊的对象序列化方法(3)通过调用由

ObjectOutputStream所提供的

WriteObject

()方法,将该对象进行串行化,并将其转化成一个字符串,并将该字符串行将其送至

Output

Stream指定的媒体。4.6歌词控制模块详细设计与实现其中,歌词控制模块的功能包括:歌曲的载入、取消、识别和重新绘制。在完成LRC的读出之后,将其转换为歌曲的时间序列和歌曲序列。二者一一对应,一模一样。

5结束语本文介绍Python的音频播放器的设计与实现,通过对音频播放器的功能。从需求分析、整体设计与实现等几个角度,对整个音频播放器的开发过程进行了详细的说明。主要内容:(1)根据现有的Python的音频播放器的现状,对现有的Pyt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论