.media.Sound是AS3.0处理声音的类,支持mp3。
使用f9a可以使嵌入的声音被支持的格式范围变大,但是和编程无关。
使用这个类可以让flash播放出声音:嵌入的声音
import *;
class EmbedSoundExample extends Sprite{
[Embed (source="Cubana.mp3")]
var EmbedSound:Class;
public function EmbedSoundExample(){
var sd:Sound = new EmbedSound();
sd।play();
}
}
簡単使用外部声音,记得注册监听器,方法参考Sound.load,
和任何一个产生Event.COMPLETE事件的EventDispatcher一样处理,不再详述。
总之,现在可以听见声音了。留心:
play(p1,p2,st:SoundTransform);第三个参数。
SoundTransform 是声音的变换,就是调节左右声道音量大小的
SoundMixer(混响器)是一个静态类。用来提供对所以声音的全局的支持。
这个类的其中一个可以赋值的属性是SoundTransform类型的。这样,
SoundMixer就能操作这个SoundTransform了。虽然没有什么用,但是通过
这样的赋值就可以把Sound实例和这个静态类关联起来,从而使用SoundMixer.computeSpectrum
方法来计算正在播放的声音当前的频率信息。
SoundMixer.computeSpectrum(输出数组:
ByteArray, 输出模式:Boolean(
布朗值) = false, 伸长因数:int[
整数] = 0)
第一个参数:这个ByteArray的结构,是512个浮点数,前256个是左声道的波谱数据,后256个是右声道的波谱数据,而经过多次trace...我发现如果用for(var i=0;i<256,i+=2[
这里可以换成任何2的倍数])来读取波谱数据的话,会
自动读取ByteArray[ i ]的数据,这一点大大方便了可视化声音效果的制作...
第二个参数:如果把
输出模式(第二个参数)设置为
true的话,适合做
条形图或者是
环形图,设置成false,就是用来做
波形图的
第三个参数:"
伸长因数",如果设置成
0,数据会以
44.1 KHz取样;设置成
1,以
22.05 KHz取样,设置成
2,以
11.025KHz取样(
所以0是最优的取样质量)
参数是采样率,基数是1/2。参数值默认是0,这表示1/2的0次方,原声采样;1表示1/2的1次方,
采样率是原来的1/2。当然不会希望只采样一次,所以要决定间隔多少时间采样一次,
package
{//导入类//Sprite是一个只有一帧的MovieClip,相对于MovieClip少了帧和场景...import flash
.display
.Sprite
;//事件类import flash
.events
.*;//声音类import flash
.media
.Sound;//混音器类import flash
.media
.SoundMixer
;//声音通道类(暂时这么翻吧)import flash
.media
.SoundChannel
;//URLRequest类import flash
.net
.URLRequest
;//二进制数组类import flash
.utils
.ByteArray
;//定义类public class SwfdongSound
extends Sprite
{ //声明MP3路径 private var url:String = "MySound.mp3"; //声明一个Sound对象 private var DongSound
:Sound = new Sound(); //声明一个SoundChannel对象 private var sChannel
:SoundChannel
; //声明一个ByteArray对象 private var bArray
:ByteArray
= new ByteArray
(); //声明一个数组对象 private var Ary
:Array; //声明一个数字对象 private var n
:Number = 0
; //初始化函数 public function SwfdongSound
() { var req
:URLRequest
= new URLRequest
(url); DongSound
.load(req
); //播放 DongSound
.play(); //添加一个EnterFrame的侦听器,同以前的this.onEnterFrame=showBar(); this.addEventListener
(Event
.ENTER_FRAME
,showBar
);}private function showBar
(event:Event
){ n
= 0
; //清除绘图 this.graphics
.clear(); //将当前声音输出为ByteArray SoundMixer
.computeSpectrum
(bArray
,true,0
); for(var i
=0
; i
< 256
; i
=i
+16
){ //在ByteArray中读取一个32位的单精度浮点数(这个是livedoc上写的,实际就是把数据流读取成浮点数) n
= bArray
.readFloat
(); //这个实际作用是把n扩大一下 var num
:Number = n
*360
; //设置线条样式,颜色湖蓝,宽度10,透明度100 this.graphics
.lineStyle(10
,0x99FF00
,100
,false,"noSacle","none"); //移动到x坐标50+i,y坐标200的位置 this.graphics
.moveTo(50
+i
,200
); //向上画图 this.graphics
.lineTo(50
+i
,200
-num
/5
); } }}}
这里有两个要点:1.新的EnterFrame的用法,大家应该可以看到了吧:
this.addEventListener(Event.ENTER_FRAME,yourfunction);
2.波谱数据的读法:先输出一个ByteArray,然后转成浮点数,再用For来生成跳动的条条(如果你希望条的数量多一些,就把i每次加的数量减少就可以了)...当然,你可以发挥想象力,做出线性,变颜色的(如外国闪客的"圆环套圆环")...
var timer:Timer = new Timer(interval_here);
//多长时间一次自己决定吧。
timer.addEventListener("timer",snap);
//唉,snap是快照唉,
timer.start();
这样就能每隔 interval_here 毫秒计算一次了。不要使用setInterval,
不要使用Event.ENTER_FRAME,
开始写代码:
package {
import flash.display.*;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundTransform;
import flash.media.SoundMixer;
import flash।net।URLRequest;
import flash.utils.ByteArray;
import flash.utils.Timer;
//在Flash8発表用的代码 /
public class SoundSoundSound extends Sprite{
//默认采用计算波形 /
public var fft:Boolean = false;
//constructor兼main
//嵌入声音 //
[Embed(source="Cubana.mp3")]
private var EmbedSound:
Class; public function SoundSoundSound(){
//请stage不要缩放
scaleMode = StageScaleMode।NO_SCALE;
//为了防止上传文件太大,我还是使用外部声音咯,其实我也没打算上传文件--b
//创建一个声音对象,并加在外部声音资源
var sd:Sound = new Sound();
सद.addEventListener(Event।COMPLETE,onComplete);
sd.load(new URLRequest("Cubana.mp3"));
//嵌入声音这样使用咯
var sd:Sound = new Sound();
एस.play(0,0,SoundMixer।soundTransform = new SoundTransform());
*/ //用timer的好处是可以方便的停掉它,但是这里没有体现
var timer:Timer = new Timer(10);
//设置10毫秒
timer.addEventListener("timer",onEnterFrame); timer.start(); }
//如果使用外部声音,要使用监听器
private function onComplete(e:Event):void{ Sound(e.target).play(0,0,SoundMixer.soundTransform = new SoundTransform()); }
//param e timer事件 /
private function onEnterFrame(e:Event):void{
//准备一个ByteArray实例
var b:ByteArray = new ByteArray();
//计算频率,并填充到上面创建的ByteArray实例
SoundMixer.computeSpectrum(b,fft,4); clear(); draw(b); }
//初始化屏幕
private function clear():void{ graphics.clear(); graphics.lineStyle(1); graphics.moveTo(10,200); }
//每隔一段时间根据数据绘制,可以重写这个函数,但是完全没有必要~~ * 这是一个默认实现
//绘制用的数据ByteArray //
protected function draw(b:ByteArray):void{ var i:int=0; b.position = 0;
//防止万一,这句是不必要的,我认为 //画,因为太长了,有2048那么长,所以我只画了1/4,剩下的不要了
while(b.bytesAvailable>b.length*0.75){ graphics.lineTo(++i+10,-0.1*(b.readByte())+200); } } }}