Объединение нескольких входных каналов в один выходной канал аудио в режиме реального времени - PullRequest
1 голос
/ 08 апреля 2020

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

1 Ответ

0 голосов
/ 09 апреля 2020

вот некоторый псевдокод для объединения нескольких входных каналов в один выходной канал, где каждый входной канал имеет свой собственный регулятор громкости в массиве mix_volume

max_index = length(all_chan[0])  // identify audio buffer size

all_chan   // assume all channels live in a two dimensional array where 
           // dimension 0 is which channel and dim 1 is index into each audio sample

mix_volume  // array holding multiplication factor to control volume per channel
            // each element a floating point value between 0.0 and 1.0

output_chan  //  define and/or allocate your output channel buffer

for index := 0; index < max_index; index++ {

    curr_sample := 0  // output audio curve height for current audio sample

    for curr_chan := 0; curr_chan < num_channels; curr_chan++ {

        curr_sample += (all_chan[curr_chan][index] * mix_volume[curr_chan])
    }

    output_chan[index] = curr_sample / num_channels  // output audio buffer
}

. Трюк, который нужно выполнить выше для живого потока, заключается в Заполните вышеупомянутые аудио-буферы all_chan внутри события l oop, где вы копируете в эти буферы значения аудиосэмплов для каждого канала, а затем выполняете приведенный выше код внутри этого события l oop ... обычно вы хотите, чтобы ваши аудио-буферы имели около 2 ^ 12 (4096) аудиосэмплов ... экспериментируйте, используя больший или меньший размер буфера ... слишком маленький, и это событие l oop станет очень интенсивным процессором, но слишком большим, и вы услышите звуковую задержку ... fun

вы можете использовать скомпилированный язык, например golang YMMV

...