Вопросы по реализации решения

champloo

New Member
Добрый день.

Мы столкнулись с некоторыми вопросами, на которые не смогли получить ответ из документации и понять как работает всё под капотом.

Наше приложение передаёт входящий поток(rtmp - obs или webrtc - браузер) на origin и в данный момент отдаёт на сайте по webrtc(low latency) и hls потоки
Больше никаких протоколов мы не используем.
Планируемое кол-во входящего потока от 50 до 500 в будущем и исходящего около 50000

В данный момент мы используем 1 сервер origin
На сервере доступно 28 ядер - 56 потоков 128гб рам
Разрешение в основном входящего потока 1920x1080 но может отличаться.
На webrtc проигрывателе исходящего мы установили принудительно 1920x1080 так как если не устанавливать значение, картинка очень плохая.
Среднее потребление сервера на 1 стрим с 1 смотрящим 2.5-4cpu в пиках

Хотелось бы:
1. Уменьшить потребление данных ресурсов не ухудшив качество, отдавая
с низкой задержкой.

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

3. Какую схему и как её разворачивать если нам станет не хватать
ресурсов, для вертикального маштабирования или есть вариант горизонтального с несколько origin?

4. Есть ли возможность для декодирования использовать видеокарту?
Цель в будущем держать большое кол-во стримеров и раздачу им.

5. Можно ли отдавать как-нибудь профили cdn на origin?

6. Какую схему вы порекомендуете нам использовать исходя наших запросов.

7. Как передать и настроить картинку стрима по webrtc, так как на данный момент она мыльная.

8. Не могли бы вы более расписать роли origin - transcoder - edge и можно ли использовать эти роли например: origin+transcoder - edge или наоборот

9. Есть ли у вас какой-нибудь подобный опыт который вы могли привести в качестве примера который мы могли бы приложить к такой ситуации?
Спасибо!
 

Max

Administrator
Staff member
Добрый день.
Хотелось бы:
1. Уменьшить потребление данных ресурсов не ухудшив качество, отдавая
с низкой задержкой.
Для этого необходимо отключить транскодинг, который Вы включаете, указывая явно разрешение при воспроизведении. Если играть поток с тем же разрешением, с которым он опубликован, транскодинга не будет
2. Как нам настроить авто-подстройку качества в зависимости от канала
смотрящего, если когда мы не указываем в create_stream никаких
значений как разрешений мы получаем плохую картинку.
Вы можете контролировать качество канала при публикации. Обратите внимание. что на лету изменить параметры публикации WebRTC невозможно, необходимо публиковать поток заново.
Кроме того, качество картинки зависит от разрешения, битрейта и пропускной способности канала публикующего или играющего клиента. Для того, чтобы качество картинки было хорошим, необходимо задавать разрешение и битрейт при публикации, причем таким образом. чтобы канал позволял передать или принять поток. Допустим, если Вы публикуете поток с битрейтом 1 Мбит/с, будет занято по меньшей мере столько в канале паблишера и зрителя. Посмотрите здесь рекомендации по управлению битрейтом
3. Какую схему и как её разворачивать если нам станет не хватать
ресурсов, для вертикального маштабирования или есть вариант горизонтального с несколько origin?
С планируемыми Вами объемами публикации масштабирование origin сервера не требуется, если не будет транскодинга. Поэтому масштабировать имеет смысл edge серверы. Посмотрите документацию по настройке балансировки нагрузки в AWS EC2 и в Google Cloud
4. Есть ли возможность для декодирования использовать видеокарту?
Цель в будущем держать большое кол-во стримеров и раздачу им.
В данным момент мы работаем над выводом транскодинга на GPU NVIDIA в продакшн (тикет WCS-2437)
5. Можно ли отдавать как-нибудь профили cdn на origin?
Профили транскодирования используются для запроса на edge сервер потока по определенному профилю. Если в CDN есть транскодер, то транскодировать будет он, если нет, транскодирование работает на origin сервере
6. Какую схему вы порекомендуете нам использовать исходя наших запросов.
Если не будет необходимости в транскодинге, достаточно схемы один origin - много edge серверов
7. Как передать и настроить картинку стрима по webrtc, так как на данный момент она мыльная.
Ответили выше, см вопрос №2
8. Не могли бы вы более расписать роли origin - transcoder - edge и можно ли использовать эти роли например: origin+transcoder - edge или наоборот
Почитайте, пожалуйста, эту статью
9. Есть ли у вас какой-нибудь подобный опыт который вы могли привести в качестве примера который мы могли бы приложить к такой ситуации?
Подобный опыт есть, на его основании мы и отвечаем на вопросы.
 

champloo

New Member
Добрый день.
Для этого необходимо отключить транскодинг, который Вы включаете, указывая явно разрешение при воспроизведении. Если играть поток с тем же разрешением, с которым он опубликован, транскодинга не будет
При отключении транскодинга прекращает работать webrtc

С планируемыми Вами объемами публикации масштабирование origin сервера не требуется, если не будет транскодинга. Поэтому масштабировать имеет смысл edge серверы. Посмотрите документацию по настройке балансировки нагрузки в AWS EC2 и в Google Cloud


Профили транскодирования используются для запроса на edge сервер потока по определенному профилю. Если в CDN есть транскодер, то транскодировать будет он, если нет, транскодирование работает на origin сервере
То есть если мы вводим edge и отключаем транскодирование на origin для наших задач этого будет достаточно?
Просто в данный момент с включенным транскодированием в fullhd нам хватает только на 15 стримеров на выше железе.
В наших планах приобрести сервер с 96 ядер 192 потока

Если не будет необходимости в транскодинге, достаточно схемы один origin - много edge серверов
Трансокдинг нам требуется в любом случае так как мы отдаём всегда в h264 и opus
На сколько он ресурсоёмкий?

Подобный опыт есть, на его основании мы и отвечаем на вопросы.
Как можно с вами связаться что бы вы узнали более точно наши требования, так как форумом их все не передать.


Есть ли у вас примерная картинка по потреблению каждой точки эндпоинта, к примеру:
1 origin
1 transcodig
1 edge
Входящий поток 1920х1080 webrtc или obs 4000 битрейт 320 kbs
Исходящий 1920x1080 webrtc / hls h264 opus
 

Max

Administrator
Staff member
При отключении транскодинга прекращает работать webrtc
Такого быть не должно. Если подаете поток OBS H.264 + AAC, 1080p или Chrome WebRTC H.264 + Opus, 1080p, транскодинг для прямого воспроизведения по WebRTC не требуется.

Основные рекомендации к толстым Full HD потокам 1080p

WebRTC

При тестировании следить за битрейтом по метрикам или в статистике. Если битрейт 1080p потока падает, картинку будет размывать.

1. Публиковать потоки по WebRTC TCP чтобы избежать потери пакетов.


2. Выставить минимальный порог по битрейту на стороне браузера или для всего сервера:

На стороне браузера:

x-google-max-bitrate=7000;x-google-min-bitrate=3000

На стороне сервера:

webrtc_sdp_min_bitrate_bps=3000000
webrtc_sdp_max_bitrate_bps=5000000


OBS RTMP

В случае OBS RTMP проблем с приемом высокого битрейта не возникает. Однако надо отключать B-фреймы в потоке чтобы уйти от транскодирования.


Отключение B-фреймов происходит в OBS путем переключения на энкодер x264 либо явным выставлением настроек b-frames=0 для GPU энкодеров вроде Nvidia.

Таким образом, если у публикующего хватает полосы для публикации Full HD 1080p потока, а у зрителя хватает полосы для воспроизведения этого потока (3-5 мегабит в секунду), то в транскодинге нет необходимости и стримы должны играть корректно.

Если же требуется пережимать 1080p поток для зрителей с плохим каналом, например в 320x180, то желательно делать это на отдельном сервере Transcoder-ноде, чтобы освободить Origin от транскодинговой нагрузки.

В идеале, требуется как минимум 3 сервера: Origin, Edge, Transcoder.
Такую схему можно масштабировать добавлением серверов.

То есть если мы вводим edge и отключаем транскодирование на origin для наших задач этого будет достаточно?
Просто в данный момент с включенным транскодированием в fullhd нам хватает только на 15 стримеров на выше железе.
В наших планах приобрести сервер с 96 ядер 192 потока
Сначала надо избавиться от транскодинга на Origin. В случае необходимости транскодинга для понижения разрешения либо для HLS, полностью перенести транскодинг на отдельный сервер.

Full HD стримы без транскодинга можно потестировать на примере Media Devices
Здесь можно указать транспорт TCP, и сделать подстановки SDP для битрейта, как показано в документации.

С Транскодера может забирать только Edge, поэтому ввод Транскодера автоматически потребует ввода Edge сервера.

Edge в свою очередь, надо настраивать по документации: https://docs.flashphoner.com/displa...ecommendations-Streamdistributionoptimization

Трансокдинг нам требуется в любом случае так как мы отдаём всегда в h264 и opus
На сколько он ресурсоёмкий?
Если вы кормите потоками H.264, транскодинг в вашем случае не требуется. Только аудио транскодинг AAC в Opus для тех потоков, что приходят с OBS. Транскодинг звука не ресурсоемкий относительно видео.

Еще раз, транскодинг нужен если:
1) Исходный стрим с B-фреймами и требуется его пережатие чтобы убрать B-фреймы.
2) Нужно понизить разрешение, например 1080p > 720p
3) Нужно уменьшить задержку и обеспечить постоянный K-фрейм интервал для HLS стримов.
4) Входящий стрим не H.264, а например VP8 и требуется приветси VP8 > H.264

Видео транскодинг 1080p > 1080p будет брать примерно 2 физических ядра на 1 стрим. Сервер 96 ядер обслужит около 50 транскодеров, если они действительно нужны. При этом, если транскодировать надо в низкое разрешение 1080p > 180p, то ресурсов потребуется гораздо меньше, например одно ядро сможет обслужить 2-4 таких энкодера.

Есть ли у вас примерная картинка по потреблению каждой точки эндпоинта, к примеру:
1 origin
1 transcodig
1 edge
Входящий поток 1920х1080 webrtc или obs 4000 битрейт 320 kbs
Исходящий 1920x1080 webrtc / hls h264 opus
Origin и Edge будут потреблять примерно одинаково, т.к. Origin будет транскодировать звук AAC > Opus, а Edge будет раздавать много трафика. Транскодер будет потреблять максимум CPU.

Origin 24 ядра, 64 GB RAM
Edge 24 ядра, 128 GB RAM
Transcoder 96 ядер, 128 GB RAM

При этом, для HLS лучше выделить отдельный HLS Edge, чтобы раздавать с него только HLS.

Как можно с вами связаться что бы вы узнали более точно наши требования, так как форумом их все не передать.
Если форумного канала не хватает, можете запросить канал приоритетной техподдержки sales@flashphoner.com

Если требуется отправить приватные данные, такие как доступы, пароли, можете воспользоваться приватной формой по кнопке Report в верхней части этой темы. Прямая ссылка Report.

Итого рекомендация. Избавиться от транскодинга и убедиться, что Full HD стримы нормально работают без транскодинга при достаточной полосе. После этого вводить транскодинг на отдельном транскодинг-сервере.
 

champloo

New Member
тогда следует 3 вопроса:
1. Как сделать такой вариант:
Отдача fullhd - без транскодирования
Ниже качество - с транскодированием
2. Как отдельно транскодировать звук оставляя без транскодирования качество

Как понимаю выше 2 вопроса решаются профилями.

3. Можно получить общие рекомендации по настройкам тогда в этом варианте?
 

Max

Administrator
Staff member
3. Можно получить общие рекомендации по настройкам тогда в этом варианте?
В качестве примера можно взять следующие настройки профилей (предполагаем, что публикуется H264 поток 1080p с высоким битрейтом, как рекомендовано выше, аудио Opus или AAC):
Code:
profiles:
# AAC to Opus 48 kHz to play in browser, video is passed as is
-opus:
  audio:
    codec : opus
    rate : 48000
# Downscaling video to 240p 500 kbps for mobile networks
-240p:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 240
    bitrate : 500
    codec : h264
    codecImpl : OPENH264
# Downscaling video to 480p 1000 kbps for WiFi networks
-480p:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 480
    bitrate : 1000
    codec : h264
    codecImpl : OPENH264
# Downscaling video to 720p 1500 kbps for wired networks
-720p:
  audio:
    codec : opus
    rate : 48000
  video:
    height : 720
    bitrate : 1500
    codec : h264
    codecImpl : OPENH264
Обратите внимание, что битрейт влияет на качество проигрывания (чем выше, тем лучше), в данном примере он с этой целью завышен.
Эти профили описываются в файле cdn_profiles.yml на Edge сервере. Тогда клиенты, которые подключаются к Edge, запрашивают поток stream1 по профилю, например
- stream1-opus - оригинальное качество с транскодированием только аудио в Opus
- stream1-720p - качество 720p, если канал от Edge сервера до ПК клиента не позволяет передать 1080p с битрейтом 4000 кбит/с (на клиенте начинаются фризы), но позволяет передать 720p 1500 кбит/с
- и т.д.
На HLS Edge профили аудио будут другими, поскольку в HLS транслируется AAC, а не Opus:
Code:
profiles:
# Convert audio to AAC to play as HLS, video is passed as is
-aac:
  audio:
    codec : mpeg4-generic
    rate : 48000
# Downscaling video to 240p 500 kbps for mobile networks
# FPS and keyframe smoothing to play as HLS
-240p:
  audio:
    codec : mpeg4-generic
    rate : 48000
  video:
    height : 240
    bitrate : 500
    codec : h264
    gop : 90
    fps : 30
    codecImpl : OPENH264
  ...
Также обратите внимание, что для HLS требуется вырoвнять FPS и стабилизировать keyframe interval. Если для потоков из OBS keyframe interval настраивается в самом OBS, то в браузере его настроить нельзя, в этом случае на Origin в настройках WCS нужно включить периодическую отправку запроса на формирование ключевого кадра браузеру, и задать периодичность, например, раз в 2 секунды
Code:
periodic_fir_request=true
periodic_fir_request_interval=2000
Остальные общие рекомендации приведены выше.
 

champloo

New Member
Добрый день.

В целом мы закончили настройку и настроили по настройкам выше.
Но transcoder не хочет иницилизиророваться.
EDGE сообщает о: No available transcoders

Если мы предоставим вам kubectl конфигурацию(для kubernetes)
Вы сможете проанализировать и сообщить, что нам требуется поправить?
 

Max

Administrator
Staff member
Добрый день.

Сообщение говорит о том, что Edge сервер не видит Транскодер.
Серверы в CDN общаются по порту 8084 (websocket).
Code:
cdn_port=8084
Сделайте дамп трафика на стороне Edge сервера и Транскодера, откройте этот дамп в Wireshark и убедитесь что серверы обмениваются сообщениями на этом порту. Если такого обмена сообщениями нет, убедитесь что порт открыт и TCP соединение между серверами может быть установлено.

Снимаем дамп
Code:
tcpdump port 8084 -B 10000 -w log.pcap
Проверяем с Edge сервера доступность транскодера
Code:
telnet transcoder-ip 8084
Проверяем с Транскодер сервера доступность Edge
Code:
telnet edge-ip 8084
Кроме этого, можно использовать REST API /cdn/show_nodes, чтобы посмотреть какие ноды есть в CDN.

Если мы предоставим вам kubectl конфигурацию(для kubernetes)
Нас больше интересует какие серверы действительно запущены, какой у них конфиг flashphoner.properties какой IP адрес, открыт ли требуемый порт, проходит ли по этому порту трафик.

Вы можете конечно прислать kubectl, но у нас может занять много времени запуск Kubernetes, потому что не приходилось с этим работать.
Форма отправки здесь (кнопка Report).
 

champloo

New Member
transcoder в наличии есть, но не работает.
{ "version": "2.5", "role": "TRANSCODER", "inboundConnected": true, "outboundConnected": false, "globalState": "ACTIVE", "processingState": "GROUP_CONNECTIONS_ALLOWED", "group": "EU", "connectionStats": { "lastRtt": 32, "lastSn": 19, "lastMessageSentMs": 1625771872540, "lastACKReceivedMs": 1625771872544, "maxRtt": 68, "inFlightSize": 0 }, "id": "0.0.0.0=тут-адрес" },
 

champloo

New Member
Связь и коннект тоже между ними есть. Но запросы на транскодер не приходят(server_log) пустой
 

champloo

New Member
Добрый день.

Сообщение говорит о том, что Edge сервер не видит Транскодер.
Серверы в CDN общаются по порту 8084 (websocket).
Code:
cdn_port=8084
Сделайте дамп трафика на стороне Edge сервера и Транскодера, откройте этот дамп в Wireshark и убедитесь что серверы обмениваются сообщениями на этом порту. Если такого обмена сообщениями нет, убедитесь что порт открыт и TCP соединение между серверами может быть установлено.

Снимаем дамп
Code:
tcpdump port 8084 -B 10000 -w log.pcap
Проверяем с Edge сервера доступность транскодера
Code:
telnet transcoder-ip 8084
Проверяем с Транскодер сервера доступность Edge
Code:
telnet edge-ip 8084
Кроме этого, можно использовать REST API /cdn/show_nodes, чтобы посмотреть какие ноды есть в CDN.


Нас больше интересует какие серверы действительно запущены, какой у них конфиг flashphoner.properties какой IP адрес, открыт ли требуемый порт, проходит ли по этому порту трафик.

Вы можете конечно прислать kubectl, но у нас может занять много времени запуск Kubernetes, потому что не приходилось с этим работать.
Форма отправки здесь (кнопка Report).
Поставьте себе клиент LENS
Namespace flashphoner
В нём есть 3 контейнера с flashphoner и 3 контейнера nginx.
Если потребуется, экспрес гайд, напишите в телеграм. приложу тоже в репорте
 

Max

Administrator
Staff member
Если потребуется, экспрес гайд, напишите в телеграм. приложу тоже в репорте
К сожалению, не получили пока доступов. Общение с клиентами проходит только на форуме, для передачи конфиденциальной информации и репортов используется кнопка Report. См также условия и правила оказания технической поддержки здесь.
Если для доступа к серверу требуется специальный клиент (не просто SSH), к доступам должна прилагаться пошаговая инструкция.
Уточните также, доступен ли транскодер с обоих узлов (Origin и Edge)?
 
Top