当前位置:文档之家› Flash学习As3音乐播放器教程

Flash学习As3音乐播放器教程

Flash学习As3音乐播放器教程那么开始吧!大家先下载一下源文件。

对着源文件的结构看教程。

我将整个播放器做到一个元件中(Control_panel),再给它绑定一个类(sound_lib.Control_panel),所有的代码就写在这个类里面了。

这样做的好处是:日后要用到它时,直接把Control_panel元件拖到你要用的地方就Ok了!接下来就是code了:要做音乐播放器,最重要的两个类当然就是Sound和SoundChannel。

先试一下,怎样让一首mp3播放起来:1. //建立一个Sound类2. sound=new Sound()3. //加载mp3文件4. sound.load(new URLRequest(“你的mp3路径”))5. //播放6. sound.play()Ok了!完整代码:1. package sound_lib{2. import flash.display.*3. import flash.media.Sound4. import flash.media.SoundChannel5. import .URLRequest6. public class Control_panel extends MovieClip{7. private varsound:Sound8. private constsound_url:String="sound_data/m01.mp3"9. public function Control_panel(){10. init()11. }12. private function init(){13. sound_init()14. }15. function sound_init(){16. sound=new Sound()17. sound.load(new URLRequest(sound_url))18. sound.play()19. }20. }21. }22.Ctrl+Enter一下。

是不是听到音乐了?啊?没听到?看看sound_data目录下是否放了mp3文件没?如果一切正常的话,你现在应该在享受你的音乐了。

呵呵。

不过别忘了大多数播放器是要用在web上的。

有时候声音播放的速度可能比下载的速度还要快,这种情况下声音播放就会暂停等待数据下载,为了更好的处理这个环节,我们可以设置一个数据缓冲区,当声音数据下载到一定数量时再进行播放,这样的话即使下载速度偶尔变慢也不会影响正常播放。

默认下Sound对象只创建1秒钟的缓冲,也就是说要想立即播放也需要等待1秒钟的缓冲,缓冲区的数据播放完后要想再次播放还要至少等1秒钟缓冲时间。

显然如果网速较慢的话且缓冲为1秒时,在这种情况下音乐的播放将会给人很”卡”的感觉。

所以我们必需手动设置一下缓冲:设置缓冲需要用到SoundLoaderContext类:建立一个SoundLoaderContext对象,然后设置它的bufferTime属性就行了。

最后将SoundLoaderContext对象传给sound对象的load()方法的参数就行了。

1. //建立一个SoundLoaderContext类,设置bufferTime为5秒2. varbuffer:SoundLoaderContext=new SoundLoaderContext(5000)3. sound=new Sound()4. sound.load(new URLRequest(sound_url),buffer)5. sound.play()声音的暂停与回放这样,即使放到web上也不成问题了。

不过现在只是能正常播放了,我们还得控制它才行嘛!最常见的控制就是暂停与回放了。

声音的暂停与回放不像视频流那样,可以直接pause 和resume来操作。

看看Soun类,大家可能会调用Sound对象的close( )方法可以停止播放,但是这样也停止了声音流,要想重新播放,必须再次调用load( )方法。

这显然不是我们想要的。

这里我们终于要用到上面所提到的SoundChannel了,其实对音频的绝大多数操作都是SoundChannel类来完成的。

SoundChannel的stop()方法可以让音乐暂停而不影响声音流的中断。

于是我们可以用SoundChannel对象的stop()方法与Sound对象的play()方法来暂停与回流音频流。

但是,当再次调用play( )方法时,音乐会从头开始播放而不是从暂停的地方开始,这个时候就要用到SoundChannel类的position属性了:position属性是用来记录音乐播放头的。

我们可以在暂停时,记录下position的值,然后再次调play()时,将它传给play()方法的参数。

这样就达到了最终目:1. sound_channel.stop()2. //记录position属性3. position=sound_channel.position4. sound_channel=sound.play(position)完整代码:1. package sound_lib{2. import flash.display.*3. import flash.media.Sound4. import flash.media.SoundChannel5. import flash.media.SoundLoaderContext6. import flash.events.*7. import .URLRequest8. public class Control_panel extends MovieClip{9. private varsound:Sound10. private constsound_url:String="sound_data/m01.mp3"11. private varsound_channel:SoundChannel12. private varposition:int13. private varis_play:Boolean14. public function Control_panel(){15. addEventListener(Event.ADDED_TO_STAGE,add_to_stage)16. }17. private function add_to_stage(_evt:Event):void{18. init()19. }20. private function init(){21. sound_init()22. control_init()23. }24. //==================sound part====================//25. function sound_init(){26. varbuffer:SoundLoaderContext=new SoundLoaderContext(5000)27. sound=new Sound()28. sound.load(new URLRequest(sound_url),buffer)29. sound_channel=sound.play()30. is_play=true31. play_mc.visible=false32. }33. //===================control part=================//34. function control_init(){35. pause_mc._btn.addEventListener(MouseEvent.CLICK,is_play_Handler)36. play_mc._btn.addEventListener(MouseEvent.CLICK,is_play_Handler)37. }38. private function is_play_Handler(_evt:MouseEvent):void{39. if(is_play){40. is_play=false41. position=sound_channel.position42. sound_channel.stop()43. play_mc.visible=true44. pause_mc.visible=false45. }else{46. is_play=true47. sound_channel=sound.play(position)48. play_mc.visible=false49. pause_mc.visible=true50. }51. }52. }53. }Ctrl+Enter一下。

Ok了吧?跟踪声音的加载进度与播放进度要得到声音的加载进度是很简单的,Sound类本身有bytesLoaded属性与bytesTotal属性。

只要在progress事件中监测到这个属性值就Ok了具体操作如下:1. private function sound_loading_Handler(_evt:ProgressEvent):void{2. varloaded_per=Math.ceil(100*_evt.bytesLoaded/_evt.bytesTotal)/1003. scroll_bar.loading_bar.scaleX=loaded_per4. }5. // loaded_per就是加载进度的百分比了,简单吧!不过用户肯定不满足于只看到加载进度,他们更希望能看到声音的播放进度并能控制播放进度。

要得到播进度,必须知道两个值:音乐的长度和当前的播放位置。

这两个属性分别在两不同的类里。

长度属性在sound类里,播放位置在SoundChannel类里,这两个值相除就是播放进度百分比。

呵呵,就这么简单!不过好像高兴得有点早了:sound类的length属性是不确定的,直到声音被下载完才确定,也就说它只表示已经被下载的那部分数据的长度,举个例子说,如果一个10分钟的音乐已下载了10%,那么length报告歌曲长度为1分钟(length 和position的单位都是毫秒)。

不过从我上面的例子不难看出,只要长度除以加载进度百分比即可算出实际长度即sound_length/loaded_per。

嗯原理搞清楚了就来试试吧:1. var loaded=sound.bytesLoaded2. var total=sound.bytesTotal3. sound_length=sound.length4. if(total>0){5. varloaded_per=loaded/total6. scroll_bar.loading_bar.scaleX=loaded_per7. sound_length=length/loaded_per8. position=sound_channel.position9. varplayed_per=position/sound_length10. }好了。

相关主题