随笔-193  评论-715  文章-1  trackbacks-0
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 {
    
import flash.events.Event;
    
import flash.events.SampleDataEvent;
    
import flash.media.Sound;
    
import flash.net.URLRequest;
    
import flash.system.System;
    
import flash.utils.ByteArray;

    
public class Extract {
        
private var sourceSnd: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("44k.mp3");  //this file has 1150 frames
        private var samplesCount:uint = 0;

        
public function play():void {
            sourceSnd.load(urlReq);
            
//            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.
        }


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


        
private function processSound(event:SampleDataEvent):void {
            var bytes:ByteArray 
= new ByteArray();
            var samplesPerTime:uint 
= sourceSnd.extract(bytes, 8192);
            samplesCount 
+= samplesPerTime;
            
//            trace("samplesCount:" + samplesCount + ",samplesPerTime:" + samplesPerTime);
            event.data.writeBytes(bytes);
            
//            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 阅读(1555) 评论(0)  编辑  收藏 所属分类: Flex & Flash

只有注册用户登录后才能发表评论。


网站导航: