Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

Как одновременно воспроизвести аудио-потоки от разных участников чата?

08.12.2018, 00:07. Показов 6740. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу аудио-чат конференцию.
Передаю аудио-поток с микрофона клиента на сервер, с сервера отправляю его всем участникам конференции по TCP.
Для записи и воспроизведения звука использую библиотеку Naudio, готов рассмотреть другие реализации.
Когда говорит 1 участник конференции, а другие слушают - всё ок.
Когда говорят одновременно 2 или более участников, начинаются проблемы. Как можно одновременно воспроизвести аудио-потоки от разных участников?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
//...
 //поток для речи собеседника
WaveOut output;
//буфферный поток для передачи через сеть
public static BufferedWaveProvider bufferStream;
output = new WaveOut();
//создаем буфер потока
bufferStream = new BufferedWaveProvider(new WaveFormat(8000, 16, 1));
//привязываем поток входящего звука к буферному потоку
output.Init(bufferStream);
//Воспроизводим аудио-данные из буфера
output.Play();
//...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#region Прослушивание входящих подключений
        static private void Listening()
        {
            while (connected == true)
            {
                try
                {
                    byte[] buffer = new byte[8196];
                    int bytesRec = serverSocket.Receive(buffer);
                    Array.Resize(ref buffer, bytesRec);
 
                    bufferStream.AddSamples(buffer, 0, bytesRec); //Проблема тут
 
                }
                catch (Exception ex) { log(ex.Message); }
            }
        }
        #endregion
bufferStream.AddSamples(buffer, 0, bytesRec); //Проблема тут
Проблема в том, что буфер забивается аудио-данными от разных участников конференции и эти данные не успевают воспроизводится. В случае когда говорит 1 участник, то данные успевают воспроизводится.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2018, 00:07
Ответы с готовыми решениями:

Как записать аудио с микрофона и воспроизвести?
Я хочу записывать с микрофона запись в буфер с помощью AudioRecorder и воспроизвести с помощью AudioTrack, но ничего не воспроизводится. В...

Как воспроизвести аудио и видео в приложении
можете подсказать как вставит видео и аудио файл в программу? очень надо.. заранее спасибо:)

Как воспроизвести аудио файлы размером 1 килобайт?
У меня есть .wav аудио файлы очень малого размера - 1Кб, как массивы байтов, и я пробую воспроизвести их с помощью NAudio, но у меня не...

30
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
14.12.2018, 09:46  [ТС]
Студворк — интернет-сервис помощи студентам
В клиенте проще, там всего 1 принимающий поток
Вот реализация через mixingWaveProvider32. Не знаю насколько стабильно она работать правда будет.
До этого делал через создание нового экземпляра WaveOut и буфера для него, по аналогичному принципу. Проблем с такой реализацией не было, но она наверняка неправильная. Но мне вообще не нравится идея посылать какие-то примечания в массиве с аудиоданными, мне кажется это очень плохо. А на сервере сделать микширование что-то не получается(

P.s. Микширование сделано в клиенте в классе Client, в методе Listening(). Задействован класс с микшированием VoiceMix.
Миниатюры
Как одновременно воспроизвести аудио-потоки от разных участников чата?  
Вложения
Тип файла: rar client_server_14_12_2018_09_40.rar (13.79 Мб, 11 просмотров)
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
14.12.2018, 12:38  [ТС]
nicolas2008, есть идеи как сделать такое на сервере?)
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
15.12.2018, 02:12
Лучший ответ Сообщение было отмечено Nalik как решение

Решение

Цитата Сообщение от Nalik Посмотреть сообщение
есть идеи как сделать такое на сервере?)
Цитата Сообщение от Nalik Посмотреть сообщение
//Полурабочий пример, байты продолжают накапливаться и не успевают воспроизводиться
А это что?

Да, сделал микс на сервере, но по другому. Чтение из буфера со скоростью воспроизведения плюс таймаут на звуковые данные.

client_server_13_12_2018_15_20_fixed.rar
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.12.2018, 12:41  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
А это что?
Видимо старый комментарий остался

Цитата Сообщение от nicolas2008 Посмотреть сообщение
Да, сделал микс на сервере, но по другому. Чтение из буфера со скоростью воспроизведения плюс таймаут на звуковые данные.
Работает божественно, спасибо!) Код в целом посмотрел, увидел класс для отправки звуковых данных, увидел временную завязку, но пока не вникал в тонкости, не откажете мне в комментариях когда начну разбираться?)
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.12.2018, 19:53
Там еще упростить можно (и нужно).
Вместо того что я нагородил с таймаут буфером, просто включить режим циклического буфера в BufferedWaveProvider
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.12.2018, 20:19  [ТС]
nicolas2008, вы же понимаете, что моих знаний библиотеки пока что не хватит для этого)) мне потом ещё с кодеками разбираться нужно будет, чтобы сжимать данные перед отправкой, но это уже другая история)
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.12.2018, 21:23
Сорри, это я сложно написал.
Реализуется установкой свойства DiscardOnBufferOverflow = true
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
16.12.2018, 21:47  [ТС]
А какие функции при этом нужно убрать из за неактуальности?
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.12.2018, 23:19
Убрать класс InputState и все что с ним связано
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
17.12.2018, 08:55  [ТС]
Понял, спасибо)

Добавлено через 9 часов 34 минуты
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Реализуется установкой свойства DiscardOnBufferOverflow = true
Установил свойства DiscardOnBufferOverflow в true, убрал функции DropTimeoutBytes, UpdateTimeoutBytes, класс InputState, изменил Dictionary<BufferedWaveProvider на List<>. Вроде все работает Еще раз большое спасибо за помощь!
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
18.12.2018, 02:47
Цитата Сообщение от Nalik Посмотреть сообщение
Установил свойства DiscardOnBufferOverflow в true, убрал функции DropTimeoutBytes, UpdateTimeoutBytes, класс InputState, изменил Dictionary<BufferedWaveProvider на List<>. Вроде все работает Еще раз большое спасибо за помощь!
Был рад помочь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2018, 02:47

Как воспроизвести любой аудио-файл по нажатию на кнопку?
Как воспроизвести любой аудио-файл по нажатию на кнопку? Если использовать MediaPlayer, но я не пойму, как его подключить Добавлено...

Как одновременно воспроизвести несколько звуков?
Как составить программу в которой находится, скажем 2 кнопки. При нажатии на первую кнопку играет какой либо звук Wav, а при нажатии на...

Как узнать продолжительность аудио файла и воспроизвести его например с минуты?
Как узнать продолжительность аудио файла и воспроизвести его например с 1:30 минуты? Используя MediaPlayer

Как воспроизвести два wav-файла одновременно (второй с некоторой задержкой)?
Как воспроизвести два wav-файла одновременно(второй с некоторой задержкой)?

Как запустить потоки одновременно
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;dos.h&gt; using namespace std; const int m = 2, n = 2; //m = число цифр, n =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru