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("http://www.gequxiazai.cn/x/gequ/rm/tq00x4074/7d5e3954b2740a48/7f6a258ce575f888.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);
//获取当前声音波形的快照,并将其放在指定的 ByteArray 对象中
var g:Graphics = this.graphics;
//创建矢量形状
g.clear();
//清除之前图形
g.lineStyle(0, 0x6600CC);
//线条样式
g.beginFill(0x6600CC);
//填充颜色
g.moveTo(0, PLOT_HEIGHT);
//绘制图形
var n:Number = 0;
//左声道
for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
n = (bytes.readFloat() * PLOT_HEIGHT);
//读取一个 IEEE 754 单精度浮点数s
g.lineTo(i * 2, PLOT_HEIGHT - n);
}
g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
//绘制一条从当前绘画位置开始到 (x, y) 结束的直线
g.endFill();
//右声道
g.lineStyle(0, 0xCC0066);
//指定一种线条样式
g.beginFill(0xCC0066, 0.5);
//指定一种简单的单一颜色填充
g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
//将当前绘画位置移动到 (x, y)
for (i = CHANNEL_LENGTH; i > 0; i--) {
n = (bytes.readFloat() * PLOT_HEIGHT);
//读取一个 IEEE 754 单精度浮点数s
g.lineTo(i * 2, PLOT_HEIGHT - n);
//绘制一条从当前绘画位置开始到 (x, y) 结束的直线
}
g.lineTo(0, PLOT_HEIGHT);
//绘制一条从当前绘画位置开始到 (x, y) 结束的直线
g.endFill();
//对从上一次调用 beginFill()方法之后添加的直线和曲线应用填充
}
function onPlaybackComplete(event:Event) {
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
//删除侦听器
}