使用AS3WavSound播放WAV - 无法立即停止

时间:2012-01-13 10:56:47

标签: actionscript-3 audio

我正在使用AS3WavSound(http://code.google.com/p/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。

2 个答案:

答案 0 :(得分:0)

你的怀疑可能是正确的 - 但为什么要在那个级别停止呢?如果要关闭声音,在play方法返回的SoundChannel对象上的soundTransform属性上设置音量会不会更好? (我假设wav库以某种方式返回它)

答案 1 :(得分:0)

您使用的库看起来与原始Flash Sound API具有类似的设计,其中从play()方法返回SoundChannel对象。此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变量只能在循环之前或之后更改,而不是在循环时更改。