您的位置:首页 > 其它

如何实现一个FLEX MP3播放器

2009-02-11 10:17 288 查看
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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐