flex音频播放的波形效果

从http://www.swfdong.com/blog/article.asp?id=86转过来的
flex音频播放的波形效果

这是封装好的一个:
package com
{
    import flash.display.*;
    import flash.events.Event;
    import flash.media.*;
    import flash.utils.*;
    import flash.filters.*;
    import flash.geom.*;
    import mx.core.UIComponent;
 
    public class Visualization extends UIComponent
    {
        public function Visualization()
        {
            //TODO: implement function
            super();
        }
 
 
        //private const plot_height:int = 50;
        private const CHANNEL_LEN:int = 256;
 
 
        public function set Audioswitch(b:Boolean):void
        {
            if(b)
            {
                this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
            else
            {
                this.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
        }
 
 
 
        private function onEnterFrame(event:Event):void
        {
            var len_step:Number = this.width/CHANNEL_LEN;
            var plot_height:Number = this.height/2;
 
            var bytes:ByteArray = new ByteArray();
            SoundMixer.computeSpectrum(bytes, false, 0);
 
            var g:Graphics = this.graphics;
 
            g.clear();
            g.lineStyle(0, 0xe0d1f0);
            //g.beginFill(0x6600CC);
            g.moveTo(0, plot_height);
 
            var n:Number = 0;
 
            // left channel
            for (var i:int = 0; i < CHANNEL_LEN; i++)
            {
                n = (bytes.readFloat() * plot_height);
                g.lineTo(i * len_step, plot_height - n);
            }
            g.lineTo(CHANNEL_LEN * len_step, plot_height);
            //g.endFill();
 
            // right channel
            g.lineStyle(0, 0xCC0066);
            //g.beginFill(0xCC0066, 0.5);
            g.moveTo(CHANNEL_LEN * len_step, plot_height);
 
            for (i = CHANNEL_LEN; i > 0; i--)
            {
                n = (bytes.readFloat() * plot_height);
                g.lineTo(i * len_step, plot_height - n);
            }
            g.lineTo(0, plot_height);
            //g.endFill();
        }
    }
}

使用的时候这样做就可以了
//波形视觉效果
  var Visual:Visualization= new Visualization();
  Visual.move(5,0);
  Visual.width=90;
  Visual.height=50;
  Visual.Audioswitch=true;
  this.addChild(Visual);   


再来一个简单的:
package {
     //导入类
     //Sprite是一个只有一帧的MovieClip,相对于MovieClip少了帧和场景...
    import flash .display .Sprite ;
     //混合模式类
    import flash .display .BlendMode ;
     //事件类
    import flash .events . * ;
     //声音类
    import flash .media . Sound ;
     //混音器类
    import flash .media .SoundMixer ;
     //声道类
    import flash .media .SoundChannel ;
     //URLRequest类
    import flash .net .URLRequest ;
     //ByteArray类
    import flash .utils .ByteArray ;
     //位图类
    import flash .display .Bitmap ;
    import flash .display .BitmapData ;
     //滤镜类
    import flash .filters .BlurFilter ;
    import flash .filters .ColorMatrixFilter ;
     //滤镜品质类
    import flash .filters .BitmapFilterQuality ;
     //矩形类
    import flash .geom .Rectangle ;
     //Point类(点)
    import flash .geom .Point ;
     //定义类
     public class SwfdongSound extends Sprite {
         //声明用来包含line和bg的Sprite
         private var Main :Sprite = new Sprite ( ) ;
         //声明用来画线的Sprite
         private var line :Sprite = new Sprite ( ) ;
         //声明用来放位图数据的BitmapData
         private var bmpData :BitmapData = new BitmapData (350 ,200 , true ,0xFF0 ) ;
         //声明用来显示效果的Bitmap
         private var bmp :Bitmap = new Bitmap (bmpData ) ;
         //声明MP3路径
         private var url : String = "MySound.mp3" ;
         //声明一个Sound对象
         private var DongSound : Sound = new Sound ( ) ;
         //声明一个SoundChannel对象
         private var sChannel :SoundChannel ;
         //声明一个ByteArray对象
         private var bArray :ByteArray = new ByteArray ( ) ;
         //声明一个数组对象
         private var Ary : Array ;
         //声明两个数字对象
         private var n : Number = 0 ;
         private var c : Number = 0 ;
         //声明一个ColorMatrix滤镜
         private var colorM :ColorMatrixFilter = new ColorMatrixFilter ( [
            0 .98 ,0 ,0 ,0 ,0 ,
            0 ,0 .98 ,0 ,0 ,0 ,
            0 ,0 ,0 .98 ,0 ,0 ,
            0 ,0 ,0 ,0 .90 ,0 ,
         ] ) ; ;
         //声明一个BlurFilter滤镜
         private var blur :BlurFilter = new BlurFilter (7 ,7 ,BitmapFilterQuality .LOW ) ;
         //声明一个矩形
         private var r :Rectangle = new Rectangle (0 ,0 ,350 ,200 ) ;
         //声明一个点
         private var p :Point = new Point (0 ,0 ) ;
         //类构造函数
         public function SwfdongSound ( ) {
            
             //Main的混合模式为"添加"
            Main .blendMode =BlendMode .ADD ;
             //在舞台上显示各个部分
            Main .addChild (bmp ) ;
            Main .addChild (line ) ;
            addChild (Main ) ;
             //将字符串转化为URLRequest
             var req :URLRequest = new URLRequest ( url ) ;
             //加载歌曲
            DongSound . load (req ) ;
             //播放
            DongSound . play ( ) ;
             //添加一个EnterFrame的侦听器,同以前的this.onEnterFrame=showBar();
             this .addEventListener (Event .ENTER_FRAME ,showBar ) ;
     }
private function showBar ( event :Event ) {
        n = 0 ;
         //这里是为了每2次才执行一次滤镜而做的if,如果需要让原来的波形图消失的更慢就把2改成更大的数字
         if (c %2 = =0 ) {
         //将Main的内容绘制到bmpData
        bmpData .draw (Main ) ;
         //应用滤镜
        bmpData .applyFilter (bmpData ,r ,p ,colorM ) ;
        bmpData .applyFilter (bmpData ,r ,p ,blur ) ;
         }
        c + + ;
         //清除绘图
        line .graphics . clear ( ) ;
         //设置线条样式,颜色湖蓝,宽度1,透明度100
        line .graphics . lineStyle (1 ,0x2AEAEB ,100 ) ;
         //将当前声音输出为ByteArray,注意哦,这次用的是false,上次是true
        SoundMixer .computeSpectrum (bArray , false ,0 ) ;
         for ( var i =0 ; i < 256 ; i + =2 ) {
                 //在ByteArray中读取一个32位的单精度浮点数(这个是livedoc上写的,实际就是把数据流读取成浮点数)
                n = bArray .readFloat ( ) ;
                 //这个实际作用是把n扩大一下
                n = n *360 ;
                 //如果i不为0
                 if (i ! =0 ) {
                 //画波形图
                line .graphics . lineTo (50 +i ,100 -n /5 ) ;
                 } else {
                 //移动    
                line .graphics . moveTo (50 ,100 -n /5 ) ;
                 }
         }
     }  
   }
}

更多神奇的是:
呵呵,又是一个AS3编写的波形效果.很COOOOOOL.至于有多酷,就得自己评定了.看这里:
效果1:

效果2:

效果3:

效果4:

效果5:



如果访问有问题.可以观看 作者BLOG:
http://www.anttikupila.com/flash/revolt-actionscript-3-based-spectrum-analyzer-source-released/
作者同时还把源文件无私的奉献出来.在这里先表示感谢.
方便观看,我把源演示地址贴出: 下载文件 点这里观看
源文件下载: 下载文件 点这里下载
我还收藏了一个波形效果,出自 lab.andre-michelle.com:
效果图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值