在 libsndfile 中一次写入一个通道

Posted

技术标签:

【中文标题】在 libsndfile 中一次写入一个通道【英文标题】:Writing to one channel at a time in libsndfile 【发布时间】:2020-05-17 21:05:27 【问题描述】:

我正在尝试生成一个正弦波,它以 1 秒的间隔在立体声 wav 文件的左右通道之间切换,但我找不到任何方法可以写入一个通道同时保持另一个通道静音。这是我必须写到一个频道的代码:

for (int f = 0; f < numFrames; f++) 
    double time = f * duration / numFrames;
    buffer[f] = sin(2.0 * pi * time * freq);

这是我发现的一些代码,可用于将两个单声道 wav 文件混合在一起:

short* mixdown = new short[2 * sizeof(short) * 800000];
for (int t = 0; t < 800000 * 2; ++t) 
    mixdown[t] = (buffer1[t] + buffer2[t]) / 2;


FILE* process2 = _popen("ffmpeg -y -f s16le -acodec pcm_s16le -ar 44100 -ac 2 -i - -f vob -ac 2 D:\\audioMixdown.wav", "wb");
fwrite(mixdown, 2 * sizeof(short) * 800000, 1, process2);

我查看了 http://www.mega-nerd.com/libsndfile/api.html 的 libsndfile API,但在写入频道时找不到任何内容。如果有人知道这样做的最佳方法是什么,我很想听听您的意见。

【问题讨论】:

【参考方案1】:

您可以通过将零样本写入“静音”通道来实现这一点,例如(使右侧通道静音):

for (int f = 0; f < numFrames; f++)

    double time = f * duration / numFrames;
    buffer[f * 2] = sin(2.0 * pi * time * freq);
    buffer[f * 2 + 1] = 0;

这假设 libsndfile 需要交错格式的通道数据(我相信这是真的,但不确定)。

【讨论】:

【参考方案2】:

假设通道在缓冲区中交错,请执行以下操作:

for (int f = 0; f < numFrames; f+=2) 
    ...
    int odd = seconds % 2;
    buffer[f+odd] = sin(2.0 * pi * time * freq);
    buffer[f+1-odd] = 0.0;

【讨论】:

以上是关于在 libsndfile 中一次写入一个通道的主要内容,如果未能解决你的问题,请参考以下文章

使用 libsndfile 为 MATLAB 编写多声道音频

根据其他字段的计算,在 pandas 数据框中一次创建两个新字段

将 libsamplerate 与 libsndfile 一起使用

在反应jsx中一次遍历一个数组

在phpwebsocket中一次只有一个连接

在内存中一次加载一个视图控制器