Изменить усиление громкости в буфере для образцов аудио
-
29-09-2019 - |
Вопрос
Я хочу увеличить объем на буфере с голосовыми данными. Дело в том, что я использую Directsound, и у меня есть один первичный и один вторичный буфер - все потоки микширование сделано вручную. В голосовом чате все участники могут иметь независимые уровни громкости. Я умножу каждый поток данных по значению (усиление) и суммируйте его в один буфер. Все работает нормально, но когда я пытаюсь умножить данные по значению, превышающую 1,0F - я слышу некоторые отсечения или что.
Я пытался использовать компрессор эффекта Audacity, но это не помогает уменьшить странный шум.
Вероятно, я должен изменить выгоду каким-то другим способом? Или просто используйте другой алгоритм после обработки?
Обновление: вау, я только что узнал интересную вещь! Я бросил аудио до увеличения объема и сразу после этого.
Вот фото
Извините за качество - я думаю, что так должен появляться звук (я сам нарисовал красную линию). На самом деле выглядит так, как значения превышают тип образца данных. Но я не могу понять, почему? Мой образец Buffer - байт, но я получаю доступ к нему только через короткий указатель. Он подписан, но обрезка происходит, даже когда *PTR составляет около 15-20 тысяч.
Решение
Для каждого образца - преобразовать его в какой -то более крупный тип данных - если у вас есть 16 -битные подписанные образцы, они изначально подходят в кратчайшие сроки - извлеките его из потока, а затем отбрасывайте в локальный двойник, затем умножьте, затем нажмите, а затем отбрасывайте в короткие сроки.
Это должно работать таким образом ...
Я могу даже предоставить образец кода, если это необходимо.
РЕДАКТИРОВАТЬ:
Ваша фотография - точные доказательства того, что вы не расширились до более крупного типа до умножения - вы не можете «захватить» условие отсечения, потому что он автоматически обернет.
short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;
И еще одно редактирование:
Если у вас есть несколько голосов - сначала поместите их все, чтобы удвоить - затем получить каждый - затем добавьте их - и вытените их как последний шаг.
Еще одно редактирование (+1s вдохновляет меня):
Если у вас есть стерео, то же самое будет работать, просто подсчитайте все образцы x2 IE
number of shorts
=
number of samples
*
2
.