MCU в realtime mixer

Ritmius

Member
Здравствуйте!

Такая проблема, прописали следующие настройки:
mixer_realtime=true
mixer_auto_start=true
mixer_mcu_audio=true
mixer_mcu_video=true
mixer_idle_timeout=10000

После чего начали тестировать создание микшера. Публикуем стрим с разных устройств как a1#b и a2#b. При прослушивании b с обоих устройств - все идеально, микшер работает, за исключением того что каждый из спикеров слышит себя же.

В документации по MCU сказано что должны быть микшеры b-a1 и b-a2, в которых нет a1 и a2 соответственно. При попытке прослушать их - получаем что таких стримов нет.

Надо ли как-то отдельно их создавать? Или они создаются все-таки автоматически и мы что-то настроили не так?
 

Attachments

Max

Administrator
Staff member
Добрый день.
Пример имен потоков в документации приведен для случая, когда микшер создается и потоки в него добавляются по REST API. Если используется автоматическое создание микшера по имени потока, то имя потока включает в себя имя микшера. В Вашем случае на сервере будут опубликованы следующие потоки:
a1#b - поток первого участника
a2#b - поток второго участника
b - выходной поток микшера
b-a1b - поток первого участника без его аудио
b-a2b - поток второго участника без его аудио
Имена MCU-потоков не включают символ-разделитель #
Смотрите также исходный код примера MCU Client, там на стороне клиента проигрываются именно MCU-потоки.
 

Ritmius

Member
Работает, попробовали говорить в 3. Правильно я понимаю, что те кто просто слушают они слушают поток b, а если его сделали говорящим, он перестает слушать b и начинает слушать b-a1b, тогда получается прервется связь. или можно не прерывая связь это сделать?
 

Max

Administrator
Staff member
Вы можете добавить в микшер всех участников, и играть для каждого из них его поток b-a1b, b-a2b и т.п. Если нескольких участников необходимо заглушить, чтобы они только слушали, но не говорил, это можно сделать запросом /mixer/setAudioVideo, например
Code:
POST /rest-api/mixer/setAudioVideo HTTP/1.1
Host: localhost:8081
Content-Type: application/json
  
{
 "uri": "mixer://m1",
 "streams": ["a1#b","a2#b"],
 "audioLevel": 0,
 "videoMuted": true
}
Разрешить участнику говорить можно запросом
Code:
POST /rest-api/mixer/setAudioVideo HTTP/1.1
Host: localhost:8081
Content-Type: application/json
  
{
 "uri": "mixer://m1",
 "streams": ["a1#b"],
 "audioLevel": 100,
 "videoMuted": false
}
Общий выходной поток микшера в этом сценарии можно играть зрителям (допустим, если речь идет о вебинаре с каким-то количеством участников и большим числом пассивных зрителей) или записывать.
 

Ritmius

Member
в данном случае, если слушатель который слушает общий поток захочет стать спикером у него будет прерывание связи на 1-2 секунды


скажите, как можно этого избежать и если всем делать потоки b-a1b, b-a2b, будет больше нагрузка на сервер?
 

Max

Administrator
Staff member
скажите, как можно этого избежать
в текущей реализации избежать не получится

и если всем делать потоки b-a1b, b-a2b, будет больше нагрузка на сервер?
Да, каждый дополнительный микс b-aNb это дополнительная нагрузка на сервер.
Мощный сервер возможно выдержит 100-таких 300 миксов, но вряд ли больше.
 

Ritmius

Member
скажите а можно, чтобы поток b-a1b, назывался как мы зададим , а не b-a1b
 

Max

Administrator
Staff member
скажите а можно, чтобы поток b-a1b, назывался как мы зададим , а не b-a1b
Можно переименовать поток, обрабатывая REST hook /publishStream, в этом случае поток будет опубликован под заданным Вами именем.
 

Ritmius

Member
т.е. создаем b-a1b и тогда пользователь будет слышать основной поток - свой, а если переименовать то пользователь может подключиться к другому названию и не слышать себя?
 

Max

Administrator
Staff member
т.е. создаем b-a1b и тогда пользователь будет слышать основной поток - свой, а если переименовать то пользователь может подключиться к другому названию и не слышать себя?
Нет.
При добавлении потока a1#b в MCU-микшер b:
1. Этот поток микшируется в основной выходной поток микшера b.
2. Создается и публикуется выходной поток микшера без аудио из добавленного потока (чтобы пользователь себя не слышал). По умолчанию. этому потоку присваивается имя вида b-a1b (символ-разделитель # отбрасывается).
Если Вас устраивает имя потока по умолчанию, на этом шаге можно остановиться. Если Вам необходимо переименовать этот поток, то:
3. В момент публикации этого потока бэкенд может получить REST hook /publishStream, и вернуть ответ с заменой имени по умолчанию на любое заданное имя, например a1_mcu
4. Поток микшера без аудио пользователя a1 будет опубликован под именем a1-mcu
 

Ritmius

Member
а как его переименовать я не понимаю. если MCU создается налету и пользователь уже подключен к b-a1b, его надо переименовать (создать ) до подключения пользователя

Я правильно понимаю , что я могу создать
1) поток для того чтобы говорить
2) добавить этот поток в микшер
3) создать поток , чтобы слушать , назвать его имя микшера - поток для того чтобы говорить
4) переименовать поток в пункте 3
и пользователь будет говорить , все будут его слышать, а он себя слышать не будет?
 

Max

Administrator
Staff member
а как его переименовать я не понимаю. если MCU создается налету и пользователь уже подключен к b-a1b, его надо переименовать (создать ) до подключения пользователя
Видимо, Вы ориентируетесь на функционал примера MCU client. Как он работает:
1. В примере публикуется поток с именем a1#b
2. На сервере при публикации такого потока автоматически создается микшер b, если его нет, поток добавляется в микшер и появляется в выходном потоке микшера
3. На сервере автоматически создается и публикуется выходной поток микшера без аудио из добавленного потока (чтобы пользователь себя не слышал). По умолчанию. этому потоку присваивается имя вида b-a1b.
4. Пример забирает этот поток по имени с сервера.
Итого в минимальном случае на сервер будут опубликованы потоки a1#b, b, b-a1b.
На бэкенде Вы можете реализовать REST hook /publishStream, который переименует поток b-a1b так, как Вам необходимо. В этом случае для проигрывания на клиенте нужно этот же поток, но по новому имени.
 

Ritmius

Member
1) как можно не через MCU создать поток в котором я не буду слышать свой голос?
2) можно ли в MCU чтобы это выглядело не b-a1b
 

Max

Administrator
Staff member
1) как можно не через MCU создать поток в котором я не буду слышать свой голос?
Никак, MCU функционал именно для этого предназначен
2) можно ли в MCU чтобы это выглядело не b-a1b
Только через переименование потока, как описано выше.
 

Ritmius

Member
1) Правильно ли я понимаю, что создать 2 потока, один в который говорит пользователь и второй поток который слышит пользователь
микшер - основной через апи вообще невозможно?


т.е. через апи можно только что слышит себя?

2) зачем вообще тогда sip метод /call/inject_sound если мы его инжектим в микшер то он слышит сам себя и иначе никак?
 

Max

Administrator
Staff member
1) Правильно ли я понимаю, что создать 2 потока, один в который говорит пользователь и второй поток который слышит пользователь
микшер - основной через апи вообще невозможно?
Микшер работает в двух режимах

Режим1 (Normal) - один выходной поток, в котором смикшированы все потоки, входящие в микшер.
Режим2 (MCU) - несколько выходных потоков, в каждом из которых смикшированы все потоки, входящие в микшер, за минусом одного.

Управлять выходными потоками микшера, их количеством и содержанием на данный момент нельзя. Такая функция не реализована.
Поэтому нельзя задать сколько и каких потоков должно отдавать MCU. Возможно мы добавим эту функцию в будущем, но сейчас ее нет.

2) зачем вообще тогда sip метод /call/inject_sound если мы его инжектим в микшер то он слышит сам себя и иначе никак?
inject_sound позволяет после установки SIP звонка с софтфоном (или другим SIP устройством), отправить этому устройству звук из wav - файла
Эта функция не имеет отношения к микшеру.


Возможно, вы пытаетесь присоединить SIP абонента к голосовой конференции.
Теоретически можно сделать SIP звонок с полем toStream и перенаправить голос с софтфона в микшер (MCU) и далее перенаправить голос из микшера (MCU) b-softphone в SIP звонок с помощью /call/inject_stream https://docs.flashphoner.com/pages/viewpage.action?pageId=9241578
Но это достаточно сложно сделать:

1. Запустить MCU микшер.
2. Добавить в него stream1 с вебкамеры (микрофона).
3. Сделать SIP звонок /call/startup и указать toStream: "stream2sip"
4. Добавить поток в микшер /mixer/add stream2sip
5. Сделать инжект стрима b-stream2sip в SIP звонок командой /call/inject_stream

Т.е. требуется 5 шагов и не факт, что это будет работать стабильно. Мы не тестировали этот кейс.
На текущий момент нет прямого API подключения SIP звонка к MCU. Возможно добавим, если фича соберет много голосов.
 
Top