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(http://blog.csdn.net/wangwan/archive/2009/02/11/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);
     }
    }
   }

posted @ 2009-07-16 21:33  谢多  阅读(503)  评论(0)    收藏  举报