SourceDataLine buffersize导致播放中的点击和停止

时间:2017-01-25 01:18:42

标签: java audio buffer javax.sound.sampled

我正在尝试使用SourceDataLine在我的应用程序中实时播放我创建的音频。使用SourceDataLine打开sdl.open(format)时,会创建一个32000(我的采样率)的默认缓冲区,因此有效一秒。但由于我的应用程序应该是低延迟,我尝试使用较小的缓冲区。 (sdl.open(format, buffer);

在生成声音时,我现在使用512个样本的缓冲区(没有找到最佳值,如果你有任何见解,我将不胜感激)

我算法的一些伪代码:

int pos = 0;
int max = 512;
byte sampleBuffer[] = new byte[max];
while(active) {
    sampleBuffer[pos++] = generateSample(); // actually I generate doubles and make bytes out of em later, but who cares
    if (pos == max) {
        sdl.write(sampleBuffer, 0, pos);
        pos = 0;
    }
}

当我尝试使用自己的缓冲区大小时(我尝试了从maxmax * 2 // * 4; * 8; * 16的所有内容),我得到了大量的点击和噪音。

如果你们对正确的方式有任何见解,我会非常感激。我不知道我的SourceDataLine缓冲区应该比我写入Line的块多大,如果有的话。是否有任何技巧让这个顺利?我很确定我的程序能够足够快地生成音频,所以这不应该是问题。

0 个答案:

没有答案