Передать стрим с одного WCS_1 на другой WCS_2 по webrtc

Kirill

Member
Подскажите, как можно передать стрим с одного WCS на другой по webrtc. Так, чтобы в случае каких-либо неполадок передача восстанавливалась как принимающая сторона вернется в строй.
 

Kirill

Member
Читая доку , вижу пример только для rtmp, как сделать для webrtc ?
Для webrtc нашел отправку через rest, можно ли сделать так же как и тут прописав в конфиг ?
 
Last edited:

Max

Administrator
Staff member
CDN работает полностью на WebRTC
https://docs.flashphoner.com/display/WCS5RU/CDN+2.0
Origin - принимает входящий поток
Edge1 - забирает с Origin и раздает зрителям
Edge2 - забирает с Origin и раздает зрителям
Если у зрителя проблема, например с Edge1, он переключается на Edge2 и продолжает забирать поток с него.
 

Max

Administrator
Staff member
В самой минимальной конфигурации, вы можете настроить Origin и Edge1
В этом случае если проблемы при воспроизведении с Edge1 переключаться напрямую на Origin.
 

Kirill

Member
В самой минимальной конфигурации, вы можете настроить Origin и Edge1
В этом случае если проблемы при воспроизведении с Edge1 переключаться напрямую на Origin.
На сколько я понимаю если все edge в норме, то клиент не может получить стрим от origin ? Я бы хотел полноценно юзать origin как edge, только + ко всему с него пересылать поток на соседа.
 

Max

Administrator
Staff member
На сколько я понимаю если все edge в норме, то клиент не может получить стрим от origin ?
Нет. Origin не имеет ограничений на прямые подключения. Поэтому его вполне нормально использовать как Edge.
Я бы хотел полноценно юзать origin как edge, только + ко всему с него пересылать поток на соседа.
Так и будет работать в связке Origin + Edge1.

При этом, CDN работает по "ленивой" схеме. Поток с Origin на Edge1 начнет реально пересылаться только тогда, когда на Edge1 его попытается воспроизвести первый зритель.
Это сильно экономит ресурсы при публикации множества потоков.

Если же хочется ретранслировать поток вручную, без CDN, то можно так:
https://docs.flashphoner.com/pages/viewpage.action?pageId=1049038
 

Kirill

Member
Не подскажите как сделать аутентификацию на получение стрима клиентом, что-то не могу накопать в доке..
 

Max

Administrator
Staff member
Нет. Origin не имеет ограничений на прямые подключения. Поэтому его вполне нормально использовать как Edge.
Более того, Edge тоже не имеет ограничений на прямые подключения и на него тоже можно публиковать потоки напрямую.
Разница между Origin и Edge только в том, что с Edge-сервера можно воспроизвести поток, опубликованный на Origin.
А с Origin сервера нельзя воспроизвести поток, опубликованный на Edge, т.к. Edge не делится своими потоками с другими нодами CDN.
 

Kirill

Member
Более того, Edge тоже не имеет ограничений на прямые подключения и на него тоже можно публиковать потоки напрямую.
Разница между Origin и Edge только в том, что с Edge-сервера можно воспроизвести поток, опубликованный на Origin.
А с Origin сервера нельзя воспроизвести поток, опубликованный на Edge, т.к. Edge не делится своими потоками с другими нодами CDN.
Отл!!!
 

Max

Administrator
Staff member
Авторизация работает через REST хуки
https://docs.flashphoner.com/display/WCS52RU/REST+hooks

Т.е. вам на сервере нужно обработать входящий REST/HTTP запрос и ответить 200 OK (авторизован) или 403 Forbidden (не авторизован).
Чтобы понять, как работают REST хуки, вам нужно реализовать пример чтобы он заработал:
https://docs.flashphoner.com/pages/viewpage.action?pageId=9241817
Если это получится сделать, то далее можно добавить хук на /playStream или /publishStream и авторизация заработает для стримов.
По вопросам авторизации, просьба создать отдельную ветку форума.
 

Kirill

Member
Нет. Origin не имеет ограничений на прямые подключения. Поэтому его вполне нормально использовать как Edge.

Так и будет работать в связке Origin + Edge1.

При этом, CDN работает по "ленивой" схеме. Поток с Origin на Edge1 начнет реально пересылаться только тогда, когда на Edge1 его попытается воспроизвести первый зритель.
Это сильно экономит ресурсы при публикации множества потоков.

Если же хочется ретранслировать поток вручную, без CDN, то можно так:
https://docs.flashphoner.com/pages/viewpage.action?pageId=1049038
При попытке подключиться edge сервером к origin в логах edge - ошибка:
Code:
CDNNodes - com.flashphoner.cdn.node.CDNNodes Failed to connect to node origin.domain.com
17:46:24,084 INFO                     C - CDNOutbound-BOSS-pool-34-thread-1 Exception on channel [id: 0x46dcfcfa]
С чем это может быть связано ?
 

Max

Administrator
Staff member
Возможно порт 8084, по которому работает сигналинг внутри CDN закрыт.
Или домен не резолвится, например если
Code:
cdn_nodes_resolve_ip=false
Покажите настройки на Origin и на Edge.
 

Kirill

Member
Ошибка на edge:
Code:
14:43:00,823 ERROR             CDNNodes - com.flashphoner.cdn.node.CDNNodes Failed to connect to node 77.112.112.112
14:43:01,847 INFO                     C - CDNOutbound-BOSS-pool-34-thread-1 Exception on channel [id: 0x751729ad]
Отключил, проблема остается. По telnet с edge успешно подключаюсь на origin:8084.

---

Так же обнаружил следующую странность, на origin при включенном cdn невозможно посмотреть стрим, если отключить cdn, то нормально воспроизводится стрим
Лог с origin
Code:
16:33:01,078 ERROR         HandlerUtils - API-ASYNC-pool-12-thread-1 Failed to invoke method playStream for client WSClient{channel=[id: 0x5892c19c, /222.222.222.222:58212 => /192.168.0.2:8443], handler=com.flashphoner.server.client.handler
.DelegateHandler@6eb42cb7, closed=false, pageUrl='null', countUnansweredPing=0}
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.flashphoner.server.client.handler.HandlerUtils.lambda$processThroughREST$0(Unknown Source)
        at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
        at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736)
        at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:442)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.flashphoner.server.D
        at com.flashphoner.server.client.handler.wcs4.media.MediaHandlerUtils.playCDNStream(Unknown Source)
        at com.flashphoner.server.client.handler.wcs4.media.MediaHandlerUtils.playStream(Unknown Source)
        at com.flashphoner.server.client.handler.wcs4.media.MediaHandler.playStream(Unknown Source)
        ... 11 more
16:33:01,079 ERROR         HandlerUtils - API-ASYNC-pool-12-thread-1 Stream Stream{mediaSessionId='5fb63b00-36a6-11e9-af31-5bf8680dd3cf', remoteMediaElementId='null', name='cam_test', published=false, hasVideo=true, hasAudio=true, status=
PENDING, sdp='v=0
o=- 5270075598498615998 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:00fN
a=ice-pwd:WV0DaJP6UJ+3mhytBkGfJtth
a=ice-options:trickle
a=fingerprint:sha-256 6D:07:81:E9:8C:5B:EC:D5:89:39:52:E2:E5:EC:5F:F1:1C:4C:A9:A6:CA:E9:25:D3:7B:27:5A:C4:CB:56:A3:AB
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 123 127 122 125 107 108 109 124
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:00fN
a=ice-pwd:WV0DaJP6UJ+3mhytBkGfJtth
a=ice-options:trickle
a=fingerprint:sha-256 6D:07:81:E9:8C:5B:EC:D5:89:39:52:E2:E5:EC:5F:F1:1C:4C:A9:A6:CA:E9:25:D3:7B:27:5A:C4:CB:56:A3:AB
a=setup:actpass
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 urn:3gpp:video-orientation
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:10 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 H264/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:123 rtx/90000
a=fmtp:123 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:122 rtx/90000
a=fmtp:122 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 red/90000
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:124 ulpfec/90000
', audioCodec='null', videoCodec='null', info='null', record=false, recordName='null', width=0, height=0, bitrate=0, minBitrate=0, maxBitrate=0, quality=0, rtmpUrl='null', parentMediaSessionId='null', createDate=null, endDate=null, streamInfo=Context{custom={}, nodeId='null', appKey='null', sessionId='null'}, mediaProvider='WebRTC', timeShift='null'} Context{custom={origin=https://wcs.domain.name:8888}, nodeId='null', appKey='defaultApp', sessionId='/222.222.222.222:58212/192.168.0.2:8443'}
 
Last edited:

Kirill

Member
Возможно порт 8084, по которому работает сигналинг внутри CDN закрыт.
Или домен не резолвится, например если
Code:
cdn_nodes_resolve_ip=false
Покажите настройки на Origin и на Edge.
Origin
Code:
ip                     =78.222.222.222
ip_local               =192.168.0.1
port_from              =30000
port_to                =31000
media_port_from        =31001
media_port_to          =32000
waiting_answer         =60
user_agent             =Flashphoner/1.0
balance_header         =balance
cost_header            =cost
video_enabled          =true
domain                 =
outbound_proxy         =
outbound_port          =
log_level              =5
enable_context_logs    =false
rtp_activity_detecting =true,60
sip_msg_listener       =com.flashphoner.sdk.sip.ChangeCallIdListener
call_record_listener   =com.flashphoner.server.client.DefaultCallRecordListener
dtmf                     =rfc2833
auto_login_url         =/usr/local/FlashphonerWebCallServer/conf/account.xml
get_callee_url         =/usr/local/FlashphonerWebCallServer/conf/callee.xml
#codecs                   =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,flv,mpv
codecs                   =alaw,ulaw,h264,mpeg4-generic
codecs_exclude_sip       =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
#codecs_exclude_sip_rtmp  =opus,g729,g722,mpeg4-generic,vp8,mpv
codecs_exclude_sip_rtmp  =opus,g729,g722,vp8,mpv
on_record_hook_script  =on_record_hook.sh
rtmp_transponder_stream_name_prefix =rtmp_
ws.port                 =8080
wss.port                =8443
wss.keystore.password   =password
wss.cert.password       =password
rtmp.port               =1935
rtmfp.port              =1935
keep_alive.algorithm       =HIGH_LEVEL
# For push stream from OBS.
# https://forum.flashphoner.com/threads/open-broadcast-software-as-stream-source.10949/
# https://forum.flashphoner.com/threads/%D0%9D%D0%B5-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F-%D0%B2%D0%BE%D1%81%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA-%D1%81-ffmpeg-%D0%B2-%D0%BF%D0%BB%D0%B5%D0%B5%D1%80%D0%B5-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-ws.10992/page-2
keep_alive.enabled=websocket,rtmfp
#keep_alive.algorithm    =NONE
#
keep_alive.peer_interval   =2000
keep_alive.server_interval =5000
keep_alive.probes          =10
video_reliable          =partial
audio_reliable          =partial
audio_frames_per_packet =6
burst_avoidance_count   =100
flush_audio_interval    =80
flush_video_interval    =0

# Декодирование потока
# https://docs.flashphoner.com/pages/viewpage.action?pageId=3050530
streaming_video_decoder_fast_start=false
# Disable transcoding
force_client_requested_video_resolution=false
# Enable monitoring live stream
disable_manager_rmi=false


####
## CDN
###
cdn_enabled=true
cdn_ip=wcs.origin.doamin.name
cdn_nodes_resolve_ip=false
cdn_role=origin

Edge


Code:
# Config flashphoner.properties
# To get more settings:
# ssh -p 2001 admin@localhost
# default password: admin
# show node-settings
# show node-settings | grep port

#server ip
ip                     =194.222.222.222
ip_local               =194.222.222.222

#webrtc ports range
#Beginning of media ports range for ICE, RTP, SRTP, RTCP
media_port_from        =31001
media_port_to          =32000

#codecs
#codecs                   =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,flv,mpv
codecs                   =alaw,ulaw,h264,mpeg4-generic
codecs_exclude_sip       =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
codecs_exclude_sip_rtmp  =opus,g729,g722,mpeg4-generic,vp8,mpv

#websocket ports
ws.port                 =8080
wss.port                =8443

keep_alive.algorithm       =HIGH_LEVEL
# For push stream from OBS.
# https://forum.flashphoner.com/threads/open-broadcast-software-as-stream-source.10949/
# https://forum.flashphoner.com/threads/%D0%9D%D0%B5-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D0%B5%D1%82%D1%81%D1%8F-%D0%B2%D0%BE%D1%81%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA-%D1%81-ffmpeg-%D0%B2-%D0%BF%D0%BB%D0%B5%D0%B5%D1%80%D0%B5-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-ws.10992/page-2
keep_alive.enabled=websocket,rtmfp

# Декодирование потока
# https://docs.flashphoner.com/pages/viewpage.action?pageId=3050530
streaming_video_decoder_fast_start=false
# Disable transcoding
force_client_requested_video_resolution=false
# Enable monitoring live stream
disable_manager_rmi=false


####
##CDN
####
cdn_enabled=true
cdn_ip=wcs.edge.domain.name
cdn_nodes_resolve_ip=false
cdn_point_of_entry=wcs.origin.domain.name
cdn_role=edge
codecs_exclude_cdn=aac,g729,speex16,g722,telephone-event,mpv
 

Max

Administrator
Staff member
1. Попробуйте в настройках CDN везде использовать IP адреса и cdn_nodes_resolve_ip=false
или
2. Использовать в настройках CDN везде домены и cdn_nodes_resolve_ip=true

Сейчас у вас используются домены, а настройка resolve выставлена в false. Возможно поэтому серверы друг друга не видят.
 

Kirill

Member
1. Попробуйте в настройках CDN везде использовать IP адреса и cdn_nodes_resolve_ip=false
2. Использовать в настройках CDN везде домены и cdn_nodes_resolve_ip=true
Пробовал оба варианта, результат одинаковый, на edge прежние ошибки.

В этом сообщении написал, что появилась проблема на origin. При включенном параметре cdn невозможно воспроизведение webrtc стрима. Видео кодек h.264, audio alaw
 
Last edited:

Kirill

Member
Возможно порт 8084, по которому работает сигналинг внутри CDN закрыт.
Или домен не резолвится, например если
Code:
cdn_nodes_resolve_ip=false
Покажите настройки на Origin и на Edge.
Домен резолвится.
На origin сервере в слушателях должен быть 8084 порт ?
По tcpdump на origin я вижу попытки подключения с edge->origin . Основной сетевой интерфейс за NAT (провайдер так предоставляет услугу) это может влиять на работу CDN ?
 

Kirill

Member
Домен резолвится.
На origin сервере в слушателях должен быть 8084 порт ?
По tcpdump на origin я вижу попытки подключения с edge->origin . Основной сетевой интерфейс за NAT (провайдер так предоставляет услугу) это может влиять на работу CDN ?
Указав локальный ip(который за nat) в параметре cdn_ip, в слушателях появился порт ip:8084. Но ошибка осталась прежней, по tcpdump на origin так же видны попытки подключения с edge .
 
Last edited:

Max

Administrator
Staff member
Добрый день.
Проблема в том, что Origin расположен за NAT, а Edge имеет публичный IP адрес. В этом случае на NAT должен быть корректно настроен проброс всех портов на Origin, как на вход, так и на выход. Если настроить не получается, то единственное решение - вынести Origin за пределы локальной сети, на публичный IP адрес.
 

Kirill

Member
Добрый день.
Проблема в том, что Origin расположен за NAT, а Edge имеет публичный IP адрес. В этом случае на NAT должен быть корректно настроен проброс всех портов на Origin, как на вход, так и на выход. Если настроить не получается, то единственное решение - вынести Origin за пределы локальной сети, на публичный IP адрес.
А как быть с воспроизведением видео при включенном CDN ? Писал в нескольких постах выше.
https://forum.flashphoner.com/threa...1-на-другой-wcs_2-по-webrtc.11902/#post-19166
 
Last edited:
Top