Запись на один канал за раз в libsndfile

Я пытаюсь сгенерировать синусоиду, которая переключается между левым и правым каналами стереофайла wav с интервалом в 1 секунду, но я не могу найти способ записать в один канал, сохраняя при этом молчание другого. Вот код, который я должен написать на один канал:

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);

Я просмотрел API libsndfile по адресу http://www.mega-nerd.com/libsndfile/api.html, но ничего не нашел о записи в каналы. Если у кого-то есть какие-либо идеи, как лучше всего это сделать, я хотел бы услышать ваше мнение.


person bunnytickles    schedule 17.05.2020    source источник


Ответы (2)


Вы можете добиться этого, просто записав нулевые сэмплы в «тихий» канал, например. (чтобы заглушить правый канал):

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 ожидает данные канала в чередующемся формате (что я считаю правдой, но не уверен в этом).

person Paul Sanders    schedule 17.05.2020

Предполагая, что каналы чередуются в буфере, выполните:

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;
person stark    schedule 17.05.2020