Серверное микширование аудио

Max

Administrator
Staff member
Мы сейчас работаем над документацией и некоторыми фиксами по микшеру.
Скорее всего что-то показать сможем в начале следующей недели.
Суть работы микшера в том, что он микширует аудио составляющую с нескольких потоков, которые публикуются на WCS сервер.
Таким образом можно проиграть два видеопотока без аудио: stream1 и stream2, и отдельно проиграть аудио поток stream3, полученный в результате микширования аудио составляющих.

Пока кажется, что такой подход не примениим для продакшена, т.к. в результате того, что аудио воспроизводится отдельно от видео, то будет нарушена синхронизация. Но надо тестировать. Поэтому возможно придется делать еще видео микшер, который делает нормальное аудио+видео микширование с объединением двух потоков в одну картинку.
 
Возможно ли динамически добавлять и удалять стримы из микшера?
Небольшое нарушение синхронизации не должно создавать проблему, до тех пор пока не заметно что губы не совпадают со звуком.
 

Max

Administrator
Staff member
Ниже дана короткая инструкция, как протестировать аудио микширование на стороне сервера.

Обновление

1. Если не устанавливаете сервер с нуля, то требуется удалить текущую локальную базу.
Останавливаем сервер
Code:
service webcallserver stop
Удаляем локальную базу
Code:
cd /usr/local/FlashphonerWebCallServer/database
rm -rf *
2. Скачиваем сборку 2515 из новой ветки
https://flashphoner.com/downloads/b...ring/FlashphonerWebCallServer-5.0.2515.tar.gz
3. Распаковываем и запускаем обновление
Code:
cd FlashphonerWebCallServer-5.0.2515
./install.sh
4. Запускаем сервер
Code:
service webcallserver start
Тестирование микшера
1. Открываем Demo / Two Way Streaming и отправляем поток stream1 на сервер.
2. Открываем это же демо с другого устройства (например Android Chrome или iOS Safari 11), и отправляем поток stream2 на сервер.
3. Убеждаемся что потоки stream1 и stream2 играют по отдельности.
4. Создаем микшер REST командой:
Code:
https://host:8888/rest-api/mixer/startup
{
  "uri": "mixer://mixer1",
  "localStreamName": "stream3"
}
Здесь
mixer://mixer1 - это идентификатор созданного объекта микшера
stream3 - это поток, который порождает микшер и который будет опубликован внутри сервера
После создания микшер пустой и к нему нужно добавлять стримы.
Если стримы не были добавлены в микшер в течение 1 минуты, микшер будет уничтожен по таймауту.
5. Добавляем существующие потоки в микшер.
Code:
https://host:8888/rest-api/mixer/add
{
  "uri": "mixer://mixer1",
  "remoteStreamName": "stream1"
}
Добавили первый поток.
Code:
https://host:8888/rest-api/mixer/add
{
  "uri": "mixer://mixer1",
  "remoteStreamName": "stream2"
}
Добавили второй поток.
6. Тестируем поток stream3 в плеере и убеждаемся что микшер работает и смешивает аудио из двух потоков stream1 и stream2.
7. Удаляем потоки из микшера.
Code:
https://host:8888/rest-api/mixer/remove
{
  "uri": "mixer://mixer1",
  "remoteStreamName": "stream1"
}
Удалили первый.
Code:
https://host:8888/rest-api/mixer/remove
{
  "uri": "mixer://mixer1",
  "remoteStreamName": "stream2"
}
Удалили второй.
После удаления всех потоков, микшер должен завершить работу через 1 минуту.
8. Выводим текущий список активных микшеров.
Code:
https://host:8888/rest-api/mixer/find_all
{ 
}
9. Принудительно завершаем работу микшера
Code:
https://host:8888/rest-api/mixer/terminate
{ 
"uri": "mixer://mixer1"
}
 

Max

Administrator
Staff member
Возможно ли динамически добавлять и удалять стримы из микшера?
Да.
Небольшое нарушение синхронизации не должно создавать проблему, до тех пор пока не заметно что губы не совпадают со звуком.
Звук, как правило идет быстрее видео. Поэтому возможна рассинхронизация и губы будут отставать. Надо тестировать.
 
Провели тесты, латенси до сервера 180-220мс, 3 работающие камеры без звука и 1 камера sound only стрим микшера со звуком с этих 3-х камер, на вид всё идеально. Говорю в камеру, рассинхронизации между губами на видео на планшете и звуком в наушнике из планшета не заметно ни на одной из 3-х камер.
Похоже на решение проблемы нескольких входящих камер в 11 iOS в браузере. С вас статья на Хабр :)
 
Когда можно ожидать серверное микширование аудио в основной ветке?
 

Max

Administrator
Staff member
Микширование останется в новой ветке. Релиз новой ветки (WCS5 Monitoring) и полный переход на нее планируем завершить до конца года.
В основную ветку (WCS5 Streaming Threads) новые функции не добавляются. Только багфиксы и критические оптимизации, чтобы оставалась стабильной.
 
Релиз новой ветки (WCS5 Monitoring) и полный переход на нее планируем завершить до конца года.
Планы не поменялись? В новую ветку ещё не вмержили webrtc pull ?
 

Max

Administrator
Staff member
Планы не поменялись? В новую ветку ещё не вмержили webrtc pull ?
Вмержили. Но до продакшена можем не успеть довести за оставшиеся 2 недели.
Скорее всего релиз новой ветки сдвинется на январь 2018.

Сейчас в новой ветке wcs5_monitoring, начиная со сборки 2617, добавлен функционал пуллинга стрима с origin-сервера по запросу с edge.
Настройки Edge:
Code:
cdn_enabled=false
cdn_origin_url=ws://origin.wcs.server:8080
Нагрузочные тесты эта ветка еще не проходила. Могут быть проблемы. Отпишем когда стабилизируем.
 
А когда планируется управляемый pull через REST, /rest-api/pull/pull в wcs5_monitoring ? Архитектурно сейчас имеем несколько origin-серверов и ещё 1 с микшированием для iOS-клиентов, cdn_origin_url с 1 сервером не подходит.
 

Max

Administrator
Staff member
а у wowza как работает в случае нескольких origin-серверов?
 

Max

Administrator
Staff member
А когда планируется управляемый pull через REST, /rest-api/pull/pull в wcs5_monitoring
В ветке wcs5_monitoring этот функционал работает.
Code:
/rest-api/pull/ws/pull
{
"uri":"ws://origin.flashphoner.com:8080",
"localStreamName":"stream1_local",
"remoteStreamName":"stream1"
}
 
а у wowza как работает в случае нескольких origin-серверов?
не знаю, не уверен, что через конфиг работает. В любом случае webrtc у wowza не готов к продакшн без обработки ошибок, ретрансмитов и вот этого всего.
В ветке wcs5_monitoring этот функционал работает.
Code:
/rest-api/pull/ws/pull
{
"uri":"ws://origin.flashphoner.com:8080",
"localStreamName":"stream1_local",
"remoteStreamName":"stream1"
}
ага, url запроса поменялся, /ws добавился. А в стабильной ветке url не поменялся.
 
Top