Возможен ли такой сценарий?

Проблема в том что не удаётся юзать клиентское СДК в отрыве от UI, то есть оно само манипулирует UI объектами. Трудно кастомизировать клиент таким образом.

Есть пример того как подключиться к потоку на сервере и получить stream в javascript, и потом сделать с ним всё что нужно, а не создать и добавить в апп новое <video> играющее его, как это получается cейчас? Аналогично при паблише.

И клиентское SDK взаимодействует с сервером через вебсокет протокол. Есть ли где-то полное описание этого протокола?
 

Max

Administrator
Staff member
Проблема в том что не удаётся юзать клиентское СДК в отрыве от UI, то есть оно само манипулирует UI объектами. Трудно кастомизировать клиент таким образом.
Кастомизировать в плане UI как раз должно быть удобно.
Т.е. front-end разработчик делает div, например:
Code:
<div id="myVideo"></div>
Далее в этот div монтируется <video> и играет стрим:
Code:
session.createStream({name:'stream1',display:myVideo}).play();
Есть пример того как подключиться к потоку на сервере и получить stream в javascript, и потом сделать с ним всё что нужно
Опишите что конкретно нужно сделать со стримом. Примеры.
Пока понятно что требуется более низкоуровневое API с прямым доступом к стриму. Только не понятно что планируется с ним делать и действительно ли такие возможные действия над стримом востребованы.
И клиентское SDK взаимодействует с сервером через вебсокет протокол. Есть ли где-то полное описание этого протокола?
Описания нет, но протокол достаточно простой и его можно увидеть:
1. В websocket фреймах.
Chrome - Developer Tools - Network
Пример со скриншотами:
https://flashphoner.com/docs/wcs5/w...ooting-network_traffic_analysis-websocket.htm
2. В исходниках Web SDK
Обработка Websocket сообщений с сервера:
https://github.com/flashphoner/flashphoner_client/blob/wcs_api-2.0/src/flashphoner-core.js#L509
Отправка Websocket сообщений на сервер:
https://github.com/flashphoner/flashphoner_client/blob/wcs_api-2.0/src/flashphoner-core.js#L1441
 
Спасибо! А нельзя сделать session.createStream() не передавая <video> туда? То есть без привязки к <video>? А просто получить стрим и потом его мучать. Листенеры вешать, юзать как srcObject и т.п., к элементу <audio> применять например. Или может у нас вообще свой плеер, не <video>, как тогда?
 

Max

Administrator
Staff member
Спасибо! А нельзя сделать session.createStream() не передавая <video> туда? То есть без привязки к <video>? А просто получить стрим и потом его мучать. Листенеры вешать, юзать как srcObject и т.п., к элементу <audio> применять например.
Вы описали низкоуровневое API, работающее со стримами.
Да, можно сделать. Но не понятно насколько это совместимо с текущей архитектурой.
Вопрос не простой и требует проработки разработчиками. Инициируем выяснение по этому вопросу. По результатам отпишем.
Или может у нас вообще свой плеер, не <video>, как тогда?
Пока не приходилось встречать НЕ <video> плеер в браузере для WebRTC.
 
OK, понятно. Будем медленно, кропотливо разбираться так - наверное фрилансера какого-нибудь найму на эту довольно мутную работу
 
Для нагрузочного тестирования можно попробовать pulling:
Пример адреса (Dashboard - Demo - Console)
http://wcs5-eu.flashphoner.com:9091/client2/examples/demo/streaming/console/console.html
Для теста нужно два физических сервера с гигабитной полосой между ними.
На первый сервер отпраляем поток.
Со второго сервера делаем pulling потока 2000 раз. Т.е. забираем 2000 стримов.
Вот тут немного непонятно. Мне на эту консоль заходить на сервере, на который я направляю поток (главный, т.е. который тестируется). И что делать там?
Я там вижу пустой список, и как что-то добавить туда - непонятно
 

Max

Administrator
Staff member
На один сервер публикуем поток с камеры как обычно, например через Two Way Streaming.
Со второго сервера забираем этот поток в количестве N штук, т.е. эмулируем нагрузку в N зрителей.
 
Совершенно непонятно, как :( Какая связь с console из ссылки выше? Как этой console пользоваться? Ничего там не вижу. Плагин поставил.
 
Вот это - console? Что тут делать чтобы что-то увидеть? И что именно я там должен увидеть и сделать?

Это то что показывается если я нажимаю пункт Console в Dashboard на моём экземпляре
 

Attachments

Max

Administrator
Staff member
32 Gb RAM не хватит прокачать 2000 потоков.
4 ядер также не хватит чтобы обработать это количество стримов.
А encoding 20 потоков вполне может утилизировать 4 ядра без всякой дополнительной нагрузки.

Более вероятная конфигурация для такой нагрузки:
128 Gb RAM
6 ядер под потоки
6 ядер под транскодинг

Транскодинг на GPU на данный момент не поддерживается.
 
Не, Вы мало проскроллили :) c1.xlarge.x86 это:

  • 16 Physical Cores @ 2.6 GHz
    (2 × E5-2640 v3)
  • 128 GB of DDR4 ECC RAM
    (8 × 16 GB)
  • 120 GB of Redundant SSD
    (2 × 120 GB in RAID 1)
  • 2.4 TB of NVMe Flash
  • 20Gbps Bonded Network
    (2 × 10Gbps w/ LACP)
Вот этого - достаточно для моего сценария?

А в продакшене я буду юзать физический сервер со сравнимыми спеками, но поставлю туда ещё и NVIDIA Quadro, или даже Tesla, или что-то такое чтобы энкодить ffmpeg-ом мои композитные потоки с nvenc_h264, чтоб больше проца отдать Flashphoner-у.

План лоадтеста - засасывать 3 потока, потом 20 раз подряд накладывать их друг от друга получая 20 потоков 1280x720x15 fps, и каждый из этих 20 потоков 100 раз засасывать с другого сервера...
 
Last edited:

Max

Administrator
Staff member
Да, действительно, то был c1.small.x86.
Вот этого - достаточно для моего сценария?
Да, выглядит достаточно. Не забудьте выполнить тюнинг настроек. Без него сервер не выжмет ресурсы.

Интересно на чем у них построена виртуализация. Обещают физические ядра.
Обычно VPS провайдеры дают виртуальные ядра (hyperthreading потоки).
 
Там нет никакой виртуализации. Это bare metal, каждый инстанс - это физический сервер.

Кстати для их брендинга эти названия похожие на названия инстансов на AWS мега вредны - люди начали думать что это VPS и есть.
 
Last edited:
Вопрос - можно ли для лоадтеста, для 2-го сервака который будет засасывать потоки, юзать мой же триальный ключ? По идее это как раз то для чего триал существует. А для того кто отдает - коммерческий. Чтоб не быть забилленым 2 раза.
 
В общем, не работает. Больше 500 потоков несмотря на любые настройки никогда не удалось вытащить - нагружает примерно до 500 и идёт назад, пока не упадет примерно до 50. При этом все ресурсы машины свободны на 90-95%. Во время стриминга больше примерно 100 потоков возникают жутчайшие - по 10-15 с - задержки, и fps падает до 1 кадра в несколько секунд. Налицо ботлнек где-то, но где?

Что делать? Есть ли какой-то более или менее "научный" способ выхода из ситуации, а не пытаться твикать всё подряд в надежде что заработает? У меня не так много времени на это...

Конфиги выслал почтой.
 
Last edited:
Что я могу прислать, на какие вопросы ответить, чтобы помочь продиагностировать ситуацию? И да, потоки достаточно толстые, 1280x720x15fps, 2 мегабита каждый, т.е. мне нужно 4 гигабита отдавать.

Но в любом случае затык происходит где-то не там: и проца и рамы свободных на обоих серверах - выше крыши.

Машина была m2.xlarge.x86 https://www.packet.net/bare-metal/servers/memory/ - вроде бы, мощнее ну просто некуда. 56 ядер, 384 рамы
 
Last edited:
Top