如何实现一个FLEX MP3播放器

1、使用 URLLoader 读取外部 musicList.xml 文件。读取成功后调用  initSoundList,将 xml 的包装成一个 DataProvider 对象赋给  music_list.dataProvider。音乐列表初始化完成。
代码:

class MP_xmlHandler {
 private var Loader:URLLoader = new URLLoader();
 private var xmlData:XML = new XML();
 public var _xmlURL:String;
 function MP_xmlHandler() {
 }
 /*
 *加载xml
 */
 public function loadXml() {
  var xmlDataURL:URLRequest = new URLRequest(_xmlURL);
  var xmlLoader:URLLoader = new URLLoader(xmlDataURL);
  xmlLoader.addEventListener(Event.COMPLETE, onLoaded);
  function onLoaded(evtObj:Event) {
   xmlData = XML(xmlLoader.data);
   EventCenter.dispatchMyEvent({evt:"onXML"});
   listXml();
  }
 }
 /*
 *展开xml
 */
 private function listXml() {
  var tempArr:Array=new Array();
  for (var i=0; i<xmlData.child("song").length(); i++) {
   tempArr.push({label:xmlData.child("song")[i].attribute("name"),data:i});
  }
  EventCenter.dispatchMyEvent({evt:"onListData",paramObj:tempArr});
 }
 /*
 *获取歌曲数组
 */
 public function getSongArr() {
  var temp_arr=new Array();
  for (var i=0; i<xmlData.child("song").length(); i++) {
   var obj=new Object();
   obj.songUrl=xmlData.child("song")[i].attribute("songUrl");
   obj.name=xmlData.child("song")[i].attribute("name");
   temp_arr.push(obj);
  }
  return temp_arr;
 }
 ///
 //Get&Set
 ///
 public function set setXmlURL(url) {
  _xmlURL=url;
  loadXml();
 }
 public function get getXmlURL() {
  return _xmlURL;
 }
}

 

 

2、为音乐列表框添加播放音乐事件 [Sound 类只负责加载和播放,声道控制和停止播放声音soundChannel 类负责。]

 

 private var soundChannel:SoundChannel;

 private function changeSound(evt:Event):void  {
  var url:String =  ComboBox(evt.target).selectedItem.url;
  //切换时判断一下,是否已经有音乐在播放,如果有就把之前的声音关掉,再播放当前选中的音乐
  if (soundChannel != null)  {
     soundChannel.stop();
  }
 
  var sound:Sound = new  Sound(new URLRequest(url));
  soundChannel =  sound.play();
}

 

 

3、音量控制滑块

    首先在 init  函数中为滑块添加一个侦听器,当滑块滑动后将音量调整为滑块的值:
      volume_bar.addEventListener(Event.CHANGE, adjustVolume);
  然后创建adjustVolume 方法:
      private  function adjustVolume(evt:Event):void  {
           soundChannel.soundTransform = new SoundTransform(evt.target.value);
      }

 

4、进行音乐播入


public function playSong(url:String):void
{
 soundUI.songNameLabel.text =GbToUtf.EncodeUtf8( url);
 soundUI.soundPlayer.url = url;
 soundUI.soundPlayer.play();
}

 

----------------------进行播放-同时监听 soundChannel的播放完成事件---------------------

 public function play():void
 {
  if (_url == "")
   return;

  if (state != PLAYING && state != ERROR)
  {
 
   soundChannel = sound.play(currentTime, 1, soundTransform);
   if (soundChannel)
    soundChannel.addEventListener(Event.SOUND_COMPLETE , complete_handler);
   else
   {
    dispatchEvent(new Event("deviceError"));
    return;
   }
   
   if (loaded)
    state = PLAYING;
   else
    state = LOAD_PLAY;
   dispatchEvent(new Event(Event.CHANGE));
  }
 }

需要监听的事件定义如下:

 

public function set url(newURL:String):void
 {
  _url = newURL;
  if (loaded || state == LOAD_PLAY)
  {
   stop();
   try
   {
    sound.close();
   }
   catch(e:Error)
   {}

   loaded = false;
  }
  
  urlRequest.url = _url;
  sound = new Sound();
  sound.addEventListener(Event.ID3, id3_handler);
  sound.addEventListener(ProgressEvent.PROGRESS , progress_handler);
  sound.addEventListener(flash.events.IOErrorEvent.IO_ERROR, ioError_handler);
  sound.addEventListener(flash.events.Event.OPEN, open_handler);
  
  sound.load(urlRequest, new SoundLoaderContext(1000, true));
  state = LOADING;
  dispatchEvent(new Event(Event.CHANGE));
 }

 

同时还可以设置音量及播放进度


 public function get position():Number
 {
  if (state == PLAYING)
  {
   return soundChannel.position;
  }
  else
   return currentTime;
 }
 
 public function set position(newPosition:Number):void
 {
  if (newPosition < 0)
   newPosition = 0;
  if (state == PLAYING)
  {
   pause();
   currentTime = newPosition;
   play();
  }
  else
   currentTime = newPosition;
 }

 public function get volume():Number
 {
  return soundTransform.volume;
 }
 
 public function set volume(value:Number):void
 {
  soundTransform.volume = value;
  
  if (state == PLAYING)
  {
   soundChannel.soundTransform = soundTransform;
  }
 } 

 通过

public function pause():void
 {
  if (state == PLAYING)
  {
   currentTime = soundChannel.position; =0表示停止播放
   soundChannel.stop();
   //sound.close();
   state = PAUSED;
  }
  else if (state == PAUSED)
  {
   play();
  }
  dispatchEvent(new Event(Event.CHANGE));
 }


5、设置播放进度

private function init():void
 {
  playa = soundPlayer.play;
  soundPlayer.addEventListener(Event.ID3, id3_handler);
  soundPlayer.addEventListener(Event.CHANGE ,change_handler);
  
  timer = new Timer(250);
  timer.addEventListener(TimerEvent.TIMER, timeUpdate);
  timer.start();
 }

 

private function timeUpdate(event:TimerEvent):void
 {
  time.text = formatTime(soundPlayer.position)
    
  if (!positionThumbPressed)
   position.value = soundPlayer.position * 100/ (soundPlayer.sound.length * soundPlayer.sound.bytesTotal / soundPlayer.sound.bytesLoaded + 1);
   
 }
 
 private function formatTime(time:Number):String
 {
  var s:String;
  var n:Number = Math.floor(time / 60000);
  if (n < 10)
   s = "0" + n;
  else
   s = String(n);
  
  n = Math.floor((time / 1000 ) % 60)
  if (n < 10)
   s += ":0" + n;
  else
   s += ":" + n;
  
  return s;
 }

  

 

 6、设置频谱

用个定时器,每隔150秒调用一次SoundMixer.computeSpectrum(ba,false,0);  会捕捉当前声音文件的波形

private function drawFunction(chuxi:Number,color:Number) {
   graphics.lineStyle(chuxi,color,100);
   //获取音谱信息
   SoundMixer.computeSpectrum(ba,false,0);
   //绘制声波曲线
   for (var i=30; i <= stage.stageWidth - 30; i++) {
    num=ba.readFloat() * 360;
    if (i > 30) {
     var fi=stage.stageHeight / 2 + num;
     graphics.lineTo(i,fi);
    } else {
     graphics.moveTo(30,stage.stageHeight / 2 + num);
    }
   }
  }

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值