本系列Flash教程由中國(guó)教程網(wǎng)Flash互助課堂專(zhuān)為Flash新手制作,更多教程和練習(xí)請(qǐng)點(diǎn)擊這里,在這里有系列的教程、練習(xí),并有老師對(duì)練習(xí)進(jìn)行點(diǎn)評(píng)與指導(dǎo),歡迎朋友們的光臨!
在學(xué)習(xí)中遇到問(wèn)題請(qǐng)到 論壇 發(fā)貼交流!
更多AS 3.0教程:http://www.jcwcn.com/article/special/200906/special_59.html
本例為Flash AS3.0實(shí)例教程,在教程中我們將學(xué)習(xí)運(yùn)用SoundMixer.computeSpectrum() 方法來(lái)構(gòu)建簡(jiǎn)單的聲音可視化程序(即波形圖),希望能給朋友們帶來(lái)幫助~~
AS3.0構(gòu)建簡(jiǎn)單的聲音可視化程序(波型圖)
使用 SoundMixer.computeSpectrum() 方法來(lái)顯示聲音波形圖
import flash.display.Graphics; import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundMixer; import flash.net.URLRequest; const PLOT_HEIGHT:int = 200; const CHANNEL_LENGTH:int = 256; var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("月亮之上.mp3"); //配置聲音源文件地址(此為本地,可配置遠(yuǎn)程) snd.load(req); var channel:SoundChannel; channel = snd.play(); addEventListener(Event.ENTER_FRAME, onEnterFrame); snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); var bytes:ByteArray = new ByteArray(); function onEnterFrame(event:Event):void { SoundMixer.computeSpectrum(bytes, false, 0); var g:Graphics = this.graphics; g.clear(); g.lineStyle(0, 0x6600CC); g.beginFill(0x6600CC); g.moveTo(0, PLOT_HEIGHT); var n:Number = 0; // left channel for (var i:int = 0; i < CHANNEL_LENGTH; i++) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); g.endFill(); // right channel g.lineStyle(0, 0xCC0066); g.beginFill(0xCC0066, 0.5); g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT); for (i = CHANNEL_LENGTH; i > 0; i--) { n = (bytes.readFloat() * PLOT_HEIGHT); g.lineTo(i * 2, PLOT_HEIGHT - n); } g.lineTo(0, PLOT_HEIGHT); g.endFill(); } function onPlaybackComplete(event:Event) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); } |
先加載并播放一個(gè)聲音文件,然后在播放聲音的同時(shí)偵聽(tīng)將觸發(fā) onEnterFrame() 方法的 Event.ENTER_FRAME 事件。onEnterFrame() 方法先調(diào)用 SoundMixer.computeSpectrum() 方法,后者將聲音波形數(shù)據(jù)存儲(chǔ)在 bytes ByteArray 對(duì)象中。
聲音波形是使用矢量繪圖 API 繪制的。 for 循環(huán)將循環(huán)訪問(wèn)第一批 256 個(gè)數(shù)據(jù)值(表示左立體聲聲道),然后使用 Graphics.lineTo() 方法繪制一條從每個(gè)點(diǎn)到下一個(gè)點(diǎn)的直線。第二個(gè) for 循環(huán)將循環(huán)訪問(wèn)下一批 256 個(gè)值,此時(shí)按相反的順序(從右到左)對(duì)它們進(jìn)行繪制。生成的波形圖可能會(huì)產(chǎn)生有趣的鏡像圖像效果。