Как объединить вход и выход аудио для отправки другому участнику конференции - PullRequest
0 голосов
/ 22 января 2019

Я изменил свое сообщение с вопросом ...

У меня есть два потока со звуком в Java.Я хочу объединить эти две аудиозаписи в один OutputStream.

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

mixAudio [i] = (byte) ((audio1 [i] + audio2 [i]) >> 1);

Однако я пишу это вфайл, и я получаю файл без звука.

Кто-нибудь знает, как объединить две аудиозаписи, когда у меня аудиозаписи в двух потоках (не два аудиофайла)?

Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2019

Звук приличного качества потребляет два байта данных на семпл на канал, чтобы придать звуковой кривой разрядность в 16 бит, что дает вашей звуковой кривой 2 ^ 16 различных значений при оцифровке аналоговой звуковой кривой ... зная, что вы не можете сделать Ваше добавление, в то время как данные живут как простые байты ... поэтому, чтобы сложить вместе два канала, вам сначала нужно вывести аудио из его байтов в двухбайтовое целое число ... затем вам нужно извлечь из этого двухбайтного целого числа каждый из этих двух байтов один за другим и уложить в ваш выходной массив

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

  • присваивает 16-битное целое значение вашего старшего байта

  • сдвиг влево этого целого числа на 8 битов, что-то вроде (myint = myint << 8) </p>

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

Главный совет: после того, как вы написали код для заполнения одного целого числа из двух байтов, выполните обратное, а именно конвертируйте многобайтовое целое число в два байта в некотором массиве ... бонусные баллы, если вы строите эти целые числа, чтобы вы могли визуализировать свои необработанные аудио кривая

Чтобы выполнить вышеприведенное, вы должны знать свой порядок байтов (вы используете младший или старший порядок байтов), который будет определять порядок ваших байтов ... в частности, поскольку теперь мы знаем, что каждый аудиосэмпл потребляет два байта (или более, скажем, для 24 бит) audio) байты myarray [i] и myarray [i + 1] представляют собой один аудиосэмпл, однако только после знания вашего порядка байтов вы поймете, какой элемент массива использовать первым при заполнении указанного выше myint ... если ничего из этого не имеет смысла, пожалуйста, инвестируйте время и усилия для изучения понятия необработанного звука в формате PCM

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

возвращаясь к вашему вопросу вместо того, чтобы просто делать

mixAudio[i] = (byte) ((audio1[i] + audio2[i]) >> 1);

вы должны делать что-то подобное (непроверенное, особенно в отношении порядка байтов)

twoByteAnswer = (byte) ((audio1[i] << 8) + audio1[i + 1]) + (audio2[i] << 8 + audio2[i + 1])) >> 1);

теперь вам нужно разбить ваш twoByteAnswer на два байта массива mixAudio ... что-то вроде этого (также не проверено)

mixAudio[i] =   twoByteAnswer >> 8  // throw away its least sig byte only using its most sig byte

mixAudio[i + 1] = twoByteAnswer && 0x0000FFFF // do a bit AND operator mask
...