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

Creating silence at regular intervals when writing to a wav file

本文关键字:创建 wav 文件 写入      更新时间:2023-10-16

我正在尝试获取一个 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 文件中获取样本[f] 的方法 - 也许我可以同时遍历两个 wav 文件?任何建议都会有很大帮助。

如果你有一个缓冲区,你的所有样本都已经填充了,你可以使用取模运算符来确定你在一个完整的周期中的位置:

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

请注意,我将其分为两部分:"间隙"的长度和整个重复循环的长度。 它假设这个周期的第一部分包含沉默,但改变它是直截了当的。 我相信你明白了。

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

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

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