写入WAV文件时定期创建静音

我正在尝试获取一个wav文件,并以1秒的间隔在其中创建静默间隙。沉默的间隙并不是暂停文件然后再次播放,它们具有“静音”功能,因此,如果输入的wav文件长10秒,那么输出文件的长度也将长10秒。

我可以访问输入的wav文件的所有属性,例如缓冲区大小,恐怕我不知道如何在这种情况下从所说的文件中读取内容。我最好的猜测是这样的:

int gapLength = 1 * sampleRate;

for (int f = 0; f < numOfSamples; f++) {
    if (f <= gapLength) {
        buffer[f] = silence
    }
    else {
        buffer[f] = sample[f] from audio input
    } 
}

sf_writef_double(sndFile, buffer, numOfSamples);

取消此操作后,我需要找出如何在第一次之后再次进行for循环检查间隙,以及以某种方式从输入的wav文件中获取sample [f]-也许我可以遍历两个wav文件同时?任何建议都将是一个很大的帮助。

评论
  • wodio
    wodio 回复

    如果您有一个缓冲区,并且所有样本都已装满,则可以使用模运算符确定整个周期中的位置:

    int gapLength = 1 * sampleRate;
    int repeatLength = 2 * gapLength;
    
    for (int f = 0; f < numOfSamples; f++) {
        if (f % repeatLength < gapLength) {
            buffer[f] = silence;
        }
    }
    

    请注意,我将其分为两部分:“间隙”的长度和整个重复周期的长度。假定此周期的第一部分包含沉默,但直接更改此沉默是很直接的。我敢肯定你知道这个主意。

  • 如今Ac
    如今Ac 回复

    我要做的第一件事是编写一个基于libsndfile的.wav文件复制程序-即它sf_open()的一个.wav文件用于读取,并创建/ sf_open()的第二个.wav文件用于写入(使用参数与输入文件相同),并且sf_readf()表示输入文件中的音频帧,而sf_writef()则将它们直接输出到输出文件。

    如果运行正常,则在运行后,您应该拥有另一个文件,该文件听起来与它读入的原始.wav文件相同。

    一旦工作,只需在读/写循环中插入一些代码,以便读入RAM的某些帧在被再次写出之前被0.0f覆盖。