在 Flash 中生成声波时遇到以下问题。这是生成器部分:
const SAMPLING_RATE:int = 44100;
const TWO_PI:Number = 2 * Math.PI;
const TWO_PI_OVER_SR:Number = TWO_PI / SAMPLING_RATE;
const SAMPLE_SIZE:int = 8192 / 4;
function generateSine(fq:Number):ByteArray
{
var bytes:ByteArray = new ByteArray();
var sample:Number;
var amp:Number = 1;
for (var i:int=0; i<SAMPLE_SIZE; i++)
{
sample = amp* Math.sin(i * TWO_PI_OVER_SR * fq );
bytes.writeFloat(sample);
}
bytes.position = 0;
return bytes;
}
这是播放部分:
function playbackSampleHandler(event:SampleDataEvent):void
{
var sample:Number;
for (var i:int = 0; i < SAMPLE_SIZE && soundData.bytesAvailable; i++)
{
sample = soundData.readFloat();
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
function onClickPlay(e:MouseEvent)
{
soundData= new ByteArray();
var sound:ByteArray= new ByteArray();
sound=generateSine(440);
soundData.writeBytes(sound,0,sound.length);
soundData.position = 0;
morphedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
soundChannel = morphedSound.play();
}
快速解释:我基本上将正弦函数的值写入 ByteArray,然后播放处理程序读取该数组并播放声音。我只写了一个 8192/4 样本缓冲区。
问题:我的问题是,当你这样做时,声音结束时会出现恼人的咔嗒声,这是正弦波被削减到 0 以外的值的伪影。所以我的问题是如何避免这种情况?
奖励:我还想知道,当 Flash 中的缓冲区如此严格(即从 2048 到 8192)时,我如何才能生成恰好 100 ms 的正弦波?
链接:如果有帮助,我的代码基于本教程 http://www.bit-101.com/blog/?p=2669 和我自己的探索。