Recently, I had spent a lot of time on sound playback of Flash Player 10, but I can't slove a performance issue in none-ActiveX architecture. I will get stutter/machine gun sound when I load a heavy load web page at the same time in Firefox/Chrome/Safari. this case don't happen in IE, and I always get smooth sound.
The root cause of this issue is used to extract method of Sound class for retract samples, and then play by extracted samples. You may ask me, why don't use play method of Sound class directly? I think I only answer you that it's business requirements.
Following are my test code:

 package
package  {
{
 import flash.events.Event;
    import flash.events.Event;
 import flash.events.SampleDataEvent;
    import flash.events.SampleDataEvent;
 import flash.media.Sound;
    import flash.media.Sound;
 import flash.net.URLRequest;
    import flash.net.URLRequest;
 import flash.system.System;
    import flash.system.System;
 import flash.utils.ByteArray;
    import flash.utils.ByteArray;


 public class Extract
    public class Extract  {
{
 private var sourceSnd:Sound = new Sound();
        private var sourceSnd:Sound = new Sound();
 private var outputSnd:Sound = new Sound();
        private var outputSnd:Sound = new Sound();
 private var urlReq:URLRequest = new URLRequest("11k.mp3"); //this file has 575 frames
        private var urlReq:URLRequest = new URLRequest("11k.mp3"); //this file has 575 frames
 //        private var urlReq:URLRequest = new URLRequest("44k.mp3");  //this file has 1150 frames
        //        private var urlReq:URLRequest = new URLRequest("44k.mp3");  //this file has 1150 frames
 private var samplesCount:uint = 0;
        private var samplesCount:uint = 0;


 public function play():void
        public function play():void  {
{
 sourceSnd.load(urlReq);
            sourceSnd.load(urlReq);
 //            sourceSnd.play(); // if use source sound to playing, we will not be got machine gun sound.
            //            sourceSnd.play(); // if use source sound to playing, we will not be got machine gun sound.
 sourceSnd.addEventListener(Event.COMPLETE, loaded); //use this approach, we will be got stutter.
            sourceSnd.addEventListener(Event.COMPLETE, loaded); //use this approach, we will be got stutter.
 }
        }


 private function loaded(event:Event):void
        private function loaded(event:Event):void  {
{
 outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
            outputSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
 outputSnd.play();
            outputSnd.play();
 }
        }


 private function processSound(event:SampleDataEvent):void
        private function processSound(event:SampleDataEvent):void  {
{
 var bytes:ByteArray = new ByteArray();
            var bytes:ByteArray = new ByteArray();
 var samplesPerTime:uint = sourceSnd.extract(bytes, 8192);
            var samplesPerTime:uint = sourceSnd.extract(bytes, 8192);
 samplesCount += samplesPerTime;
            samplesCount += samplesPerTime;
 //            trace("samplesCount:" + samplesCount + ",samplesPerTime:" + samplesPerTime);
            //            trace("samplesCount:" + samplesCount + ",samplesPerTime:" + samplesPerTime);
 event.data.writeBytes(bytes);
            event.data.writeBytes(bytes);
 //            flash.system.System.gc();
            //            flash.system.System.gc();
 }
        }

 }
    }
 }
}
You can refer to following test steps for reproduce stutter/machine gun sound issue: 
 
1, Run/debug test application in Firefox, you will get smooth sound at once.
 
2, Open a new tab in the same window, and open a heavy load web page (for example: http://www.taobao.com) 
 
3, You will get stutter when a heavy load page is loading.
If you interest in this problem also, we can study it together.
	
posted on 2010-03-05 12:15 
Robin's Programming World 阅读(1593) 
评论(0)  编辑  收藏  所属分类: 
Flex & Flash