我正在使用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。
答案 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变量只能在循环之前或之后更改,而不是在循环时更改。