flash与声音:波频

package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.media.*; import flash.utils.*; import flash.filters.*; import flash.geom.*; import flash.system.System; import flash.text.*; public class SoundMX extends Sprite { private var sound:Sound; private var channel:SoundChannel; private var glow:GlowFilter;//发光滤镜 private var blur:BlurFilter; private var memory:TextField=new TextField(); public function SoundMX() { addEventListener(Event.ENTER_FRAME,onEnterFrame); sound=new Sound(new URLRequest("song.mp3"));//加载声音对象 channel=sound.play(); glow=new GlowFilter(0x0000ff,1,2,2); blur=new BlurFilter(1,1); memory.x=50; memory.y=50; memory.width=100; memory.height=20; addChild(memory); memory.defaultTextFormat=new TextFormat("Arrail",15,0xffffff); } public function onEnterFrame(event:Event):void { memory.text=String(System.totalMemory/1024 )+"/k";//显示内存使用情况 var shape:MovieClip=new MovieClip(); addChild(shape); shape.addEventListener(Event.ENTER_FRAME,Run); shape.graphics.lineStyle(1,0x0000ff); shape.x=100; shape.y=200; shape.filters=[glow,blur];//组合滤镜 shape.value=Math.random()*8; shape.key=true; } private function Run(event:Event):void { if (event.currentTarget.key) { event.currentTarget.key=false; var ss:ByteArray=new ByteArray(); SoundMixer.computeSpectrum(ss); for (var i:int=0; i<256; i++) { event.currentTarget.graphics.lineTo(i*1.2,50*Math.sin(ss.readFloat()));//显示波频 } } event.currentTarget.value+=1; blur.blurX=event.currentTarget.value; blur.blurY=event.currentTarget.value; glow.alpha-=0.001; if (blur.blurX>20) { event.currentTarget.graphics.clear(); event.currentTarget.removeEventListener(Event.ENTER_FRAME,Run); removeChild(event.currentTarget as DisplayObject); } } } }

 通过flash 可以获取Mp3 数据,其中一项也是很特别的。那就是频谱。今晚无意之中发现上年跟cookbook 做的声音谱频显示,今晚也看了一下,大概接近一下相应的情况。但是还有一点瑕疵。

 暂时先记录一下,明天再写。

继续:

为了获取到声音数据,我们使用一个方法在媒体包里面SoundMixer 类提供一个方法

computeSpectrum(outputArray: ByteArray, FFTMode: Boolean = false, stretchFactor: int = 0): void
[静态] 获取当前声音波形的快照,并将其放在指定的 ByteArray 对象中。
将播放出来的声音存入到ByteArray 里面去。这样一来我们就可以获取到数据了。之后的时候,就是需要通过图像表现出效果出来。
var ss:ByteArray=new ByteArray();
 SoundMixer.computeSpectrum(ss);
文档里面说明:
创建的 ByteArray 对象的大小固定为 512 个浮点值,其中前 256 个值表示左声道,后 256 个值表示右声道。
我们获取浮点值就需要。
根据上面的情况。我们封装一个类。
package { import flash.display.Sprite; import flash.media.*; import flash.events.*; import flash.utils.ByteArray; import flash.filters.*; public class MixerSprite extends Sprite { private var glow:GlowFilter;//发光滤镜 private var blur:BlurFilter; private var key:Boolean=true; private var byte:ByteArray; private var value:Number; private var s_height:Number;//振幅最高度 public static var REMOVE_SELF:String="removeself";//删除自己事件类型 public function MixerSprite(byte:ByteArray,color:uint,s_height:Number=100) { this.byte=byte; this.s_height=s_height; glow=new GlowFilter(color,1,2,2); blur=new BlurFilter(1,1); this.graphics.lineStyle(1,color); this.filters=[glow,blur];//组合滤镜 this.value=Math.random()*8; addEventListener(Event.ENTER_FRAME,Run); } private function Run(event:Event):void { if (key) { key=false; for (var i:int=0; i<256; i++) { this.graphics.lineTo(i*1.2,s_height*Math.sin(byte.readFloat()));//显示波频 } } this.value+=1; blur.blurX=this.value; blur.blurY=this.value; this.scaleX=this.scaleY-=0.04; this.alpha-=0.04; glow.alpha-=0.01; this.filters=[glow,blur]; if (blur.blurX>20) { this.graphics.clear(); this.removeEventListener(Event.ENTER_FRAME,Run); this.dispatchEvent(new Event(MixerSprite.REMOVE_SELF)); } } } }
运行:
package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.media.*; import flash.utils.*; import flash.filters.*; import flash.geom.*; import flash.system.System; import flash.text.*; public class Main extends Sprite { private var sound:Sound;//声音对象 private var channel:SoundChannel; private var memory:TextField=new TextField();//用于显示内存使用状态文本 public function Main() { addEventListener(Event.ENTER_FRAME,onEnterFrame); sound=new Sound(new URLRequest("song.mp3"));//加载声音对象 channel=sound.play(); memory.x=50; memory.y=50; memory.width=100; memory.height=20; addChild(memory); memory.defaultTextFormat=new TextFormat("Arrail",15,0xffffff); } public function onEnterFrame(event:Event):void { memory.text=String(System.totalMemory/1024 )+"/k";//显示内存使用情况 var ss:ByteArray=new ByteArray(); SoundMixer.computeSpectrum(ss); var shape:MixerSprite=new MixerSprite(ss,0x00ff00);//创建图形 shape.x=100; shape.y=200; addChild(shape); shape.addEventListener(MixerSprite.REMOVE_SELF,onComplete);//监听并删除自己 } private function onComplete(event:Event):void { removeChild(event.currentTarget as DisplayObject); } } }
你细心会发现到。这里会借助绘图API 和滤镜的组合使用,而我所采用的是通过一个渐变动画,将滤镜值进行变化,同样对图像进行缩放。
看起来会向后运动 ,离我们的视线越来越远。

  

 观看地址:

Sound Sprite - wonderfl build flash online

转载于:https://www.cnblogs.com/guoyiqi/archive/2010/08/16/2069066.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值