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

Discussion in 'Общие вопросы' started by Alexander Novikov, Apr 6, 2018.

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

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

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

    Max Administrator Staff Member

    Добрый день.

    Да, это можно сделать. Технически все для этого есть.
    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

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

    Сервер должен выдержать. Памяти RAM желательно от 64 GB и быстрой.
  3. >Дело в том что 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: Apr 6, 2018
  4. Пробую сам... пока застрял на том что отсылаю поток на странице 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: Apr 6, 2018
  5. Max

    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
    
    Присылайте код микширования, если не жалко. Попробуем сделать прототип встроенного микшера. logs@flashphoner.com
    Кроме интеграции по RTMP, пока рабочих вариантов нет.
  6. Спасибо! Проблема однако не в аудио составляющей, потому что тут -an - там никакого аудио вообще нет.
  7. еее заработало (правда пока только с вебкой), задержка 1.1с! сажу кодера разбираться как сделать скриншаринг, проверю задержку на нём, если в пределах 2с, покупаю лицуху
    Last edited: Apr 7, 2018
  8. есть ли у вас какие-то штатные средства лоад-тестирования WebRTC? или дедовским способом - Xvfb, Chromium, ec2 и вперёд?

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

    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

    Attached Files:

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

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

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

    Спасибо!
  11. Max

    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
  12. А зачем эти настройки? Что они меняют? Или к вопросу о большой нагрузке или о звуке? Я так понял о нагрузке скорее, учитывая настройки Java машины.
  13. Max

    Max Administrator Staff Member

    Пример с кодеком 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.
    Кодек G.711 (pcma и pcmu) ходит в WebRTC и в RTMP.
    Но его не получится просто так протянуть по всей этой цепочке. По умолчанию используем Opus для WebRTC и AAC для RTMP.
    Чтобы переключить это все на G.711 нужны дополнительные настройки и тесты.
  14. OK, хорошо - то есть WCS берёт на себя декодирование и для меня этот факт прозрачен. Спасибо! Буду пробовать завтра.
  15. Max

    Max Administrator Staff Member

    Да, это к нагрузке. В комментариях кратко описано что они меняют.
    Например, настройка -Xmx32g увеличивает хип память до 32 гигабайт
    Настройка:
    streaming_video_decoder_fast_start = false
    выключает декодинг потоков и снижает использование CPU
    Настройка -XX:+UseConcMarkSweepGC включает нестандартный сборщик мусора, который предотвращает паузы в потоках.
  16. Кстати вот ещё вопрос: поддерживаются ли 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: Apr 7, 2018
  17. Max

    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
  18. OK понял, гемор. буду передавать с минимальной полосой искусственное видео с зеленым фоном типа
    -s 160x160 -r 15 -f rawvideo -pix_fmt yuv420p -i /dev/zero -shortest -vb 64k
  19. Купил лицуху. Пока что всё очень неплохо работает. Спасибо за нормальный продукт!
    Но клиентское SDK крайне куцое и по сути толком с ним ничего сделать нельзя.
  20. Max

    Max Administrator Staff Member

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

Share This Page