Я не уверен, есть ли для этого какой-либо конкретный метод/класс Qt. Однако сделать это самостоятельно довольно просто.
Самый простой способ (при условии, что вы используете PCM), вы можете просто сложить два потока/буфера слово за словом (насколько я помню, это 16-битные слова PCM).
Итак, если у вас есть два входных буфера:
int16 buff1[10];
int16 buff2[10];
int16 mixBuff[10];
// Fill them...
//... code goes here to read from the buffers ....
// Add them (effectively mix them)
for (int i = 0; i < 10; i++)
{
mixBuff[i] = buff1[i] + buff2[i];
}
Теперь это очень грубо и не принимает во внимание масштабирование. Итак, представьте, что buff1 и buff2 используют 80% динамического диапазона (назовем это полной громкостью, за пределами которой вы получаете искажение), тогда, когда вы суммируете их вместе, вы получите превышение числа (т. быть перерасходом).
Каждый раз, когда вы смешиваете, вам фактически требуется половина двух входов (так что 65535/2 + 65535/2 = 65535... т.е. когда вы их суммируете, вы не можете выйти за пределы). Итак, ваш код микширования выглядит следующим образом:
for (int i = 0; i < 10; i++)
{
mixBuff[i] = (buff1[i] >> 1) + (buff2[i] >> 1);
}
Вы можете сделать гораздо больше (удаление шума и т. д.), но тогда математика становится немного запутанной. Это очень просто. Вы можете использовать сдвиг впоследствии, чтобы увеличить / уменьшить громкость в качестве простого регулятора громкости, если хотите.
ИЗМЕНИТЬ
Следует отметить одну вещь... вы используете readline() (которая, как говорят документы, считывает данные как ASCII). Я всегда использую read(), который не указывает «формат», который он считывает, но я предполагаю, что он двоичный. Так что этот код может не работать, если вы используете readline(), но я никогда не пробовал. Это хорошо работает для read(), вы действительно не хотите работать в ASCII, если хотите манипулировать данными.
person
code_fodder
schedule
06.01.2016