如何实现一个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);
}
}
}
代码:
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);
}
}
}
相关文章推荐
- 如何知道一个类都实现了哪些接口和从那个类继承
- 如何用C++实现一个LRU Cache
- 如何实现一个 Virtual DOM 算法
- 自行控制loadrunner的socket协议性能测试 (转) 一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字
- MFC如何实现打开一个文件,就像安装完某个程序然后弹出一个readme.txt一样?
- 如何实现一个不规则排列的图片布局算法
- 【远程调用框架】如何实现一个简单的RPC框架(二)实现与使用
- Android如何从实现到封装一个MVP详解
- Flex中如何通过addChild()函数在List中显示一个Sprite的例子
- 如何看待“我有个绝妙的idea就差一个程序员来实现了”?
- Flex中如何给一个按钮添加链接,点击链接打开一个网页呢?
- 如何用两个队列实现一个栈,并分析有关栈操作的运行时间。
- 求助:关于一个查询的SQL语句,请高人指点如何实现,谢谢!
- Flex结合java实现一个登录功能
- VC如何实现电脑任意一个托盘图标的隐藏
- C# 如何实现一个线程暂停和继续
- 如何看待“我有个绝妙的idea就差一个程序员来实现了”?
- 如何实现立即从终端获得一个字符并返回这个字符_vmin_vtime
- 在Fragment中我想点击按钮然后关闭当前的Fragment返回上一个Fragment该如何实现。
- 如何编程实现删除一个sap的在线用户