ActionScript3 使用sound类——概述(转)

ActionScript3 使用sound类——概述

         声音在程序中的适当应用,比如:游戏、网站等,将有助于丰富用户的感官体验。在flashIDE环境中,我们可以把声音导入到库中,然后拖到时间轴上,或者绑定在MC上就可以了。下面我们要讨论的是如何利用ActionScript 3.0Sound及其相关类实现对声音控制。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

         声音类可以用来加载流媒体文件(比如mp3文件)包括一些被发布在swf文件内部的文件,和一些外部URL加载来的文件。关于域安全的问题,请参看其他资料

·         Sound

·         SoundChannel

·         SoundLoaderContext

·         SoundMixer

·         SoundTransform

         这些是flash.media所包含的一些类,因此,当你要应用这些类的第一要务就是导入这些类,比如:

     import flash.media.Sound

         当然,如果你要使用其他类,你也要做同样的事情(先导入类)

解决第一个问题:

        如何把声音文件作为一个变量加载到swf文件中。

解决方案成业原创,转载说明出处 http://hi.baidu.com/flash_as3

        创建一个Sound对象,然后加载具体的声音文件到里面

具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       创建一个Sound对象和创建其他对象一样简单,首先我们必须保证相关的类已经被导入。

           import flash.media.Sound;

        然后,直接创建声音对象的一个实例就可以了:成业原创,转载说明出处 http://hi.baidu.com/flash_as3
    _sound = new Sound();

        当然,现在你还需要为声音对象一个具体的声音,比如一首歌,结下来,我们在例子中提到的所有音乐都用song.mp3来代替,把它保存在.swf文件同一个目录下。

        要想加载声音文件到刚刚建立的Sound对象中,还要先创建一个URLRequest对象(在此我们还必须导入相关的类importflash.net.URLRequest,通过字符串表示mp3文件的路径:

           soundFile = new URLRequest("song.mp3");

接下来,我们就可以用下面这个语句来实现加载声音文件了:

       _sound.load(soundFile);

当然我们还可以把上面的步骤用下面的方法来实现:

package {
    import flash.display.Sprite;
    import flash.media.Sound;
    import flash.net.URLRequest;    
    public class LoadSoundExample extends Sprite {
        private var _sound:Sound;
        public function LoadSoundExample( ) {
            _sound = new Sound( );
            _sound.load(new URLRequest("song.mp3"));
        }
    }    
}


        上面的类LoadSoundExample就有了一个_sound属性,你可以在任何时候用它来播放音乐。说明一下:此时的声音还并没有开始播放。现在我们只是设置了有一个声音(sound)和它具体是什么样的声音(song.mp3)。具体如何播放该声音请看后面的教程。

下面说一种更快捷的解决上面问题的方法:

public function LoadSoundExample(  ) {
    _sound = new Sound(new URLRequest("song.mp3"));
}


         当你用这种方法创建_sound文件的时候,实际上sound是调用其内部函数load()并开始加载数据了,如果你只想用你的sound对象加载一个声音文件的时候,这时一种非常简便的方法。

         否则,也许先创建一个sound对象,然后当我们有需要的时候,调用它的load方法来加载数据会好一些。这面应用的例子比如:一个音乐播放器,当用户选择了一首歌之后,sound对象调用被选中歌曲的地址,这样就为播发这首歌曲做好准备了。

问题成业原创,转载说明出处 http://hi.baidu.com/flash_as3
          如何播放一个或者停止一个音乐的播放

解决方法

          用sound对象的play()方法开始播放声音,用sound对象的close()方法停止音乐的播放。

具体讨论

          播放一个已经加载好的sound文件时非常简单的,只要调用sound对象的play()方法就可以了,比如:

 _sound = new Sound(new URLRequest("song.mp3"));
 _sound.play(  );

          上面的是最简单的情况,play()方法还有其他的一些附加功能,我们以后讨论。

          用close()函数不止是让声音文件停止了播放,事实上,它还停止了数据流的加载,如果要想在次播放该声音,我们还应该调用load()方法重新加载声音数据。所以,close()方法的使用范围由一些限制,比如我们想暂时停止播放,那该怎么办呢?

        

问题三成业原创,转载说明出处 http://hi.baidu.com/flash_as3

            如何确保声音播放的更流畅

解决方案

           用SoundLoaderContext类设置声音的缓冲

具体讨论

           Sound类控制的是流式音频媒体,也就有了了这样的问题,当我们播放某个文件的时候,很有可能文件还没下载完毕。尤其是一些大文件,比如整首歌长达若干MB的那种。

       根据声音的编码方式(不同的编码方式文件的大小不一样)和可利用的带宽,声音文件的播放速度有可能比其下载速度要快,这样就会导致“播放必须停下来等等下载”。为了避免这种情况的发生,我们可以设置sound对象的缓冲,缓冲可以使sound对象在播放之前预下载一些。这样,如果带宽不足导致播放时断时续,设置缓冲可以有效的解决这个问题。

       默认情况下,sound对象有一秒钟的缓冲,换句话说,就是你让它立即播放,声音文件的播放还是会等后一秒钟的内容下载到本地以后,才播放当前一秒的内容。另外,如果缓冲区被用完而sound对象的播放停下来了,那么后赶来的数据会先把缓冲区填满才允许sound对象播放。

       如果我们不确定网络的具体情况或者声音以高位速编码(每秒钟播放较多位的数据)的时候,我们可以设置缓冲区的大小来保证文件的流畅播放。这时我们要创建一个SoundLoaderContext对象,通过设置缓冲区的大小,(单位:毫秒)来解决这个问题。比如,我们可以这样做来创建5秒钟的缓冲:

         buffer = new SoundLoaderContext(5000);

应用这个缓冲有两种方法:

         1.  在创建sound对象的时作为参数使用;

         2.  在使用sound对象的load()方法时作为参数使用。

具体代码如下:

//在创建sound对象的时作为参数使用;


     

 var request:URLRequest = new URLRequest("song.mp3");
      var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
      _sound = new Sound(request, buffer);
      _sound.play(  );


//在使用sound对象的load()方法时作为参数使用。

       
 var request:URLRequest = new URLRequest("song.mp3");
        var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
        _sound = new Sound(  );
        _sound.load(request, buffer);
        _sound.play(  );

问题四

       如何实现声音文件从指定位置开始播放

解决方法成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       通过设置play()方法的开始时间

具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3

可能会有这样的情况:我们想播放一个声音,但是并不是从它的开端开始播放。换句话说,你想把音乐的前面剪切掉一段进行播放。Sound对象为我们提供了一种简单而有效的方法来解决这个问题,让我们能指定声音从什么位置开始播放,精确到毫秒。

如果我们不带任何参数地调用sound对象的play()方法,那么它会从文件的开端开始播放。但是我们还可以在调用的时候添加一个数字类型的参数,指定声音文件从第多少毫秒开始播放。比如:下面的代码将表示从文件的开端向后跳5.5秒开始播放:

_sound.play(5500);

这个方法特别有助于我们解决这样的问题:我们手头的声音文件头部有一些内容是我们不想要的,但是又不好编辑这个声音文件,我们就可以用这个方法来跳过我们不要的部分。

另外一个例子是:我们手头有某人的讲话录音,他在开始的时候说了各部分的要点。现在,允许用户自由选择他们感兴趣的部分。这时,我们就可以把各部分开始的时间存放在一个数组里,然后通过选择的部分可以从数理找到对应的开始时间(开始位置),再把这个时间传给play()方法。下面是例程:

package {
    import flash.display.Sprite;
    import flash.media.Sound;
    import flash.net.URLRequest;    
    public class CuePoints extends Sprite {
        private var _sound:Sound;
        private var _cuePoints:Array;        
        public function CuePoints(  ) {
            _cuePoints = [0, 10000, 30000, 68000, 120000];
            _sound = new Sound(new URLRequest("song.mp3")); 
            // 从第二点开始播放(第30秒开始)
            playCuePoint(2);
        }
        public function playCuePoint(index:int):void {
            _sound.play(_cuePoints[index]);
        }
    }    
}


当然,这是一个很不完善的应用程序,具体操作的时候,我们还应该有一些按钮,或者其他的和用户交互的对象,党和用户进行交互的时候把它的索引值(index)传递给上面的playCuePoint()方法就可以了。

问题五

如何重复播放同一个音乐(循环播放)

解决方案

设置play()方法的looping参数

具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       当我们播放一个声音文件的时候,默认情况下,它会从头到尾只播放一次,然后就停下来了。有时候我们会要求同一个音乐循环播放多次,甚至一直循环播放下去。比如:我们在做游戏(或者网站)的时候可能会用一个比较短小的音乐作为其背景音乐,让它循环播放,使其听起来像是一首比较长的曲子。成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       设置声音文件循环次数的方法是改变play()方法的第二个参数来实现的。当然我们要想怎么做的前提是必须设置第一个参数,可以参看教程四。如果我们就是想从文件的开端进行播放,只要设置第一个参数为0就可以了,就像这样:

       _sound.play(0, 3);成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       上面这个设置的结果是:让声音文件从头开始播放三次。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       我们极易发现一个小问题,如果我们设置looping值为1,那么循环一次;如果我们设置looping值为0(甚至不设置),那么文件也是循环播放一次。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       我们没有一个固定的参数来使得文件循环播放无限次,尽管如此,我们可以设置一个非常大的值。有一个简单的方法来实现这个问题:设置循环次数为int.MAX_VALUE,它是int类型的最大值,它等于2,147,483,647。一个简单的数学计算题,甚至我们的声音文件只有1秒钟,只要你循环2,147,483,647次,那将播放至少70年,这可以认为是无数次了吧:)

问题六

       我们想创建一个声音文件加载情况的进度条,这就要求我们能获取文件的大小,及已经下载了多少了。

解决方法

       访问sound对象的bytesTotalbytesLoaded属性。

具体讨论成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       对于流式的音频文件,让用户知道目前已经下载了多少数据是个不错的想法。理想情况是:声音文件的下载速度比播放速度快,这样就不会在播放的时候暂停。但是,在不稳定的网络和带宽比较窄的情况下,如果声音文件的编码率比较高,就很难保证缓冲区里总是非空的,也就很难保证不会出现暂停。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       因此,用进度条来向用户展示目前声音的加载和播放情况是一个不错的选择。你也许看过很多流媒体播放器的进度条,比如Windows Media PlayerQuickTime Player。通常,会有一个进度条表示音乐的播放进度,进度条的背景色是白色的,前景有一个黑色的进度条表示目前播放的位置,另外,还有一个灰色的进度条表示目前缓冲区的情况。当灰色的进度条(缓冲buffer)比黑色的进度条(当前播放位置play position)长的时候,我们知道文件播放很流畅;当黑色的进度条赶上灰色的进度条的时候,媒体会停止播放,灰色进度条继续变长,继续向缓冲区加载数据,当它足够长的时候,媒体会继续播放,黑色进度条会继续移动,这时灰色进度条就有希望一直领先了。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       本文教你如何实现创建上面提到的灰色进度条和白色背景(以后我们将学习如何创建黑色进度条),要用到声音对象的两个属性bytesTotalbytesLoaded这些属性的含义相当明了:bytesTotal包含mp3文件总长度的信息,bytesLoaded包含当前已经下载了多少数据的信息。有了这两个值,我们就有了数据下载的百分比。

成业原创,转载说明出处 http://hi.baidu.com/flash_as3

       下面的例子设定了enterFrame的处理函数,让影片每播放一帧就重新计算当前下载百分比,然后根据这个绘制进度条。

点击打开链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值