2011-03-17 71 views
0

我使用以下從聲音對象中提取聲音數據並將其存儲在字節數組中。AS3 - 聲音提取到bytearray - 進度處理程序

我要求整個MP3加載到ByteArray前進之前和下面的工作正常但是爲了這個目的閃爍暫時掛起,而它提取該數據(2.4MB MP3)

有沒有辦法可以阻止它掛起來,即使用eventlistener來檢查提取過程的進度?

iniSound(); 

function iniSound() 
{ 
    playLoadedSound(mp3); 
} 

function playLoadedSound(s:Sound):void 
{ 
    var bytes:ByteArray = new ByteArray(); 
    s.extract(bytes, int(s.length * 44.1)); 
    playSound(bytes); 
} 

function playSound(bytes:ByteArray) 
{ 
    //stop(); 
    dynamicSound = new Sound(); 
    dynamicSound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 

    loadedMP3Samples = bytes; 
    numSamples = bytes.length/8; 

    phase = 0; 
} 

回答

0

提取的第二個參數指定要提取多少聲音。把它縮小一點,只要你需要完全提取它就可以每一步都調用它。

+0

感謝,所以我提取音軌的一小部分,並嘗試使用while循環的處理進度然而閃光燈仍然只是掛起,然後我得到只有在滿足條件後纔會有一組跟蹤輸出。無論如何,我可以阻止它懸掛並顯示負載消息,而這是發生?代碼是:function playLoadedSound(s:Sound):void { \t var bytes:ByteArray = new ByteArray(); \t while(s.extract(bytes,4096)) \t { \t \t trace(「loading」); \t} \t playSound(bytes); } – digitalpencil 2011-03-17 15:56:58

+0

不要使用while循環,請使用ENTER_FRAME或TIMER – NemoStein 2011-03-29 17:24:31

0

提取方法一次全部運行,監視進度的潛力不存在。一個更好的選擇是檢查聲音的'isBuffering'屬性,當它準備好時,開始一次提取4096個樣本並保持滾動。有效地將音頻從一個Sound對象傳送到另一個。

添加「while」語句只是將進程分解爲許多較小的塊,但編譯器仍嘗試在一個週期/幀/內執行所有操作。

你想與預加載器進行通信?玩頭時間?

1

這種方式通常工作在礦

function playLoadedSound (s:Sound) : void 
{ 
    var bytes:ByteArray = new ByteArray(); 
    s.extract (bytes, int (s.length * 44.1)); 
    playSound (s); 
} 

function playSound (bytes:ByteArray) : void 
{ 
    loadedMp3Samples = bytes; 
    loadedMp3Samples.position = 0; // reset position 

    dynamicSound = new Sound(); 
    dynamicSound.addEventListener (SampleDataEvent.SAMPLE_DATA, onSampleData); 
    dynamicSound.play(); 
} 

function onSampleData (event:SampleDataEvent) : void 
{ 
    for (var i:int ; i < 8192 && loadedMp3Samples.available > 0 ; i++) 
    { 
     var left:Number = loadedMp3Samples.readFloat(); 
     var right:Number = loadedMp3Samples.readFloat(); 
     event.data.writeFloat (left); 
     event.data.writeFloat (right); 
    } 
}