如何使用 libsndfile 在音频文件中打印静音?
Posted
技术标签:
【中文标题】如何使用 libsndfile 在音频文件中打印静音?【英文标题】:How do you print silence in an audio file with libsndfile? 【发布时间】:2013-06-15 23:54:59 【问题描述】:我正在使用 libsndfile 做一些简单的简单程序,目前正在尝试找到一种在音频文件中打印静音的方法——而不是从另一个文件中静音。从表面上看,我正在制作鼓机。 在给定的时刻,如果我愿意,我只能写入输入音频文件的长度并将它们附加到彼此上。 很想对这个看似超级简单的任务有更多的了解……或者如果它实际上如此简单,那就是一记耳光。
谢谢!
【问题讨论】:
我明白沉默是零。我认为我的问题主要是,我将如何从我制作的数组而不是直接从文件中读取/写入?我现在想我在这里摆脱了 while 循环:while ((readcount = sf_read_double (sndfile, data, BUFFER_LEN)) 而是使用 SNDFILE* 传入我自己的数组作为输出文件 sf_write_double (SNDFILE sndfile, double *ptrToMyArray , sf_count_t 帧); 抱歉,我在描述代码时遇到了问题。我显然是这个网站的新手。 @Erik de Castro Lopo 想通了!再次感谢@Eric de Castro Lopo ---------- ---------- int size;双帧[sfinfo.frames];尺寸=(尺寸(帧)/尺寸(双)); printf("音频文件中的帧数:%d\n", size); 【参考方案1】:音频文件中的静音只是一堆连续的零值样本。
在文件的当前写入位置插入 N 帧静音很简单:
void sf_insert_silence (SNDFILE *file, int channels, int frames)
short silence [frames * channels];
memset (silence, 0, sizeof (silence));
sf_writef_short (sndfile, silence, frames);
【讨论】:
非常感谢。我想我的下一个问题是如何将一个短样本读入一个数组,然后再插入一个更大的静音数组?意思是,确定要写入的音频的长度,并以一定的间隔将数组中的军鼓或踩镲样本读入文件中或被指向的文件。当我尝试为音频文件中的帧的双精度数组清除空间时,我无法从 sfinfo.frames 获得所需的双精度数,因为返回的是 sf_count_t。 @埃里克·德·卡斯特罗·洛波 @pritchardsmith sf_count_t 基本上只是一个整数类型。这是 C(或可能是 C++),因此从 sf_count_t 转换是微不足道的。就像使用任何其他数字类型一样使用它。 @Eric de Castro Lopo 当我将它用作 int 时,我遇到了关于预期类型的错误。不过,经过一番摆弄之后,它看起来像是一个 double 类型,并且当我以这种方式使用它时在代码中工作。 如果是 8 位音频,静音应该是 128 而不是 0。以上是关于如何使用 libsndfile 在音频文件中打印静音?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据
如何使用 libsndfile 打开加载到内存中的声音文件?
使用 libsndfile 为 MATLAB 编写多声道音频