flash 构建简单的声音可视化程序

作者:袖梨 2022-07-02

 
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);
 //删除侦听器
}

相关文章

精彩推荐