写入 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 文件时定期创建静音的主要内容,如果未能解决你的问题,请参考以下文章

使用ffmpeg在特定时间向wav文件添加静音[重复]

从 numpy 生成的 wav 文件听不见(完全静音)

使用 C# 检测 WAV 文件中的音频静音

NAudio - 如何记录扬声器的初始静音

在nodejs中定期检查?

使用 NAudio 创建静音 WAVE 流