尝试做了一个简单的MP3播放器
(传到网盘上再外链过来似乎无法访问文件了,还要从缓存里挖出来,缓存里如果有个15KB的SWF那就是这个了。。路径可以填本地相对或者绝对路径、也可以填MP3文件的网络地址)
本来我是打算让整个播放器里只存在一个CHANNEL的毕竟同一时间只能播放一首歌。结果每次移动进度条都正在播放的歌都会变成重音,就是同时2首或更多首一起在播放,查了资料才知道原来每次使用SOUND.PLAY(),都会重新生成一个CHANNEL,我的理解就是这首歌不是消失了只是停了下来,在移动进度条之后由于再次使用了SOUND.PLAY()重新生成的CHANNEL和先前的CHANNEL一起播放了。所以在每次新播放一首歌的时候把上一首歌添加在进度条上的LISTENER给删除掉,这样同一时间只有一个LISTENER在进度条上即使其他歌曲的CHANNEL还在也不会受到影响。
但是有个疑问,没找到删除CHANNEL的方法,如果这样的话每次播放都生成一次CHANNEL那岂不是留下很多在舞台上?
还一个问题是全部循环模式好像有点问题,其他的循环模式都测试了好几遍可以正常运行。全部循环播放几次之后就又出现了重音的问题
控制循环模式的代码:
addEventListener(Event.ENTER_FRAME, nextMusic);
function nextMusic(e:Event):void {
if (mc.x>=180) { //进度条是否移动到尽头
//trace(playMode);
for (var q:int=0; listButton[q].x==20; ) {
q++;
} //用来检查歌曲列表的长度,因为每添加一首歌,都会新增一个listButton[i](即歌曲列表的按钮)到舞台并设置他的位置在前一个按
//钮的正下方,所以所有按钮的X值总是为20,q的值就是首个X值不为20的按钮即q-1就是最后一首歌的序号。
switch (playMode) { //从0到4分别为单曲播放 单曲循环 随即播放 顺序播放 全部循环,其值由控制模式的按钮的X值决定
case 0 :
{
allStopfunction(); //用来停止正在播放的歌并删除为其添加的所有LISTNER
break;
};
case 1 :
{
allStopfunction();
musicStart();
break;
};
case 2 :
{
allStopfunction();
url=musicList[Math.round(Math.random()*(q-1))].text; //将URL定为0到Q-1之间的随即整数
musicStart();
break;}
case 3 :
{allStopfunction();
if (i+1!=q) { //如果下一首歌存在,则播放
url=musicList[i+1].text;
i=i+1;
musicStart();
}
if (i==q-1) {
}
break;}
case 4 :
{allStopfunction();
if ((i+1)!=q) {
url=musicList[i+1].text;
i=i+1;
musicStart();
}
if ((i+1)==q) { //如果下一首歌不存在,URL的取值就从0开始
url=musicList[0].text;
i=0;
musicStart();
}
break;
}
}
}