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

1. Два пользователя подключаются по WebRTC и отсылают поток с вебкамер
2. На сервере их потоки микшируются в один по определенным правилам (это я могу и сам с помощью ffmpeg сделать, главное иметь возможность получить входные и отдать выходной), например картинка-в-картинке
3. Остальные пользователи могут смотреть получившийся поток тоже по WebRTC.

Задержка должна быть не более 2с. Сделал такое решение на wowza, но она требует транскодинга потоков, и порождает тучу артефактов, задержка небольшая но выглядит такой поток мерзко. Можно ли сделать с Flashphoner?

И напоследок - сколько исходящих потоков одновременно потянет сервер? Полосы хватит, 10 гигабит. 2000 потоков по 1 мегабиту каждый - выдержит скажем на 2x4-ядерном Xeon с AVX-512? Т.е. скажем в сценарии что этих двоих с потоком смонтированным в 1, смотрит 2000 человек?
 

Max

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

Можно ли сделать с Flashphoner?
Да, это можно сделать. Технически все для этого есть.
1. User1 публикует WebRTC поток stream1 на сервер.
2. User2 публикует WebRTC поток stream2 на сервер.
3. ffmpeg забирает оба потока по RTMP
rtmp://host:1935/live/stream1
rtmp://host:1935/live/stream2
4. ffmpeg микширует потоки в stream3 и отправляет на сервер по RTMP
rtmp://host:1935/live/stream3
5. User3 играет поток stream3 по WebRTC

Задержка должна быть не более 2с. Сделал такое решение на wowza, но она требует транскодинга потоков, и порождает тучу артефактов, задержка небольшая но выглядит такой поток мерзко.
Нужно тестировать. Возможно так и не получится увидеть нормальный стрим на выходе.
Дело в том что WebRTC стриминг идет с плавающим FPS в отличие от RTMP, т.е. чтобы его правильно смикшировать потребуется выровнять FPS на потоках. Мы начинали реализовывать микширование видео, но приостановили по этой причине.

И напоследок - сколько исходящих потоков одновременно потянет сервер? Полосы хватит, 10 гигабит. 2000 потоков по 1 мегабиту каждый - выдержит скажем на 2x4-ядерном Xeon с AVX-512? Т.е. скажем в сценарии что этих двоих с потоком смонтированным в 1, смотрит 2000 человек?
Сервер должен выдержать. Памяти RAM желательно от 64 GB и быстрой.
 
>Дело в том что WebRTC стриминг идет с плавающим FPS в отличие от RTMP
Вот это я как раз сделал уже, на C. Магия с семафорами и очередью кадров :)
Хорошо, можно сделать хотя бы простой пример - делаем такое:

>ffmpeg -an -i rtmp://127.0.0.1:1935/webrtc/test2_desktop -f rawvideo -s 1152x720 -r 30 -pix_fmt yuv420p - | ffmpeg -f rawvideo -s 1152x720 -r 30 -pix_fmt yuv420p -i - -c:v libx264 -tune zerolatency -r 30 -b:v 2048k -an -f flv rtmp://127.0.0.1:1935/webrtc/test2_desktop2

То есть засасываем поток - прямо на сервере где крутится flashphoner - как rtmp и выдаём как rtmp же под другим именем, без звука, пропустив на ходу через raw video. Логика такая что там можно вставить ещё одну трубу которая с этим потоком сделает всё что захочет, на проходе - и латентности это не добавит.

Можете сделать такой тест у себя, отсылая именно shared screen, и прислать скриншот http://ipadstopwatch.com/full-screen-stopwatch.html c окном браузера в котором играется, и принимающем окне webrtc, засасывающем второй поток? Если разница будет меньше 2с - сразу покупаю лицензию. Если есть идеи как изменить настройки ffmpeg для энкодинга чтоб задержка получилась меньше 2с, тоже поможет естественно. И исходник миксовалки могу подарить потом :)

RTMP тут конечно, как пятое колесо... Но какие ещё есть варианты чтобы забрать поток от сервера в ffmpeg, и отдать обратно? Если есть - с удовольствием рассмотрю.

>Памяти RAM желательно от 64 GB и быстрой.
Тю, суну хоть 256
 
Last edited:
Пробую сам... пока застрял на том что отсылаю поток на странице https://ec2-xxxx.eu-central-1.compute.amazonaws.com:8888/dashboard.xhtml и он вроде как паблишится, но получить его на севере как rtmp не могу: input-output error. Какой правильный формат командной строки ffmpeg?
Пробую так:

ffmpeg -f flv -i rtmp://172.31.29.242:1935/live/b7d4
пробовал как внутренний, так и внешний IP-адрес, и 127.0.0.1 тоже. Что я делаю не так?

Нашел что нужно приписывать rtmp_ к имени потока, но результат тот же
ffmpeg -i rtmp://localhost:1935/live/rtmp_b7d4
.....
rtmp://localhost:1935/live/rtmp_b7d4: Input/output error

Перебор вариантов ничего не дал, может кто-то реально объяснить как это делается, плиз?

Но на порту 1935 что-то запущено, он отвечает... И поток определеённо работает, в другом браузере его удаётся посмотреть, задержка очень маленькая что радует (а не как у вовзы). Или не /live/ должно быть а что-то ещё? Где его посмотреть или создать?
 
Last edited:

Max

Administrator
Staff member
Нужно обновиться до последней версии.
Code:
service webcallserver update
При таком тесте ошибок не выдает:
Code:
ffmpeg -f flv -i rtmp://172.31.29.242:1935/live/b7d4
Пример выше запускается и публикует поток
Code:
ffmpeg -an -i rtmp://127.0.0.1:1935/webrtc/test2_desktop -f rawvideo -s 1152x720 -r 30 -pix_fmt yuv420p - | ffmpeg -f rawvideo -s 1152x720 -r 30 -pix_fmt yuv420p -i - -c:v libx264 -tune zerolatency -r 30 -b:v 2048k -an -f flv rtmp://127.0.0.1:1935/webrtc/test2_desktop2
Но видео не играет.
Возможно проблема в аудио составляющей.
Попробуйте добавить транскодинг аудио в AAC с помощью ffmpeg.
Поток публикуется в таком виде mp4 H.264+AAC. Так публикация с ролика работает.
Code:
ffmpeg -re -i /tmp/VIDEO2findingnews.mp4 -preset ultrafast -acodec aac -vcodec h264 -strict -2 -f flv rtmp://192.168.88.59:1935/live/stream1
RTMP тут конечно, как пятое колесо... Но какие ещё есть варианты чтобы забрать поток от сервера в ffmpeg, и отдать обратно? Если есть - с удовольствием рассмотрю.
Присылайте код микширования, если не жалко. Попробуем сделать прототип встроенного микшера. logs@flashphoner.com
Кроме интеграции по RTMP, пока рабочих вариантов нет.
 
Спасибо! Проблема однако не в аудио составляющей, потому что тут -an - там никакого аудио вообще нет.
 
еее заработало (правда пока только с вебкой), задержка 1.1с! сажу кодера разбираться как сделать скриншаринг, проверю задержку на нём, если в пределах 2с, покупаю лицуху
 
Last edited:
есть ли у вас какие-то штатные средства лоад-тестирования WebRTC? или дедовским способом - Xvfb, Chromium, ec2 и вперёд?

просто хочется сразу для уверенности 2000 потоков засосать, чтобы уже не думалось.
 
Last edited:

Max

Administrator
Staff member
Для нагрузочного тестирования можно попробовать pulling:
Пример адреса (Dashboard - Demo - Console)
http://wcs5-eu.flashphoner.com:9091/client2/examples/demo/streaming/console/console.html
Для теста нужно два физических сервера с гигабитной полосой между ними.
На первый сервер отпраляем поток.
Со второго сервера делаем pulling потока 2000 раз. Т.е. забираем 2000 стримов.
Для работы этой нагрузочной консоли нужно включить расширение браузера Google Chrome, открывающее кроссдоменные запросы:
https://chrome.google.com/webstore/...-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
 

Attachments

Спасибо за инфу про тестирование! Так и сделаю.

Осталась ровно одна непонятность - как быть со звуком? Получить звук от WebRTC передатчика через ffmpeg и rtmp на сервере я могу, попробовал записать на диск .mp3 и скачать - играется, звук корректный, качество нормальное. Вопрос как передать чтобы было слышно? Какой кодек ставить? Я если честно слабо представляю существует ли вообще аудио кодек который был бы совместим с rtmp (чтоб можно было выдать с ffmpeg) и с WebRTC одновременно.

Можно пример командной строки ffmpeg передающей любой поток (допустим mp4 файл) с аудио, именно с указанием конкретного аудио кодека и его настроек, так чтоб его можно было через WebRTC услышать?

Спасибо!
 

Max

Administrator
Staff member
Тюнинг сервера

1. WCS_HOME/conf/flashphoner.properties
Code:
#UDP буфер RX
rtp_receive_buffer_size = 134217728
#UDP буфер TX
rtp_send_buffer_size = 134217728
#Отключение декодера по умолчанию
streaming_video_decoder_fast_start  = false
#Отключение нотификаций на manager процесс
disable_manager_rmi = true
#Отключение расширенного логгирования
enable_extended_logging = false
2. WCS_HOME/conf/wcs-core.properties
Code:
#Heap
-Xms32g
#Heap
-Xmx32g
-XX:+UseConcMarkSweepGC
-XX:NewSize=1024m
-XX:+ExplicitGCInvokesConcurrent
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
-Dsun.rmi.dgc.client.gcInterval=36000000000
-Dsun.rmi.dgc.server.gcInterval=36000000000
 
А зачем эти настройки? Что они меняют? Или к вопросу о большой нагрузке или о звуке? Я так понял о нагрузке скорее, учитывая настройки Java машины.
 

Max

Administrator
Staff member
Можно пример командной строки ffmpeg передающей любой поток (допустим mp4 файл) с аудио, именно с указанием конкретного аудио кодека и его настроек, так чтоб его можно было через WebRTC услышать?
Пример с кодеком AAC:
Code:
ffmpeg -re -i /tmp/VIDEO2findingnews.mp4 -preset ultrafast -acodec aac -vcodec h264 -strict -2 -f flv rtmp://192.168.88.59:1935/live/stream1
WCS сервер получает RTMP поток в H.264+AAC и транскодирует его в аудио части в H.264+Opus. Т.е. играть будет Opus.
Вопрос как передать чтобы было слышно? Какой кодек ставить? Я если честно слабо представляю существует ли вообще аудио кодек который был бы совместим с rtmp (чтоб можно было выдать с ffmpeg) и с WebRTC одновременно.
Кодек G.711 (pcma и pcmu) ходит в WebRTC и в RTMP.
Но его не получится просто так протянуть по всей этой цепочке. По умолчанию используем Opus для WebRTC и AAC для RTMP.
Чтобы переключить это все на G.711 нужны дополнительные настройки и тесты.
 
OK, хорошо - то есть WCS берёт на себя декодирование и для меня этот факт прозрачен. Спасибо! Буду пробовать завтра.
 

Max

Administrator
Staff member
А зачем эти настройки? Что они меняют? Или к вопросу о большой нагрузке или о звуке? Я так понял о нагрузке скорее, учитывая настройки Java машины.
Да, это к нагрузке. В комментариях кратко описано что они меняют.
Например, настройка -Xmx32g увеличивает хип память до 32 гигабайт
Настройка:
streaming_video_decoder_fast_start = false
выключает декодинг потоков и снижает использование CPU
Настройка -XX:+UseConcMarkSweepGC включает нестандартный сборщик мусора, который предотвращает паузы в потоках.
 
Кстати вот ещё вопрос: поддерживаются ли audio only потоки?

Пробую из Streamer в Demo отсылать поток с запрещенной в браузере вебкой, включённым только микрофоном. Потом делаю вот такое:

ffmpeg -vn -i rtmp://127.0.0.1:1935/webrtc/live/859319ee -ar 48000 -ac 1 -f s16le -acodec pcm_s16le - | ffmpeg -ar 48000 -ac 1 -f s16le -acodec pcm_s16le -i - -vn -acodec aac -f flv rtmp://127.0.0.1:1935/webrtc/live/stream1

Поток stream1 с другого компа в Player в том же Demo находится, но не играется, ничего не слышно.

Но если сделать так:

ffmpeg -vn -i rtmp://127.0.0.1:1935/webrtc/live/859319ee -vn ./test.mp3

То в полученном mp3 всё слышно. Почему? На крайняк я конечно могу высылать пустой видеопоток типа 160x120 с зеленым фоном и его не показывать, но это тупо же.
 
Last edited:

Max

Administrator
Staff member
Для публикации audio only потока по WebRTC нужно передавать параметры в javascript
Например:
Code:
session.createStream({name:'stream1',constraints:{audio:true,video:false}}).publish();
Пример:
https://wcs5-eu.flashphoner.com/cli...dia_devices_manager/media_device_manager.html
https://wcs5-eu.flashphoner.com/cli...media_devices_manager/media_device_manager.js
Там можно отключить видео составляющую.

С RTMP сложнее. Кодеки для Flash можно задать в двух SDP файлах, если поместить эти файлы в WCS_HOME/conf
Т.е. чтобы опубликовать или проиграть RTMP поток audio only, возможно придется убрать в этих конфигах видео составляющие.

1. flash_handler_publish.sdp
Code:
v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=42e01f;packetization-mode=1
a=sendonly
m=audio 0 RTP/AVP 97 8 0
a=rtpmap:97 SPEEX/16000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendonly
2. flash_handler_play.sdp
Code:
v=0
o=- 1988962254 1988962254 IN IP4 0.0.0.0
c=IN IP4 0.0.0.0
t=0 0
a=sdplang:en
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=42e01f;packetization-mode=1
a=recvonly
m=audio 0 RTP/AVP 97 8 0 108 96 109 98 99 100 102 103 104
a=rtpmap:97 SPEEX/16000
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:108 mpeg4-generic/48000/1
a=rtpmap:96 mpeg4-generic/8000/1
a=rtpmap:109 mpeg4-generic/11025/1
a=rtpmap:98 mpeg4-generic/12000/1
a=rtpmap:99 mpeg4-generic/16000/1
a=rtpmap:100 mpeg4-generic/22050/1
a=rtpmap:104 mpeg4-generic/24000/1
a=rtpmap:102 mpeg4-generic/32000/1
a=rtpmap:103 mpeg4-generic/44100/1
a=recvonly
 
OK понял, гемор. буду передавать с минимальной полосой искусственное видео с зеленым фоном типа
-s 160x160 -r 15 -f rawvideo -pix_fmt yuv420p -i /dev/zero -shortest -vb 64k
 
Купил лицуху. Пока что всё очень неплохо работает. Спасибо за нормальный продукт!
Но клиентское SDK крайне куцое и по сути толком с ним ничего сделать нельзя.
 

Max

Administrator
Staff member
и по сути толком с ним ничего сделать нельзя
Клиентское SDK проектировалось для простых функций, таких как stream.publish(), stream.play(), stream.stop().
Если нужны какие-то специальные функции, опишите что именно нужно. Добавим в roadmap.
 
Top