Flash9 声音波形示例

      Flash学习笔记 2007-10-8 22:39

  以波形的形式来显示声音,这样的效果以前我一直做不到,但到了 flash9,终于可轻松些的用出来了,真是一件喜事,这能算得上是我喜欢flash9的又一个理由的吧。

  示例代码直接就在帮助文件中给了出来,这么体贴的软件真是值得多看看。

  原代码的位置在:帮助文件-》ActionScript 3.0 编程-》处理声音 > 访问原始声音数据

  

  以波形形式来显示声音,重点就在于读取原始声音的数据,以前可真是没想到,(呵呵,想到了也办不到啊,自已来写个声音的解码器,难度那是相当滴大。) 终于有一天,面包有了,一切都有了。估计大家都有帮助文件,具体的文字就不多说了,简而言之,能简单改写的代码就是SoundMixer.computeSpectrum(bytes, bFlag, 0); 第二个参数,这里我做了个小手术,让这个参数可变,因此,可以在两种模式中进行转换,本人比较喜欢柱状图。

  声音数据的具体内容没时间细看了,有这方面应用的朋友自己测试吧。这里发一个修改过的示例代码,音乐来自网上,后街男孩很好听的一首歌。

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 = 100;
const CHANNEL_LENGTH:int = 256;

/////////////  add by dzxz //////////////////////
var bFlag = true; // 在两种模式中进行切换
btn.addEventListener(MouseEvent.CLICK, btnClick);

function btnClick(evt:MouseEvent) {
 bFlag = !bFlag;
}
/////////////   the end    //////////////////////

var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("http://202.201.0.179/mp3/mp3/backstreet/03.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, bFlag, 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);
}

  将代码拷到主场景中,加一个元件,实例名为 btn,直接运行就可以了。(再一次证实 as3 并非都是要写到类文件中去的)

  最近一直忙出差、忙孩子,分析了个连连看,却没有时间来写教程,好些天没写博客了,很想大家,祝大家学习愉快!

  没想到安全沙箱的问题在这里给遇上了,暂时没什么好办法,只好把歌曲传到博客里来,避免跨域访问。

标签集:TAGS:as3 声音 波形
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}