学习情境音频与视频处理_第1页
学习情境音频与视频处理_第2页
学习情境音频与视频处理_第3页
学习情境音频与视频处理_第4页
学习情境音频与视频处理_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

学习情境音频与视频处理第一页,共二十五页,2022年,8月28日能力目标能熟练地运用利用管理器(Manager)打开一个音频文件;使用播放器(Player)播放一个音频文件;掌握在游戏中“开”、“关”声音的方法;掌握背景音乐之间的切换方法。学会使用播放器(Player)构造一个音量控制器(VolumeControl);能熟练地使用音量控制器(VolumeControl)控制声音的大小与设置静音;能熟练的使用管理器(Manager)、播放器(Player)打开一个视频文件;能熟练掌握运用播放器(Player)构造一个视频控制器(VideoControl);能熟练掌握使用视频控制器(VideoControl)设置视频的显示范围和显示属性;第二页,共二十五页,2022年,8月28日认知目标了解管理器(Manager)、播放器(Player)、音量控制器(VolumeControl)、视频控制器(VideoControl)等之间的结构关系;理解背景音乐和音效对于一款游戏的重要性;识记播放器(Player)的各种方法;理解背景音乐和音效数据在游戏中的加载位置;识记独占式播放和线程播放的方法和利弊;理解释放资源的重要性;识记系统能够打开的媒体类型。掌握视频播放器中的常用方法;了解移动设备可以打开的媒体类型;了解视频触发事件。第三页,共二十五页,2022年,8月28日5.1学习情境描述在玩家眼中,好的游戏总是有声有色、丰富多彩。离开了生动的音效,游戏的体验就会大打折扣。在一款游戏中,背景音乐通常随着场景的变换而变换,比如:菜单界面时会有一个起始的背景音乐,进入游戏后,又会有一个根据游戏情节设计的背景音乐。在RPG游戏中,还会随着人物所处场景的不同,设计几种不同的背景音乐。除了一直播放着的背景音乐,游戏中可能还会有碰撞、爆炸、暂停、继续、胜利、失败等系列的短音出现。在游戏过程中,还可以根据需要调节音量,或者设置静音。但是对于手机来说,存储空间是非常宝贵的,所以要谨慎使用视频。但是,随着手机存储空间的不断扩大(例如现在的存储卡已经达到32G以上空间),手机CPU速度不断提高,手机内存的不断扩容,相信手机游戏中的视频会得到相应的发展空间。本学习情境分为二个学习单元来完成。单元一,音效设计;单元二,播放视频。第四页,共二十五页,2022年,8月28日5.2音效设计从本学习单元开始,将进入一个丰富多彩的有声世界。在本学习单元中,首先,通过简单地播放一段音效,来学习播放器的使用;然后,通过对音效开和关的控制,了解控制播放器开、关的方法;第三,实现音量的调节和静音的设置;第四,实现多个背景音乐之间的切换;最后,在背景音乐的基础之上,为游戏加入各种提示短音效果。第五页,共二十五页,2022年,8月28日5.2.2任务一:播放音效知识准备:认识MediaAPI利用MediaAPI接口,可以为游戏和其他应用程序添加声音效果。

MediaAPI接口由两个包组成,分别为包包。

MediaAPI接口体系中主要由数据源(DataSource)、管理器(Manager)、播放器(Player)和控制器(Control)四个部分构成。Manager管理器DataSource数据源Player播放器Control控制器创建支持提供控制其中,Manager类是MediaAPI接口体系中最重要的类,用于创建各种不同类型的Player对象。Player接口用来播放由DataSource提供的各种格式的多媒体内容。Control接口用来协助Player接口控制音调和音量,有两个子接口,分别为ToneControl接口(控制音调)和VolumeControl接口(控制音量)。第六页,共二十五页,2022年,8月28日任务准备(1)新建MIDlet工程,工程名为“Ch5_Unit1”。(2)将第4章课后实训“5.综合调试”后成果,导入工程。(3)在工程中添加一个AudioPlayer类,在该类中将实现音效播放的基本功能。(4)将相关音效资源文件拷贝到工程的res文件夹下。小提示:各人综合调试后,类的个数或者类名,可能会有所不同。但本教材后面的任务,都基于上面这几个类进一步展开,请注意结合自己的成果来完成后面的任务。实现过程(1)打开AudioPlayer类,实现如下步骤:声明播放器对象自定义播放音效的方法(2)打开StartCanvas类,添加音效开启提示界面。步骤如下:声明AudioPlayer类对象声明一个音效开启提示界面的状态值,并修改界面状态变量的值为该状态值。自定义绘制音效开启提示界面的方法。在绘制屏幕的paint()方法中,添加对绘制音效开启提示界面方法的调用。在响应键盘的keyPressed()方法中,添加对音效开启提示界面“打开”按钮的响应。(3)运行测试第七页,共二十五页,2022年,8月28日(1)从输入流获取publicstaticPlayercreatePlayer(java.io.InputStreamstream,Stringtype)参数说明:

stream:音频数据的输入流。

type:数据源类型。常用的音频类型有如下几种:

Wave音频文件audio/x-wavAU音频文件audio/basicMP3音频文件audio/mpegMIDI音频文件audio/midi。比如,要获取存放在工程res文件夹下的音频文件“menu.mid”,代码如下:InputStreamis=getClass().getResourceAsStream(“/menu.mid”);Playerplayer=Manager.createPlayer(is,“audio/midi”);要点提示::获取音频文件(2)从URL地址获取

publicstaticPlayercreatePlayer(Stringlocator)参数说明:

locator:URL字符串。格式为:<协议>:<位置信息>例如:PlayeraudioPlayer=Manager.createPlayer(“/music.mp3”);小提示:可以利用如下两个方法来获取指定协议支持的媒体类型,或者是指定媒体类型所支持的协议。publicstaticString[]getSupportedContentTypes(Stringprotocol)publicstaticString[]getSupportedProtocols(Stringcontent_type)若参数为null,则返回所有协议支持的媒体类型和所有媒体类型支持的协议。第八页,共二十五页,2022年,8月28日知识提炼:播放器状态及状态的转换(1)播放器状态播放器(Player)从被创建到停止播放,整个生命周期共经历了五个状态。

UNREALIZED:播放器(Player)的起始状态,此时播放器(Player)未获得任何所需资源的信息。

REALIZED:已获得所需资源信息,但不一定获得硬件系统资源。

PREFETCHED:获取了所有资源,为播放媒体数据做好准备。

STARTED:播放器(Player)处于运行状态。

CLOSED:播放器(Player)释放所占用的所有资源,不能被重新使用。(2)播放器状态的转换

Player类上定义了一组相应的方法来控制播放器在不同状态之间转换。realize():获取播放信息,但是并不获取播放资源。prefetch():获取稀有资源,比如声音设备,尽量减少播放延时。start():开始播放声音。stop():停止播放声音。deallocate方法:释放被其占用的稀有资源,比如声音设备。close()方法:关闭播放器并释放资源。CLOSEDUNREALIZEDREALIZEDPREFETCHEDSTARTEDrealize()deallocate()close()close()close()close()prefetch()start()deallocate()stop()第九页,共二十五页,2022年,8月28日5.2.3任务二:实现音效的开关在任务一的基础之上继续如下实现过程。(1)在AudioPlayer类中,书写代码,实现如下功能:声明音效开关变量自定义获取当前音效开关的方法自定义设置音效开关的方法自定义关闭播放器的方法(2)在StartCanvas类中,书写代码,完成如下功能:在keyPressed()方法中,修改音效提示界面的按钮响应。在菜单界面的按键处理方法中,添加对菜单项“音乐开关”的响应代码。(3)运行测试第十页,共二十五页,2022年,8月28日要点提示:音效开关在一款手机游戏中,如果存在多个需要播放的音效,最好是一个音效对应一个播放器。比如,在任务四中,将实现两段背景音乐之间的切换。当更换音效资源时,需要清理声音设备后才能加载新的音效资源。Java有垃圾自动回收机制,但不是实时回收,系统在稍有空闲的时候才实施垃圾的回收。因此如果一个播放器关闭后,立即重新启动该播放器去播放另一段音乐,就会出现两段音乐同时播放的现象。除非前一段音乐已经播放完毕。更进一步的问题是,如果在播放背景音乐的同时,又要播放爆炸、碰撞等短音效果,使用同一个播放器就很难达到理想的效果。因此,在一款手机游戏中,可以存在多个播放器,实现对不同音效的加载、播放和关闭。对于这些播放器的开、关需要有一个统一的管理。使用一个开关变量来进行控制,是一个比较理想的解决方法。比如,在本任务中,首先,声明switchAudio变量作为播放器的开关变量,然后,自定义方法getSwitchAudio()和setSwitchAudio(),实现对switchAudio开关变量值的获取和设置。所有播放器的开、关都根据switchAudio变量的值来决定。这样在程序运行中,就不会出现刚把背景音乐关闭,却又突然响起爆炸声音的尴尬。第十一页,共二十五页,2022年,8月28日5.2.4任务三:控制音量、设置静音

(1)在AudioPlayer类中,书写代码,实现如下功能:①声明控制音量的对象自定义调节音量、设置静音的方法(2)在StartCanvas类的keyPressed()方法中,添加对数字键4、5、6的响应代码,设置数字键4减小音量、数字键6增加音量、数字键5设置静音。(3)运行测试小提示:关闭音效和设置静音是两个不同的概念。关闭音效的实质是关闭播放器,而静音状态下,播放器是打开的。第十二页,共二十五页,2022年,8月28日在MediaAPI接口体系中,Control接口有两个子接口:ToneControl和VolumeControl接口,分别用于控制音调和控制音量。要在播放音效时控制音量首先要获得VolumeControl接口,然后通过该接口上定义的方法进行音量调节。获取VolumeControl接口的方法如下:privatePlayerplayer;privateVolumeControlplayerVolumeControl;playerVolumeControl=(VolumeControl)player.getControl("VolumeControl");知识提炼VolumeControl接口上共定义了四个用于控制播放器音量的方法。(1)设置音量大小语法格式:publicintsetLevel(intlevel)参数:level的取值范围[0..100],0代表静音。(2)获取当前音量值语法格式:publicintgetLevel()说明:如果播放器处于REALIZED状态,则返回-1。(3)设置静音语法格式:publicvoidsetMute(booleanmute)参数:mute取值为true表示静音,false表示不静音。(4)检测是否静音语法格式:publicbooleanisMuted()第十三页,共二十五页,2022年,8月28日在任务三的基础之上,继续如下实现过程。(1)在AudioPlayer类中,书写代码,实现如下功能:①添加变量声明自定义方法,通过两个播放器,分别控制两段背景音乐的加载、播放和关闭。(2)在StartCanvas类中,书写代码,完成如下功能:在keyPressed()方法中,修改音效提示界面的按钮响应。在菜单界面的按键处理方法中,修改对菜单项“音乐开关”的响应代码。5.2.5任务四:实现菜单背景音乐和游戏背景音乐之间的切换③在绘制进度条的方法的最后,即进入游戏界面的语句后面,添加背景音乐切换的语句。(3)在GameBody类中,书写代码,完成如下功能:①声明变量AudioPlayeraudioPlayer=newAudioPlayer();在keyPressed()方法中,修改对“返回”按钮的响应代码。即在返回菜单界面的语句后面,添加对背景音乐切换的代码。(4)运行测试

小提示:在使用音频资源的时候,一定要注意资源文件的大小。如果文件太大,导致加载时间过长,不论是在游戏开始前,还是在游戏过程中,都将影响玩家的游戏体验。第十四页,共二十五页,2022年,8月28日要点提示如果要对菜单背景音乐和游戏背景音乐分别进行音量的控制和静音的设置,可以重载adjustVolume()方法,参考代码如下:publicstaticvoidadjustVolume(intindex,intincrement,booleanmute){audioPlayerVolumeControl[index]=(VolumeControl)audioPlayer[index].getControl("VolumeControl");if(audioPlayerVolumeControl[index]!=null){if(!mute){//如果没有静音

audioPlayerVolumeControl[index] .setLevel(audioPlayerVolumeControl[index].getLevel() +increment);//调整音量

}else{ audioPlayerVolumeControl[index] .setMute(!audioPlayerVolumeControl[index].isMuted());//设置乒乓效果,在静音和非静音间切换

}}}然后,分别在StartCanvas类和GameBody类的keyPressed()方法中,通过对数字键4、6和5的响应,实现音量的控制和静音的设置。参考代码如下:if(keyCode==Canvas.KEY_NUM4){//数字4,减小音量AudioPlayer.adjustVolume(AudioPlayer.PLAYER_INDEX_MENU,-10,false);}elseif(keyCode==Canvas.KEY_NUM6){//数字6,增加音量

AudioPlayer.adjustVolume(AudioPlayer.PLAYER_INDEX_MENU,+10,false);}elseif(keyCode==Canvas.KEY_NUM5){//数字5,设置是否静音 AudioPlayer.adjustVolume(AudioPlayer.PLAYER_INDEX_MENU,0,true);}第十五页,共二十五页,2022年,8月28日(1)在AudioPlayer类中,书写代码,完成如下功能:①自定义方法audioLoad(),实现对音效资源的加载。自定义方法audioPlay(),实现对音效的播放。(2)在GameBody类中,书写代码,完成如下功能:①在构造方法中调用audioLoad()方法,完成对爆炸短音资源的加载。audioPlayer.audioLoad("explosion.wav","audio/x-wav");在drawBullet()方法的碰撞检测过程中,如果发生碰撞,则调用audioPlay()方法,实现爆炸短音的播放。③在keyPressed()方法的“返回”按钮相应代码中,调用audioClose()方法,关闭并回收短音播放器。(3)运行测试

5.2.6延伸任务:为游戏加入爆炸等提示短音小提示:在现阶段,有些移动设备支持同时播放多种音效,但有些设备是不支持同时播放多种音效的。本任务在WTK2.5.2模拟器上运行时,就只能听到背景音乐,而听不到爆炸音效。但将本任务打包后,下载到某些手机设备上,比如:SonyEricsson的W580i机型,就可以同时听到背景音乐和爆炸音效。因此,对音效设计的真正效果,还需要在真实的设备上进行检验。第十六页,共二十五页,2022年,8月28日要点提示在游戏中,除了一直在播放的背景音乐外,还会存在与游戏效果相对应的各种提示短音。比如,本任务中的爆炸音效,还有当出现新对象时、对象间碰撞时、胜利或失败后的各种提示音。背景音乐和提示短音的播放时间和位置是不同的。背景音乐是一开始就播放,而提示短音是在发生某种事件后才播放的。所以在添加音效时一定要注意音效播放的位置。背景音乐无限次播放,而提示短音,仅播放一次,但可能需要多次播放。如果反复多次加载短音,将严重浪费系统资源,可能会使正在运行的游戏出现短暂的停顿,也即通常所说的“卡”,这将严重影响游戏的娱乐性。因此,在本任务中,将短音音效资源的加载和播放进行了功能分离,在构造方法中,一次加载,在碰撞检测中,多次播放。使用setLoopCount()方法可以设置音效的播放次数,语法格式如下:voidsetLoopCount(intcount);其中,参数count为设置的播放次数,当count为-1时,表示无限次循环播放。知识提炼第十七页,共二十五页,2022年,8月28日5.3播放视频在游戏的开始,或者是在游戏的每个关卡之间添加一段超酷的视频,不仅可以提升游戏的品质,而且还能够抓主玩家的眼球,给玩家以奖励,提高游戏的可玩性。在本学习单元中,首先,播放一段片头视频;然后,响应播放事件,使得播放完片头视频后,进入游戏。第十八页,共二十五页,2022年,8月28日任务准备(1)新建MIDlet工程,工程名为“Ch5_Unit2”。(2)将工程“Ch5_Unit1”中的类文件拷贝到该工程中。(3)在工程中添加一个继承自GameCanvas类的VideoPlayer类,在该类中将实现视频播放的基本功能。(4)将相关视频资源文件拷贝到工程的res文件夹下。实现过程(1)打开VideoPlayer类,实现如下步骤:①声明对象在构造方法中实现视频的播放功能(2)打开PlaneMIDlet类,修改startApp()方法中的语句,使其显示VideoPlayer类。(3)运行测试小提示:在代码书写过程中,请注意根据需要导入相关的包和类。第十九页,共二十五页,2022年,8月28日要点提示视频播放其实和音效播放采用的方式相同,都是由管理器通过指定的数据源来创建播放器对象,然后,通过播放器对象获得相关的视频控制器,实现在窗体或者画布中显示视频的功能。视频控制器主要的接口是VideoControl接口。可以通过播放器对象调用getControl()方法获取与之相关的视频控制器对象。在调用start()方法开始播放视频前,首先要调用VideoControl接口上的initDisplayMode()方法指定打开视频的模式,然后再调用setVisible()方法设置视频是否可见。一个播放器对象,可以同时获得与之相关联的视频控制器和音频控制器。因此在视频播放时,不仅可以设置视频的显示,还能设置视频的音效,两者之间并不矛盾。

VideoControl接口上定义的常用方法有以下这些:(1)设置视频播放模式语法格式:publicjava.lang.ObjectinitDisplayMode(intmode,java.lang.Objectarg)参数:mode取值为USE_DIRECT_VIDEO,表示是受限设备播放模式(例如:手机),取值为USE_GUI_PRIMITIVE,表示是非受限设备播放模式(例如:PDA)。参数arg为承受视频的窗体或者画布。(2)设置视频是否可见语法格式:publicvoidsetVisible(booleanvisible)参数:visible为true表示显示,为false表示隐藏。在USE_DIRECT_VIDEO模式下,默认为隐藏,而在USE_GUI_PRIMITIVE模式下,默认为显示。(3)设置全屏显示语法格式:publicvoidsetDisplayFullScreen(booleanb)参数:b为true全屏显示,为false,则按视频实际大小显示。知识提炼第二十页,共二十五页,2022年,8月28日5.3.3任务六:响应播放事件在任务五的基础之上,打开VideoPlayer类,继续如下实现过程:(1)实现PlayerListener接口(2)注册监听器(3)实现PlayerListener接口中定义的playerUpdate()方法(4)运行测试第二十一页,共二十五页,2022年,8月28日要点提示在媒体播放时(包括音频和视频),MediaAPI接口采用事件机制检测播放器(Player)状态的改变,当为播放器(Player)注册了一个PlayerListener事件监听器后,任何时候播放器状态的改变都将被系统自动捕获。PlayerListener事件监听器中唯一的方法palyerUpdate()完成对事件的处理。(1)注册PlayerListener监听器的方法如下:publicvoidaddPlayerListener(PlayerListenerplayerListener)小提示:注册对象是播放器(Player)类的实例。(2)事件处理方法palyerUpdate()的语法格式如下:publicvoidplayerUpdate(Playerplayer,Stringevent,ObjecteventData)参数说明:player:产生事件的播放器。event:表明了播放器在某种状态下产生的事件。取值如下:CLOSED:播放器关闭时产生。DEVICE_AVAILABL:当系统或者其他高优先级程序占用设备时产生。DEVICE_UNAVAILABLE:当系统或者其他高优先级程序释放设备时产生。DURATION_UPDATED:当播放器的播放时间改变时产生。END_OF_MEDIA:播放完毕时产生。ERROR:媒体播放出现错误时产生。STARTED:开始播放时产生。STOPPED:停止播放时产生。VOLUME_CHANGED:调节音量时产生。eventData:相关事件数据。第二十二页,共二十五页,2022年,8月28日本章小结(管理器Manager类通过createPlayer()方法创建播放器(Player)。音量控制器VolumeControl和视频控制器VideoControl,则通过播放器(Player)的getControl()方法来获取。1.播放器(Player)常用方法Realize():获取播放信息,但是并不获取播放资源。prefetch():获取稀有资源,例如声音设备,尽量减少播放延时。setLoopCount():设置播放循环次数。start():设置声音开始播放。stop():声音停止播放。close():关闭播放器释放资源。deallocate():释放被其占用的稀有资源,例如声音设备。2.音量控制器VolumeControl接口上定义的常用方法getLevel():获得当前音量值。如果播放器处于REALIZED状态则该方法返回-1。setLevel(intlevel):用于设置媒体播放声音的百分比。setMute(booleanmute):用于设置媒体播放的静音。getMute():用于获取媒体播放器是否处于静音状态。3.视频控制器VideoControl接口上定义的常用方法(1)设置视频播放模式语法格式:publicjava.lang.Objectinit

温馨提示

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

评论

0/150

提交评论