Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

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

08.12.2018, 00:07. Показов 6654. Ответов 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.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru