Как записать звук с микрофона и колонок в один поток?
Я написал фильтр DirectShow для захвата звука, который проигрывается в системе.
Написан с использованием WASAPI Loopback.
Мне нужно записать этот звук и звук с микрофона в один поток.
Как сделать сведение двух потоков в DirectShow?
Не знаю как это в DirectShow, но теоретически просто поэлементно сложить оба потока, при одинаковой частоте дискретизации. Если частота дискретизации различается, нужно привести к одной, а потом все равно сложить.
sha-man, цифровой звук во временной области представляет собой массив чисел (тип чисел может быть разный, нужно смотреть конкретную реализацию).
Если взять оба потока с одинаковой длительностью и одинаковой частотой дискретизации, то размерность массивов будет одинаковая - почленно складываете массивы.
res2001, а как же переполнение?
Например, максимальное значение уровня 255.
Первый поток: 200, 10, 240, ....
Второй поток: 205, 150, 160, ....
Если просто сложить: 405, 160, 400, ...
То получим переполнение по уровню.
Я поискал, пишут, что надо делить на 2 и складывать, то есть так:
res = (n1 / 2) + (n2 / 2)
Но пока не проверил на практике.
sha-man, С усреднением (делением на 2) ... может быть, нужно проверять.
Еще варианты:
1.Приводить к максимуму, т.е. if ((sum = n1+n2) > max) { sum = max; }
2.Увеличивать разрядность до 2 байт, цифровые звуковые отсчеты могут быть разной разрядности.
3.После получения суммы увеличенной разрядности можно вычесть минимум по модулю. Тогда, возможно, разрядность можно будет понизить.
PS: я на самом деле акустикой особо не занимался, просто немного знаю ЦОС. Поэтому то что я тут написал нужно проверять.
С увеличением разрядности точно все должно поучиться, если это DirectShow.
Айфичер. Цифровая обработка сигналов. Практический подход.
Стивен Смит. ЦОС. Практическое руководство для инженеров и научных работников.
Ричард Лайонс. ЦОС.
Все очень хорошие, Айфичер потолще и по подробнее, но некоторых деталей там не нашел, возможно плохо искал, нашел у Смита.