Как микшировать голосовое аудио - PullRequest
2 голосов
/ 24 апреля 2011

В настоящее время я занимаюсь разработкой простого проекта VoIP, в котором несколько клиентов отправляют свой голос на сервер, а затем сервер смешивает эти голоса.

Однако я не могу смешать это напрямую, используя простое математическое сложение. Каждый цикл клиент отправляет в микшер голосовые данные размером 3584 байта.

Ниже приведен фрагмент значения, содержащегося в буфере приемника:

BYTE buffer[3584];

    [0] 0        unsigned char
    [1] 192 'À'  unsigned char
    [2] 176 '°'  unsigned char
    [3] 61 '='   unsigned char
    [4] 0        unsigned char
    [5] 80 'P'   unsigned char
    [6] 172 '¬'  unsigned char
    [7] 61 '='   unsigned char
    [8] 0        unsigned char
    [9] 144 ''    unsigned char
    [10]    183 '·' unsigned char
    [11]    61 '='  unsigned char
     .
     .
     .

Я не совсем уверен, как паттерн внутри буфера генерируется таким образом со стороны клиента, но я думаю, что это может быть волновой паттерн. Теперь, допустим, у меня есть еще подобные данные, как мне смешать голос.

Пожалуйста, помогите. Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 апреля 2011

Вам необходимо выяснить, использует ли ваша система VoIP сжатие. Вероятно, так и есть, и в этом случае первое, что вам нужно сделать, это распаковать потоки, затем смешать их, а затем повторно сжать.

2 голосов
/ 24 апреля 2011

Это, вероятно, массив чисел с плавающей точкой (маловероятно из-за представленного шаблона байтов) или целых чисел, если это необработанные данные PCM, поэтому попробуйте использовать его как таковой.Микширование в потоки PCM довольно тривиально, просто сложите их вместе и разделите их на два (используйте другие весовые коэффициенты для регулировки громкости).

1 голос
/ 30 апреля 2011

Я снова посмотрел на ваши данные, и они кажутся значениями с плавающей запятой. Причина, по которой я ошибся в моем предыдущем посте, вероятно, связана с тем, что я некоторое время работал над системами с прямым порядком байтов.Тем не менее, ваши данные в формате IEEE с прямым порядком байтов.Вот значения, которые я получил после преобразования.

0.089630127 -> 0x0090b73d
0.084136963 -> 0x0050ac3d
0.086303711 -> 0x00c0b03d

Как видите, значения довольно малы, поэтому вам, вероятно, придется учесть это при применении объема;обычное соглашение состоит в том, чтобы эти данные находились между 0..1 или -1..1 для минимального и максимального объемов соответственно.

Вот часть цикла микширования, который я написал несколько лет назад дляссылка на полный микшер - доступно здесь

   for(int i = 0; i < a_Sample->count() / a_Sample->channels(); i++){
            float l_Volume = a_Sample->volume() * m_MasterVolume;

            *l_Output++ += *l_Left * l_PanLeft * l_Volume;
            *l_Output++ += *l_Right * l_PanRight * l_Volume;

            l_Left  += a_Sample->channels();
            l_Right += a_Sample->channels();
    }

Обратите внимание, что для вывода вам, вероятно, потребуется преобразовать данные в целые числа со знаком, поэтому сообщайте правильно, если это ответственность микшера илиустройство вывода.

0 голосов
/ 25 апреля 2011

Как уже упоминали другие, вы должны знать, в каком формате находится буфер. Вы не можете просто работать непосредственно с байтами (ну, вы могли бы, но это стало бы довольно сложно).Большая часть необработанных данных PCM обычно составляет 44100 бит / с, 16 бит, 2 канала.Однако это не всегда так.Каждый из них может быть разным.Это не сильно повлияет, но это пример.Тем не менее, даже файлы WAV могут быть в других форматах (например, IEEE Float).Вам нужно будет правильно интерпретировать буфер как соответствующий тип данных, чтобы работать с ним.

Как:

BYTE buffer[3584];
if (SampleTypeIsPcm16Bit())
{
    short *data = reinterpret_cast<short *>(buffer);
    // Rock on
}
else if (SampleTypeIsFloat())
{
    float *data = reinterpret_cast<float *>(buffer);
    // Rock on
}

Конечно, вы можете сделать его более общим с шаблонами, но не обращайте на это внимания: P.

Имейте в виду, что если вы имеете дело с поплавками, они должны быть ограничены диапазоном -1,0 и 1,0.

Итак, вы говорите, что «добавить два значения и разделить на два» (упомянутое Джаспером) не работает?Как вы воспроизводите данные, когда вы просто слышите тишину?Интересно, если это проблема, потому что, если ваша математика выключена, вы, скорее всего, услышите глюки звука (щелчки / щелчки / и т. Д.), А не просто молчание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...