写入 wav 文件时定期创建静音
Creating silence at regular intervals when writing to a wav file
我正在尝试获取一个 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 覆盖。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 尝试使用来自 Win32 WASAPI C++的"捕获流"创建 wav 文件
- 写入 wav 文件时定期创建静音
- 禁用在使用QAudioRecorder时创建wav文件
- 创建wav文件而不会用尽RAM
- 如何创建PCM签名的16位WAV文件
- 从数据实时创建WAV文件 - 需要帮助
- 训练sapi:创建转录的wav文件并将文件路径添加到注册表