У меня есть два аудиофайла, которые я читал при использовании libsndfile.Пытается смешивать два источника звука PCM
SNDFILE* file1 = sf_open("D:\\audio1.wav", SFM_READ, &info);
SNDFILE* file2 = sf_open("D:\\audio2.wav", SFM_READ, &info2);
После того как я сделал предыдущий пример я х-число образцов:
//Buffers that will hold the samples
short* buffer1 = new short[2 * sizeof(short) * 800000];
short* buffer2 = new short[2 * sizeof(short) * 800000];
// Read the samples using libsndfile
sf_readf_short(file1, buffer1, 800000);
sf_readf_short(file2, buffer2, 800000);
Теперь я хочу, чтобы смешать эти два. Я читал, что вам нужно разделить левый и правый каналы, а затем суммировать их. Я пытался делать это так:
short* mixdown = new short[channels * sizeof(short) * 800000];
for (int t = 0; t < 800000; ++t)
{
mixdown[t] = buffer1[t] + buffer2[t] - ((buffer1[t]*buffer2[t])/65535);
t++;
mixdown[t] = buffer1[t] + buffer2[t] - ((buffer1[t]*buffer2[t])/65535);
}
После этого я ecoding новый аудио с помощью FFmpeg:
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);
Теперь проблема в том, что звук из buffer1 хорошо звучит в сведении но только «добавлено» к новому звуку - это шум (например, если это старая аудиозапись), когда я кодирую микширование в файл.
Если я кодирую только один из двух файлов, он отлично работает.
Я понятия не имею, почему это происходит не так. Я думаю, что это как-то связано со смешением, очевидно, но я не знаю, что я делаю неправильно. Я получил алгоритм смешивания here, но это не дает ожидаемых результатов.
Я также прочитал другую информацию о SO о людях, имеющих похожие вопросы, но я не мог понять это.
Заранее спасибо
Здесь вы не смотрите на стереоканалы. Надеюсь, это потому, что это упрощенный пример. – MSalters
Что вы имеете в виду? Что я должен изменить? (for-loop в моем вопросе теперь один из ответа) – Dries
Ну, вы не проверяете, что audio1.wav и audio2.wav имеют одинаковое количество каналов. Но разумно оставить такие проверки из упрощенного примера. – MSalters