写入 wav 文件时定期创建静音
Posted
技术标签:
【中文标题】写入 wav 文件时定期创建静音【英文标题】:Creating silence at regular intervals when writing to a wav file 【发布时间】:2020-05-18 02:31:41 【问题描述】:我正在尝试获取一个 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同时文件?任何建议都会有很大帮助。
【问题讨论】:
本题多题,需要简化。它提供了一个代码示例,概述了对音频数据定期静音的特定需求。然而,仔细阅读这个问题实际上是关于如何阅读 WAV 文件格式。如果您想获得有针对性的答案,您必须准确地确定您要询问的内容。 【参考方案1】:如果您有一个所有样本都已填充的缓冲区,您可以使用模运算符来确定您在一个完整周期中的位置:
int gapLength = 1 * sampleRate;
int repeatLength = 2 * gapLength;
for (int f = 0; f < numOfSamples; f++)
if (f % repeatLength < gapLength)
buffer[f] = silence;
请注意,我将其分为两部分:“间隙”的长度和整个重复周期的长度。它假设这个循环的第一部分包含沉默,但改变它是直截了当的。我相信你明白了。
【讨论】:
【参考方案2】:我要做的第一件事是编写一个基于 libsndfile 的 .wav 文件复制程序——即它 sf_open() 是一个用于读取的 .wav 文件,并创建/sf_open() 是一个用于写入的第二个 .wav 文件(与输入文件的参数相同),sf_readf()是输入文件的音频帧,sf_writef()是直接输出到输出文件的帧。
如果它工作正常,在你运行之后,你应该有第二个文件,听起来与它读入的原始 .wav 文件相同。
一旦这样工作,只需在读/写循环中插入一些代码,这样您读入 RAM 的某些帧就会在再次写出之前被 0.0f 覆盖。
【讨论】:
以上是关于写入 wav 文件时定期创建静音的主要内容,如果未能解决你的问题,请参考以下文章