C++ 在libsndfile中一次写入一个通道

C++ 在libsndfile中一次写入一个通道,c++,audio,buffer,wav,libsndfile,C++,Audio,Buffer,Wav,Libsndfile,我试图生成一个正弦波,它以1秒的间隔在立体声wav文件的左声道和右声道之间切换,但我找不到任何方法在写入一个声道的同时保持另一个声道静音。下面是我必须写入一个通道的代码: for (int f = 0; f < numFrames; f++) { double time = f * duration / numFrames; buffer[f] = sin(2.0 * pi * time * freq); for(int f=0;f

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

for (int f = 0; f < numFrames; f++) {
    double time = f * duration / numFrames;
    buffer[f] = sin(2.0 * pi * time * freq);
for(int f=0;f
下面是我发现的一些代码,可用于将两个mono 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);
short*mixdown=newshort[2*sizeof(short)*800000];
对于(int t=0;t<800000*2;++t){
混音[t]=(buffer1[t]+buffer2[t])/2;
}
文件*process2=_popen(“ffmpeg-y-fs16le-acodec pcm_s16le-ar 44100-ac2-i--f vob-ac2d:\\audioMixdown.wav”,“wb”);
fwrite(混合,2*sizeof(短)*800000,1,进程2);

我已经在上查看了libsndfile API,但找不到任何关于写入频道的内容。如果有人知道执行此操作的最佳方法,我很乐意听取您的意见。

您可以通过向“静默”频道写入零采样来实现此目的,例如(使右侧频道静默):

for(int f=0;f

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

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

for(int f=0;f

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

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

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;
for(int f=0;f
假设通道在缓冲区中交错,请执行以下操作:

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;
for(int f=0;f