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);
}
}
}