下列範例會使用
SoundMixer.computeSpectrum()
方法,顯示隨著每個影格變化的聲音波形圖表:
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("bigSound.mp3");
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);
}
此範例會先載入和播放聲音檔案,然後偵聽
Event.ENTER_FRAME
事件,此事件將會在聲音播放時觸發
onEnterFrame()
方法。
onEnterFrame()
方法會從呼叫
SoundMixer.computeSpectrum()
方法開始,它會將聲音波形資料儲存在
bytes
ByteArray 物件中。
聲音波形會使用向量繪圖 API 進行標繪。
for
迴圈會循環第一個 256 資料值,以代表左立體聲道,並使用
Graphics.lineTo()
方法從每個點繪製線條到下一個點。第二個
for
迴圈會循環下一組的 256 值,這一次會以反轉順序,並且從右至左進行標繪。產生的聲音波形標繪可能會出現有趣的鏡像效果,如下列影像所示。