以波形的形式来显示声音,这样的效果以前我一直做不到,但到了 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 并非都是要写到类文件中去的)
最近一直忙出差、忙孩子,分析了个连连看,却没有时间来写教程,好些天没写博客了,很想大家,祝大家学习愉快!
没想到安全沙箱的问题在这里给遇上了,暂时没什么好办法,只好把歌曲传到博客里来,避免跨域访问。