小小菜鸟的web菜园子

web开发学习。好记性不如烂笔头。每天进步一点点!

导航

AS3同步LRC歌词的MP3播放器.

【组件版本】:0.5
【功能简述】:LRCParser组件是用来解析lrc歌词文件的代码类组件。
【运行平台】:Flash CS3,ActionScript3,Flash Player 9 +
【功能演示】:

【调用接口】:

  1. public interface com.klstudio.media.LRCParser {   
  2.     //获取lrc的偏移量(单位为毫秒数);   
  3.     public function getOffset():int;   
  4.        
  5.     //设置lrc的偏移量;   
  6.     public function setOffset(offset:int):void;   
  7.        
  8.     //获取lrc的歌名;   
  9.     public function getTitle():String;   
  10.        
  11.     //获取lrc的歌手名;   
  12.     public function getArtist():String;   
  13.        
  14.     //获取lrc的专辑名;   
  15.     public function getSpecial():String;   
  16.        
  17.     //获取lrc文件的作者名;   
  18.     public function getAuthor():String;   
  19.        
  20.     //获取lrc的歌词列表;   
  21.     public function getList():Array;   
  22.        
  23.     //加载lrc文件,默认字符编码为GB2312;   
  24.     public function load(url:String,charset:String="gb2312"):void;   
  25. }  

 

【使用说明】:
     1、使用前提条件:
         安装了Flash CS3软件;
         安装了 Adobe Extension Manager 1.8扩展管理器,如果没有请先到这里下载: http://www.adobe.com/cn/exchange/em_download/
         下载了LRCParser组件安装包文件: LRCParser.mxp
     2、打开LRCParser组件安装包,将LRCParser组件安装到Flash CS3里;
     3、将LRCParser组件拖到正在打开的fla文件的场景或库里,然后在调用代码(或类)的上面加上“import com.klstudio.media.LRCParser;”一行代码就可以了,接下来就"按照上面的接口和参考下面的调用实现"来调用这个解析器了。
【调用实例】:

  1. package project.test {   
  2.        
  3.     import flash.display.*;   
  4.     import flash.events.*;   
  5.     import flash.geom.Matrix;   
  6.     import flash.geom.Point;   
  7.     import flash.geom.Rectangle;   
  8.     import flash.text.*;   
  9.     import flash.filters.*;   
  10.     import flash.net.URLRequest;   
  11.        
  12.     import flash.media.Sound;   
  13.     import flash.media.SoundChannel;   
  14.     import flash.utils.Timer;   
  15.        
  16.     //导入系统组件;   
  17.     import fl.controls.Button;   
  18.        
  19.     //导入LRCParser类;   
  20.     import com.klstudio.media.LRCParser;   
  21.        
  22.     public class Test4 extends Sprite{   
  23.         //定义解析器;   
  24.         private var parser:LRCParser;   
  25.         //定义声音对象;   
  26.         private var snd:Sound;   
  27.         //定义声音播放频道;   
  28.         private var channel:SoundChannel;   
  29.         //歌词序号;   
  30.         private var id:uint = 0;   
  31.         //定时器;   
  32.         private var timer:Timer;   
  33.         //显示平台;   
  34.         private var base:Sprite;   
  35.         //歌词显示;   
  36.         private var bmp:Bitmap;   
  37.         //播放按钮;   
  38.         private var button:Button;   
  39.            
  40.         private var preWidth:uint;   
  41.         private var preHeight:uint;   
  42.         private var copyright:TextField;   
  43.         public function Test4(){   
  44.             preWidth = 400;   
  45.             preHeight = 100;   
  46.                
  47.             stage.scaleMode = StageScaleMode.NO_SCALE;   
  48.             stage.showDefaultContextMenu = false;   
  49.                
  50.             //显示平台;   
  51.             base = new Sprite();   
  52.             addChild(base);   
  53.                
  54.             //初始化解析器;   
  55.             parser = new LRCParser();   
  56.             parser.addEventListener(Event.COMPLETE,completeHandler);   
  57.             parser.addEventListener(ErrorEvent.ERROR,errorHandler);   
  58.             parser.load("/demo/test/爱情转移.lrc");   
  59.                
  60.             //初始化定时器;   
  61.             timer = new Timer(50);   
  62.             timer.addEventListener(TimerEvent.TIMER,timerHandler);   
  63.                
  64.             //初始化声音对象;   
  65.             snd = new Sound();   
  66.             snd.load(new URLRequest("/demo/test/爱情转移.mp3"));   
  67.                
  68.             //copyright;   
  69.             copyright = new TextField();   
  70.             copyright.autoSize = TextFieldAutoSize.LEFT;   
  71.             copyright.selectable = false;   
  72.             copyright.defaultTextFormat = new TextFormat("Verdana",9,0xFFFFFF,true,null,null,"http://www.klstudio.com","_blank");   
  73.             copyright.text = "POWERED BY KINGLONG";   
  74.             copyright.x = preWidth - copyright.width - 5;   
  75.             copyright.y = preHeight - copyright.height - 5;   
  76.             var filter:BitmapFilter = getBitmapFilter();   
  77.             copyright.filters = [filter];   
  78.             copyright.alpha = 0.8;   
  79.             addChild(copyright);   
  80.                
  81.             //显示平台;   
  82.             base.graphics.lineStyle(1,0x666666);   
  83.             base.graphics.beginFill(0xF4F4F4);   
  84.             base.graphics.drawRect(0,0,preWidth,preHeight - copyright.height - 10);   
  85.                
  86.             base.graphics.lineStyle(1,0x999999);   
  87.             base.graphics.moveTo(0,25);   
  88.             base.graphics.lineTo(preWidth,25);   
  89.             base.graphics.moveTo(150,1);   
  90.             base.graphics.lineTo(150,25);   
  91.             base.graphics.moveTo(250,1);   
  92.             base.graphics.lineTo(250,25);   
  93.                
  94.             base.addChild(getTextField("title","歌名:",new Rectangle(3,3,147)));   
  95.             base.addChild(getTextField("artist","歌手:",new Rectangle(153,3,97)));   
  96.             base.addChild(getTextField("special","专辑:",new Rectangle(253,3,147)));   
  97.                
  98.             bmp = new Bitmap(new BitmapData(preWidth-4,preHeight-54,false,0));   
  99.             bmp.x = 2;   
  100.             bmp.y = 27;   
  101.             addChild(bmp);   
  102.                
  103.             button = new Button();   
  104.             button.x = (preWidth - button.width)/2;   
  105.             button.y = 40;             
  106.             button.label = "PLAY MUSIC";   
  107.             button.enabled = false;   
  108.             button.addEventListener(MouseEvent.CLICK, clickHandler);   
  109.             addChild(button);              
  110.         }   
  111.            
  112.         //按钮点击事件;   
  113.         private function clickHandler(event:MouseEvent):void{   
  114.             //声音播放频道   
  115.             if(channel != null){   
  116.                 channel.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);   
  117.                 channel = null;   
  118.             }   
  119.             channel = snd.play();   
  120.             channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);   
  121.             timer.start();   
  122.             button.visible = false;   
  123.         }   
  124.            
  125.            
  126.         //获得文本框;   
  127.         private function getTextField(name:String,lbl:String,rect:Rectangle,clr:uint=0x666666):TextField{   
  128.             var txf:TextField = new TextField();               
  129.             txf.width = rect.width;   
  130.             txf.selectable = false;   
  131.             txf.defaultTextFormat = new TextFormat("Courier New",12,clr);   
  132.             txf.name = name;   
  133.             txf.text = lbl;   
  134.             txf.x = rect.x;   
  135.             txf.y = rect.y;   
  136.             return txf;   
  137.         }   
  138.            
  139.         //定时器间隔事件;   
  140.         private function timerHandler(event:TimerEvent):void{   
  141.             //获取歌词列表;   
  142.             var arr:Array = parser.getList();   
  143.             if(id<arr.length){   
  144.                 //时间数;   
  145.                 //要显示的歌词时间数是播放器时间数+歌词偏移量;   
  146.                 var point:int = int(channel.position + parser.getOffset());   
  147.                 if(point <= arr[id+1].time){   
  148.                     drawLyric(arr[id].lyric);   
  149.                 }else{   
  150.                     id ++;   
  151.                 }   
  152.             }   
  153.         }   
  154.            
  155.         //光晕滤镜;   
  156.         private function getBitmapFilter():BitmapFilter {   
  157.             var color:Number = 0x000000;   
  158.             var alpha:Number = 0.8;   
  159.             var blurX:Number = 2;   
  160.             var blurY:Number = 2;   
  161.             var strength:Number = 6;   
  162.             var inner:Boolean = false;   
  163.             var knockout:Boolean = false;   
  164.             var quality:Number = BitmapFilterQuality.HIGH;   
  165.             return new GlowFilter(color,   
  166.                                   alpha,   
  167.                                   blurX,   
  168.                                   blurY,   
  169.                                   strength,   
  170.                                   quality,   
  171.                                   inner,   
  172.                                   knockout);   
  173.         }   
  174.            
  175.         //lrc文件加载完成事件;   
  176.         private function completeHandler(event:Event):void{   
  177.             trace("completeHandler>>"+event);   
  178.             var title:TextField = base.getChildByName("title") as TextField;   
  179.             var artist:TextField = base.getChildByName("artist") as TextField;   
  180.             var special:TextField = base.getChildByName("special") as TextField;   
  181.             title.text = "歌名:" + parser.getTitle();   
  182.             artist.text = "歌手:" + parser.getArtist();   
  183.             special.text = "专辑:" + parser.getSpecial();   
  184.             button.enabled = true;   
  185.         }   
  186.            
  187.         //显示歌词;   
  188.         private function drawLyric(lyric:String):void{   
  189.             var txf:TextField = getTextField("lyric",lyric,new Rectangle(0,0,380),0xFFCC00);   
  190.             bmp.bitmapData.applyFilter(bmp.bitmapData,new Rectangle(0,0,bmp.width,bmp.height),new Point(0,0),new ColorMatrixFilter([1,0,0,0,-5,0,1,0,0,-5,0,0,1,0,-5,0,0,0,1,0]));             
  191.             bmp.bitmapData.applyFilter(bmp.bitmapData,new Rectangle(0,0,bmp.width,bmp.height),new Point(0,0),new BlurFilter(12,12));   
  192.             var matrix:Matrix = new Matrix();   
  193.             matrix.translate(10,13);   
  194.             bmp.bitmapData.draw(txf,matrix,null,BlendMode.SCREEN);   
  195.         }   
  196.            
  197.         //lrc文件加载失败事件;   
  198.         private function errorHandler(event:ErrorEvent):void{   
  199.             trace("errorHandler>>"+event);   
  200.         }   
  201.         //歌曲播放完成事件;   
  202.         private function soundCompleteHandler(event:Event):void {   
  203.             trace("soundCompleteHandler: " + event);   
  204.             if(timer.running){   
  205.                 timer.stop();   
  206.             }   
  207.             bmp.bitmapData.fillRect(new Rectangle(0,0,bmp.width,bmp.height),0);    
  208.             id = 0;   
  209.             button.visible = true;   
  210.         }   
  211.     }   
  212.        
  213. }   

实例文件打包下载:http://www.klstudio.com/demo/test/test4.rar (由于mp3比较大,所以就没有打包进去,下载到点这里) ;

来自:http://www.klstudio.com/post/128.html

posted on 2008-07-15 14:59  『小小菜鸟』  阅读(2362)  评论(0编辑  收藏  举报