Mp3 Player
2009-05-30 12:07:53 来源:WEB开发网六、SoundPlayer.as 完整代码
package {
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.Sound;
import fl.data.DataProvider;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.media.SoundMixer;
import flash.utils.ByteArray;
import flash.events.IOErrorEvent;
public class SoundPlayer extends Sprite {
private var soundChannel:SoundChannel;
// 保存 512 个声音波形的快照
private var bytes:ByteArray = new ByteArray();
// SoundBar 的个数
private var barNum:uint = 512;
// 保存所有 SoundBar 的引用
private var soundBars:Array = new Array();
public function SoundPlayer() {
init();
}
private function init():void {
// 每个 SoundBar 的宽度:舞台宽度 / SoundBar 的个数
var barWidth:Number = stage.stageWidth / barNum;
// 初始化 SoundBar,放入舞台并加入数组
for (var i:uint = 0; i < barNum; i++) {
var soundBar:SoundBar = new SoundBar();
soundBar.width = barWidth;
soundBar.x = i * barWidth;
soundBar.y = stage.stageHeight;
addChild(soundBar);
soundBars.push(soundBar);
}
// 注册用来处理波形的函数
addEventListener(Event.ENTER_FRAME, onEnterFrame);
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("musicList.xml"));
loader.addEventListener(Event.COMPLETE, initSoundList);
volume_bar.addEventListener(Event.CHANGE, adjustVolume);
}
private function initSoundList(evt:Event):void {
music_list.dataProvider = new DataProvider(XML(evt.target.data));
music_list.addEventListener(Event.CHANGE, changeSound);
}
private function changeSound(evt:Event):void {
var url:String = ComboBox(evt.target).selectedItem.url;
if (soundChannel != null) {
soundChannel.stop();
}
if (url == "stop") {
return;
}
var sound:Sound = new Sound(new URLRequest(url));
//sound.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void{ trace(e); });
soundChannel = sound.play();
}
private function adjustVolume(evt:Event):void {
soundChannel.soundTransform = new SoundTransform(evt.target.value);
}
private function onEnterFrame(evt:Event):void {
SoundMixer.computeSpectrum(bytes, false, 0);
for (var i:uint = 0; i < barNum; i++) {
soundBars[i].scaleY = bytes.readFloat();
}
}
}
}
七、补充说明
需要注意的是这个程序最好还是在单机上运行,如果上传到网络上 Sound.load() 和SoundMixer.computeSpectrum() 都存在跨域访问和安全沙箱问题,除非您有自己的服务器。
通常来讲 512 个SoundBar 有些太耗费资源了,如果隔一个取一次就只需要 256 个,或者也可以在算法上加以改良。
更多精彩
赞助商链接