第10讲 声音控制

      Flash学习笔记 2008-7-26 23:30

  传统的声音对象现在有了新助手了,这个助手就是SoundChannel,当一首曲子开始播放之后,SoundChannel就产生了,通过它可以完成一些新的功能,所以从某种意义上来说 Sound 类是用来包装 SoundChannel的,因为后者具有了很多重要的功能,并且似乎在未来也将会委以重任。

  声音波谱功能也是自 flash8以来一个比较受欢迎的功能,有了这个,真得是可以做一个全功能的 mp3 播放器了。

下面的代码显示了声音波谱的功能,其效果实现的原理是利用从波谱中得到的数据,在位图中以点的形式刷出来,因为数据在不断的刷新,就会出现一个波浪线跳动的效果。

package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
 import flash.media.SoundMixer;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
   
       
    public class Spectrum extends Sprite {
        private var _sound:Sound;
        private var _channel:SoundChannel;
        private var _spectrumGraph:BitmapData;
               
        public function Spectrum(  ) {
            // Create bitmap for spectrum display
            _spectrumGraph = new BitmapData(256, 60,
                                             true,
                                             0xff000000);  // 以画色背景画出做图区域。

            var bitmap:Bitmap = new Bitmap(_spectrumGraph);
            addChild(bitmap);//显示位图背景
            bitmap.x = 10;
            bitmap.y = 10;

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            _sound = new Sound(new URLRequest("song.mp3"));
            _channel = _sound.play(  );//加载声音并播放
        }
       
        public function onEnterFrame(event:Event):void
        {
            // Create the byte array and fill it with data
            var spectrum:ByteArray = new ByteArray(  );
            SoundMixer.computeSpectrum(spectrum);
           
            // Clear the bitmap
            _spectrumGraph.fillRect(_spectrumGraph.rect, 0xff000000);// 有点搞不懂 .rect 是从何而来的.
            
            // Create the left channel visualization
            for(var i:int=0;i<256;i++) {
                _spectrumGraph.setPixel32(i,
                              20 + spectrum.readFloat(  ) * 20,   0xffffffff);//readFloat 函数似乎是读取一个值就自动向后移动一位,因此可以完整的读出全部的数据.

            }
           
            // Create the right channel visualization
            for( i =0;i<256;i++) {
                _spectrumGraph.setPixel32(i,                              40 + spectrum.readFloat(  ) * 20,
                              0xffffffff);
            }
        }      
    }
}

  Sound 类本身具备加载的功能(估计是因为这个功能实在是太常用到了),利用它的加载事件,可以做出加载时的进度条,书中给出了这方面的例子,但是我的测试是不成功的,试了半天也没成功,所以就放弃了.

  声音控制这一章中解决了许多经常会遇到到的问题,例如:声音的加载、音量控制、加载进度的显示、播放进度的显示,声音波谱的应用、声音的平衡控制、暂停与继续、歌曲列表的使用,在章节的最后,实现了一个“全功能”的mp3播放器,剩下的工作似乎只是界面方面的问题了。本章非常的实用,建议详读之。

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

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