AS3.0声音处理

一、类的结构

查看flash.media包,这个包是用来处理声音、视频、照相机和麦克风的。对于处理声音来说就有6各类。现在分别对他们概括一下。

 

Sound类【Sound 类允许您在应用程序中使用声音。 使用 Sound 类可以创建新的 Sound 对象、将外部 MP3 文件加载到该对象并播放该文件、关闭声音流,以及访问有关声音的数据,如有关流中字节数和 ID3 元数据的信息。 可通过以下项对声音执行更精细的控制:声音源(声音的 SoundChannel 或 Microphone 对象)和 SoundTransform 类中用于控制向计算机扬声器输出声音的属性。

Sound类用来加载声音别可播放声音。其载入声音有两个方式:下面是其构造函数

 

public function Sound(stream:URLRequest = null, context:SoundLoaderContext = null)

URLRequest :通过URL请求访问文件  new URLRequest (str:String);

SoundLoaderContext:MP3 数据保留在 Sound 对象的缓冲区中的最小毫秒数。 在开始回放以及在网络中断后继续回放之前,Sound 对象将一直等待直至至少拥有这一数量的数据为止。 默认值为 1000(1 秒)。

 

第一种:通过URL访问网上或者本地mp3文件,下面是访问本地一个名为1.mp3的文件,此文件要求和此项目的fla文件放到一起。

var sound:Sound=new Sound();//默认是不会加载文件的

var url:URLRequest=new URLRequest("1.mp3");

sound.load(url);

sound.play();//播放音乐    返回一个SoundChannel 类实例

 

第二种:通过嵌入到程序中,使用swc文件

打开cs4,文件->导入->库或者舞台。如果说声音文件导入失败,就用千千静听转化一下就可以了。导入成功后,打开库,右键属性

AS3.0声音处理 - 溜盲侠士 - 咦,快看

 设置完后确定。最后就是导出swc文件了,点击发布设置,点击Flash,在“swf设置”中选中“导出swc”复选框。点击确定。

记住,生成的所以文件最后放到同一个文件夹,如果不是有可能失败。

 

SoundChannel类【SoundChannel 类控制应用程序中的声音。 Adobe ? Flash ? 应用程序中播放的每一个声音都被分配到一个声道,而且应用程序可以具有混合在一起的多个声道。 SoundChannel 类包含 stop() 方法、用于监控声道幅度(音量)的属性,以及用于对声道设置 SoundTransform 对象的属性。

例如:var soundChannel:SoundChannel=sound.play();

         soundChannel.stop();//停止声音

在此类中有一个重要是属性,那就是position属性,用来保存当前音乐播放的位置。以毫秒为单位。

 

SoundTransform类【SoundTransform 类包含音量和平移的属性。 以下对象包含 soundTransform 属性,该属性的值是一个 SoundTransform 对象:Microphone、NetStream、SimpleButton、SoundChannel、SoundMixer 和 Sprite。

此类和声音音量有关,可以调节声音。它可以通过SoundChannel的soundTransform属性获得,例如下面的实例:

        var soundChannel:SoundChannel=sound.play();

         var soundTf:SoundTransform =soundChannel.soundTransform;

        soundTf.volume=0.7;//把声音调节为70%音量

 

SoundMixer类【SoundMixer 类包含 SWF 文件中全局声音控件的静态属性和方法。 SoundMixer 类控制 SWF 中嵌入的声音流;它并不控制动态创建的 Sound 对象(即在 ActionScript 中创建的 Sound 对象)。

此类非常简单,就是可以控制所有的声音。不可以控制单个声音。包括对声音的音量和关闭所有是声音。

其还有一个重要的操作就是可以计算操作声音的频谱。什么叫频谱其实我也不知道。最重要的就是你学会了就可以做出像windows Media layer

中的声音的可视效果。

 

ID3Info类【

ID3Info 类包含反映 ID3 元数据的属性。 可以通过访问 Sound 类的 id3 属性来获取 MP3 文件的其它元数据;例如,mySound.id3.TIME。 有关详细信息,请在 http://www.id3.org 上参阅 Sound.id3 条目和 ID3 标签定义。

理解其实很简单,就是ma3文件规范,定义一些ID3规范信息。对ID3信息编码,以后根据ID3规范解码就可以播放声音。通过这个类你可以不必知道ID3数据的形式,知道你会使用此类就可以非常简单的访问到ID3文件中描述的例如歌曲名,作者等等。

二,实例代码

下面的代码主要就是实现音乐播放器的基本功能,重放,播放,停止,暂停,快进和快退。

最主要的思想就是如果想调整声音,首先必须要先stop()声音。例如重放,快进和快退,都要事先停止声音。为了可以回到先前播放的位置,可以通过   SoundChannel.postion来得知。

属性值的返回:

SoundChannel=Sound.play();

SoundTransform=SoundChannel.soundTransform

要想知道声音播放的位置,可以通过Sound的play方法返回SoundChannel类来实现,要想可以调节声音大小

可以通过SoundChannel的soundTransform属性来返回SoundTransform类来实现。

 

下面是一个标签,用来显示按钮的标签名字:

package  
{
 import flash.text.TextField;
 
 /**
  * ...
  * @author 戢晶晶
  */
 public class ButtonLabel extends TextField{
  public function ButtonLabel(label:String) {
   this.textColor = 0xffffff;
   text = label;
   this.mouseEnabled = false;
  }
  
 }
 
}

 

下面就是主类,

 

package 
{
 import adobe.utils.ProductManager;
 import flash.accessibility.AccessibilityProperties;
 import flash.display.Sprite;
 import flash.events.*;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.media.SoundLoaderContext;
 import flash.net.*;
 import flash.errors.*;
 import flash.text.TextField;
 import flash.ui.ContextMenuBuiltInItems;
 import flash.utils.Timer;
 
 
 /**
  * ...
  * @author 戢晶晶
  * 此项目用来创建一个音乐播放器,可以对声音的播放,暂停,快进和快退,重新播放和停止
  */
 public class Main extends Sprite {
  private var soundPosition:int;//用来记录当前音乐的位置,暂停的位置
  private var start:Boolean=true//是否开始播放音乐
  /*
   *   分别是重放,播放,停止,快进和快退,绘制颜色分别是
   *        红色  ,绿色,黑色,蓝色,其他颜色
   */
  private var replaySprite:Sprite, playSprite:Sprite, stopSprite:Sprite, speedSprite:Sprite, recedeSprite:Sprite;
  private const moveSpeed:int=2000;//快进和快退的移动速度
  private var sound:Sound;//音乐类
  
  private var soundC:SoundChannel;//声音的控制
  public function Main():void {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
  
  private function init(e:Event = null):void {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   // entry point
   replaySprite = new Sprite();
   replaySprite.graphics.beginFill(0xff0000);
   replaySprite.graphics.drawRect(0, 0, 50, 50);
   replaySprite.graphics.endFill();
   addChild(replaySprite);
   replaySprite.addChild(new ButtonLabel("relay"));
   replaySprite.name = "replaySprite";
   
   playSprite = new Sprite();
   playSprite.graphics.beginFill(0x00ff00);
   playSprite.graphics.drawRect(0, 0, 50, 50);
   playSprite.graphics.endFill();
   addChild(playSprite);
   playSprite.x = 60;
   playSprite.addChild(new ButtonLabel("play"));
   playSprite.name = "playSprite";
   
   stopSprite = new Sprite();
   stopSprite.graphics.beginFill(0x0);
   stopSprite.graphics.drawRect(0, 0, 50, 50);
   stopSprite.graphics.endFill();
   addChild(stopSprite);
   stopSprite.x = 120;
   stopSprite.addChild(new ButtonLabel("stop"));
   stopSprite.name = "stopSprite";
   
   speedSprite = new Sprite();
   speedSprite.graphics.beginFill(0x0000ff);
   speedSprite.graphics.drawRect(0, 0, 50, 50);
   speedSprite.graphics.endFill();
   addChild(speedSprite);
   speedSprite.x = 180;
   speedSprite.addChild(new ButtonLabel("march"));
   speedSprite.name = "speedSprite";
   
   recedeSprite = new Sprite();
   recedeSprite.graphics.beginFill(0xff8080);
   recedeSprite.graphics.drawRect(0, 0, 50, 50);
   recedeSprite.graphics.endFill();
   recedeSprite.x = 240;
   addChild(recedeSprite);
   recedeSprite.addChild(new ButtonLabel("recede"));
   recedeSprite.name = "recedeSprite";
   
   //注册主场景的按钮点击监听
   addEventListener(MouseEvent.CLICK,onClick);
  }
  
  private function onClick(e:MouseEvent):void {//鼠标单击事件
   var sp:Sprite = (e.target as Sprite);
   if (sp == playSprite) {//播放音乐
    playSound(soundPosition);
   }else if (sp == stopSprite) {//停止音乐
    stop();
   }else if (sp == replaySprite) {//重放音乐
    replay();
   }else if (sp == speedSprite) {//快进音乐
    march();
   }else if (sp == recedeSprite) {//快退音乐
    recedeS();
   }
  }
  /*
   *   播放音乐
   * sp Nubmer 声音播放的位置
  */
  public function playSound(sp:Number=0):void {
    if (sound==null) {
     sound = new MySound();//创建声音对象
    }
    if(start){
       soundC = sound.play(sp);
       start = false;
    }else {
     if (soundC) {//如果声音控制对象存在
            pause();
         start = true;
         }
    }
    
  }
  
  public function pause():void {//暂停音乐
   if (soundC) {
    soundPosition = soundC.position;//记录暂停的位置
    soundC.stop();//停止音乐
   }
  }
  
  public function stop():void {//暂停声音
   if (soundC) {
    soundPosition = 0;
    start = true;
    soundC.stop();
    soundC = null;
    sound = null;
   }
  }
  
  public function march():void {//快进
   if (soundC) {
    soundPosition += moveSpeed;//快进的步数
    if (soundPosition > sound.length) {//超过
     stop();
     return;
    }
    soundC.stop();
    start = true;
    playSound(soundPosition);
   }
  }
  
  public function recedeS():void {//快退
   if (soundC) {
    soundPosition -= moveSpeed;
    if (soundPosition <= 0) {
     trace("soundPosition="+soundPosition);
     stop();
    }
   }
  }
  
  public function replay():void {
      stop();
      playSound();
  }
 }
 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值