2012-01-13 30 views
0

我使用AS3WavSound(http://code.google.com/p/as3wavsound/)類播放外部加載的wav。這是成功的。圖書館簡單而有效。使用AS3WavSound播放WAV - 無法立即停止

解碼Wav ByteArray後,庫使用的方法是使用SampleDataEvent.SAMPLE_DATA事件,然後將混合樣本寫入輸出流。

player.addEventListener(SampleDataEvent.SAMPLE_DATA, onSamplesCallback); 
private function onSamplesCallback(evt : SampleDataEvent):void 
{ 
    for (var i:int = 0; i < samplesLength; i++) 
    { 
     if(_mute == false){ 
      outputStream.writeFloat(samplesLeft[i]); 
      outputStream.writeFloat(samplesRight[i]); 
     } 
    } 
} 

我的問題是,我需要立即關閉此音頻輸出,但任何方法我都試過有一明顯(即1秒左右)延遲沉默生效之前。

正如你所看到的,我試圖添加一個布爾值來阻止寫入輸出流的任何樣本,但是這對延遲沒有影響。

我懷疑這是如何緩衝樣本然後寫出來的基本部分。實質上,當屏幕上的用戶操作(單擊靜音按鈕)被調用並且_mute布爾值被設置爲true時,已經有樣本等待寫入輸出中,不會受到影響。

任何意見或確認我的懷疑將不勝感激。

謝謝, gfte。

+0

這兩個答案中的任何一個能幫助你嗎?如果是這樣,您應該使用答案旁邊的向上箭頭,或通過單擊綠色箭頭將其標記爲正確答案。 – JeremyFromEarth 2012-01-14 00:35:43

回答

0

你的懷疑可能是對的 - 但爲什麼要停止在那個級別?如果你想關閉聲音,在play方法返回的SoundChannel對象的soundTransform-property上設置音量會更好嗎? (我假設wav庫以某種方式返回這個)

+0

感謝您的回覆。我也嘗試過這種方法,但不幸的是相同的延遲。 – gfte 2012-01-16 15:44:33

0

它看起來像你使用的庫有一個類似於原生Flash Sound API的設計,其中一個SoundChannel對象是從play()方法返回的。這個SoundChannel實例有一個stop()方法,可以立即停止聲音。

var sound:WavSoundPlayer = new WavSoundPlayer(); 
var channel:WavSoundChannel = new WavSoundChannel(); 

sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 
channel = sound.play(); 

    private function onSamplesData(evt : SampleDataEvent):void 
    { 
     for (var i:int = 0; i < samplesLength; i++) 
     { 
      outputStream.writeFloat(samplesLeft[i]); 
      outputStream.writeFloat(samplesRight[i]); 
     } 
    } 

    channel.stop() 

您示例中的_mute變量只能在循環之前或之後進行更改,而不是在循環時更改。

+0

你對圖書館的設計是正確的。它確實複製了原生的Flash Sound API。但是WavSoundChannel上的停止功能也具有完全相同的延遲。這導致我相信這可能與尚未寫入輸出流的樣本積壓有關。 – gfte 2012-01-16 15:52:06

+0

我又看了一下這個庫的設計。國際海事組織存在缺陷,使其不如以往那麼靈活。爲了立即停止聲音,您可以在WavSoundPlayer中引用由configurePlayer()中調用的Sound.play()方法返回的SoundChannel對象。然後,當您調用WavSoundPlayer的停止位置時,還可以調用SoundChannel的停止位置。不調用SoundChannel實例的停止,您將無法立即停止音頻。 – JeremyFromEarth 2012-01-16 19:05:42

+0

另外,您應該可以通過調用flash.media.SoundMixer.stopAll()來停止FlashPlayer中發生的所有音頻。 – JeremyFromEarth 2012-01-17 04:37:18