2012年6月28日 星期四

[AS3][Sound]Sound相關的一些測試

其實是之前遇到的一個問題~~
就是  sound 輪播得時候 會有小中斷的感覺!
這個問題有兩個層面!

第一個
就是 sound 檔本身的處理的問題
Ticore大大寫的這篇 解決 Mp3 循環音效停頓的問題
可以解決這個問題

第二個
就是使用 sound.play()
然後聽他的 complete 的事件
然後再一次的使用 sound.play() 去播放
通常這樣的都是為了準確的了解這個聲音是否 結束了沒有!

我自己的聲音播放的類別也是這樣做~
不過聽說使用 sound.play(0, 次數)
卻不會有 斷音的問題

所以我就寫了測試程式測試~
//


package demo
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;
 
    import ui.sound;
 
    public class soundDemo extends Sprite
    {
        private var soComp:Sound;
        private var soCompChannel:SoundChannel;
        //
        private var soLoop:Sound;
        private var soLoopChannel:SoundChannel;
     
        public function soundDemo()
        {
            super();
            soComp = new sound();
            soCompChannel = soComp.play();
            soCompChannel.addEventListener(Event.SOUND_COMPLETE, onSoundCompleteFun);

            soLoop = new sound();
            soLoopChannel = soLoop.play(0, int.MAX_VALUE);
            soLoopChannel.addEventListener(Event.SOUND_COMPLETE, onSoundCompleteFun);
         
            this.addEventListener(Event.ENTER_FRAME, onEnterFrameFun);
        }
     
        private function onSoundCompleteFun(e:Event):void
        {
            soCompChannel.removeEventListener(Event.SOUND_COMPLETE, onSoundCompleteFun);
            soCompChannel = soComp.play();
            soCompChannel.addEventListener(Event.SOUND_COMPLETE, onSoundCompleteFun);
        }
        //
        private function onEnterFrameFun(e:Event):void
        {
            var flag:Boolean = false;
            if(soCompChannel.leftPeak == 0) flag = true;
            if(soCompChannel.rightPeak == 0) flag = true;
            if(flag) trace('soCompChannel lp : ' + soCompChannel.leftPeak + ' rp: ' + soCompChannel.rightPeak);
//          
            flag = false;
            if(soLoopChannel.leftPeak == 0) flag = true;
            if(soLoopChannel.rightPeak == 0) flag = true;
            if(flag) trace('soLoopChannel lp : ' + soLoopChannel.leftPeak + ' rp: ' + soLoopChannel.rightPeak);
        }
    }
}

//
用上面的程式測試! 會發現有下面的 trace
//

soCompChannel lp : 0 rp: 0
soLoopChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
soCompChannel lp : 0 rp: 0
//
就程式面的角度看! 
是代表聽 事件 重播的機制會讓 channel 有一個影格左右的沒有聲音!
因為我自己試聽不出來一個影格的差異 !
所以我是這樣去看到底有沒有斷音!
總之結論是使用 原生 sound.play 去 LOOP 
會比聽事件 去 loop 順

上面的測試環境 
聲音是使用 SWC 鑲進去的
如果是使用 
soComp = new Sound(new URLRequest('../asset/sound.mp3'));
的方式 測試也是一樣 ! (以我手邊第一次處理的 MP3)



不過~我後來有處理另外一個WAV
用SWC 的方式 是只有開始會有 0
但是使用 new URLRequest 的方式~
卻是和聽事件的一樣! 會中斷!
所以還是要看 Sound 檔

沒有留言 :