У меня есть два аудиофайла, которые я читаю с помощью libsndfile.
SNDFILE* file1 = sf_open("D:\\audio1.wav", SFM_READ, &info);
SNDFILE* file2 = sf_open("D:\\audio2.wav", SFM_READ, &info2);
После того, как я сделал предыдущее, я сэмплирую x-количество сэмплов:
//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);
}
После этого я кодирую новый звук с помощью 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);
Теперь проблема в том, что звук из буфера1 звучит нормально в сведении, но единственное, что «добавляется» к новому звуку, — это шум (например, если это старая аудиозапись), когда я кодирую сведение в файл.
Если я кодирую только один из двух в файл, он работает отлично.
Я понятия не имею, почему это идет не так. Я предполагаю, что это как-то связано с микшированием, очевидно, но я не знаю, что я делаю неправильно. Я получил алгоритм микширования здесь, но он не дает мне ожидаемые результаты.
Я также читал другую информацию о SO о людях, у которых есть похожие вопросы, но я не мог понять это с ними.
заранее спасибо
32768
, а не65535
. Это объясняет некоторые искажения. - person ElderBug   schedule 24.02.2015new T[N]
выделитN
объекта, а неN
байта, поэтому нет необходимости умножать наsizeof(short)
. - person Mike Seymour   schedule 24.02.2015