Hi everyone,
i saw there is a repo with a plugin for Janus NDI but as far as i understand it is only for creating a NDI Sender. My question is: Is there a way to have an NDI Source (e.g. NDI PTZ Camera) in a Videoroom?
Hi everyone,
i saw there is a repo with a plugin for Janus NDI but as far as i understand it is only for creating a NDI Sender. My question is: Is there a way to have an NDI Source (e.g. NDI PTZ Camera) in a Videoroom?
If you mean this repo, as far as I remember it’s not possibile to inject NDI sources into WebRTC videorooms.
That’s correct, the NDI plugin currently only allows you to turn WebRTC users into NDI sources, not the other way around.
I now wrote my own ndi to rtp program and discovered the Simple Whip Server/Client
Now i only got a problem that the Whip Client doesn’t establish a Peer Connection for some reason
This is my Log Output:
--------------------
Simple WHIP client
------------------
WHIP endpoint: https://domain.de/whip/endpoint/ndi
Bearer Token: (none)
Trickle ICE: yes (HTTP PATCH)
Auto STUN/TURN: no
STUN server: stun://123.456.789.3:3478
TURN server: (none)
Audio pipeline: (none)
Video pipeline: videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay pt=96 ssrc=2 ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=96
[WHIP] Initializing the GStreamer pipeline:
webrtcbin name=sendonly bundle-policy=0 stun-server=stun://146.19.191.89:3478 videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay pt=96 ssrc=2 ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=96 ! sendonly.
[WHIP] Configured jitter-buffer size (latency) for PeerConnection to 200ms
[WHIP] Starting the GStreamer pipeline
[WHIP] Creating offer
[WHIP] Offer created
[WHIP] Setting local description
[WHIP] Sending SDP offer (646 bytes)
v=0
o=- 5444639937955269500 0 IN IP4 0.0.0.0
s=-
t=0 0
a=ice-options:trickle
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=setup:actpass
a=ice-ufrag:aQNiOumH2t4T5Jh95wsbaXsTclKNNKZc
a=ice-pwd:6i/Zgjv/vgnuANqovWNTq0tA/tAEaO2O
a=rtcp-mux
a=rtcp-rsize
a=sendonly
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 transport-cc
a=framerate:30
a=ssrc:2 msid:user2361564294@host-f96f5f4f webrtctransceiver0
a=ssrc:2 cname:user2361564294@host-f96f5f4f
a=mid:video0
a=fingerprint:sha-256 6A:D3:9C:2E:92:71:F7:10:9B:7C:47:AF:17:CB:F3:28:D2:5B:C9:94:E0:81:B6:4F:64:B0:5C:DB:0A:5D:AF:58
a=rtcp-mux-only
[WHIP] Resource URL: https://domain.de/whip/resource/TuESXuhpNZTqkjs8
[WHIP] Received SDP answer (667 bytes)
v=0
o=- 1739352297320231 1 IN IP4 45.131.108.132
s=VideoRoom 1234
t=0 0
a=group:BUNDLE video0
a=ice-options:trickle
a=fingerprint:sha-256 E1:E3:0D:76:82:58:E7:3E:C3:5B:1F:C6:EF:46:8B:C7:81:05:B4:A8:90:04:F8:F7:B7:C1:6A:43:44:92:B7:60
a=extmap-allow-mixed
a=msid-semantic: WMS *
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 45.131.108.132
a=recvonly
a=mid:video0
a=rtcp-mux
a=ice-ufrag:mbWF
a=ice-pwd:syk4ahSn/qTTUU57W55Jjk
a=ice-options:trickle
a=setup:active
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=msid:janus janusvideo0
a=ssrc:714158913 cname:janus
[WHIP] Setting remote description
[WHIP] ICE gathering started...
[WHIP] Sending candidates: candidate:1 1 UDP 2015363327 2a02:810b:4327:3a00:e4d3:8061:1fa:30cf 52379 typ host
[WHIP] Sending candidates: candidate:2 1 TCP 1015021823 2a02:810b:4327:3a00:e4d3:8061:1fa:30cf 9 typ host tcptype active
[WHIP] Sending candidates: candidate:3 1 TCP 1010827519 2a02:810b:4327:3a00:e4d3:8061:1fa:30cf 44957 typ host tcptype passive
[WHIP] Sending candidates: candidate:4 1 UDP 2015363583 2a02:810b:4327:3a00:c00e:de09:cab1:7a7 59794 typ host
[WHIP] Sending candidates: candidate:5 1 TCP 1015022079 2a02:810b:4327:3a00:c00e:de09:cab1:7a7 9 typ host tcptype active
[WHIP] Sending candidates: candidate:6 1 TCP 1010827775 2a02:810b:4327:3a00:c00e:de09:cab1:7a7 50667 typ host tcptype passive
[WHIP] Sending candidates: candidate:7 1 UDP 2015363839 192.168.178.41 45465 typ host
[WHIP] Sending candidates: candidate:8 1 TCP 1015022335 192.168.178.41 9 typ host tcptype active
[WHIP] Sending candidates: candidate:9 1 TCP 1010828031 192.168.178.41 52363 typ host tcptype passive
[WHIP] Sending candidates: candidate:10 1 UDP 2015364095 fe80::e20:3881:f071:30e6 43468 typ host
[WHIP] Sending candidates: candidate:11 1 TCP 1015022591 fe80::e20:3881:f071:30e6 9 typ host tcptype active
[WHIP] Sending candidates: candidate:12 1 TCP 1010828287 fe80::e20:3881:f071:30e6 51439 typ host tcptype passive
[WHIP] ICE gathering completed
[WHIP] Sending candidates: end-of-candidates
You’ll need to use something like the Admin API in Janus to investigate connectivity issue. An old and possibly slightly outdated tutorial is available here.
This is the output of the Handle Info. Is there something unusual?
{
"session_id": 5548177471011387,
"session_last_activity": 583981967,
"session_timeout": 60,
"session_transport": "janus.transport.websockets",
"handle_id": 2093377871426250,
"loop-running": true,
"created": 579070017,
"current_time": 588554997,
"plugin": "janus.plugin.videoroom",
"plugin_specific": {
"type": "publisher",
"room": 1234,
"id": 992258533830944,
"private_id": 1358568453,
"display": "Test",
"bitrate": 128000,
"streams": [
{
"type": "video",
"mindex": 0,
"mid": "video0",
"codec": "vp8",
"subscribers": 0
}
],
"hangingup": 0,
"destroyed": 0
},
"flags": {
"got-offer": true,
"got-answer": true,
"negotiated": true,
"processing-offer": false,
"starting": true,
"ice-restart": false,
"ready": false,
"stopped": false,
"alert": false,
"trickle": true,
"all-trickles": false,
"resend-trickles": false,
"trickle-synced": false,
"data-channels": false,
"has-audio": false,
"has-video": false,
"new-datachan-sdp": false,
"rfc4588-rtx": false,
"cleaning": false,
"e2ee": false
},
"agent-created": 579077519,
"ice-mode": "full",
"ice-role": "controlled",
"sdps": {
"profile": "UDP/TLS/RTP/SAVPF",
"local": "v=0\r\no=- 1739355343195123 1 IN IP4 45.131.108.132\r\ns=VideoRoom 1234\r\nt=0 0\r\na=group:BUNDLE video0\r\na=ice-options:trickle\r\na=fingerprint:sha-256 33:C6:1E:F7:83:55:8D:F7:A9:04:21:1B:D6:22:5A:CB:FB:C5:15:40:E1:7E:D4:0F:1E:2C:50:C5:87:07:B8:93\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS *\r\nm=video 9 UDP/TLS/RTP/SAVPF 96\r\nc=IN IP4 45.131.108.132\r\na=recvonly\r\na=mid:video0\r\na=rtcp-mux\r\na=ice-ufrag:sNcq\r\na=ice-pwd:1I5W34mQquGguyZOIXq3f/\r\na=ice-options:trickle\r\na=setup:active\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=msid:janus janusvideo0\r\na=ssrc:3758645973 cname:janus\r\n",
"remote": "v=0\r\no=- 8520436631464274639 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=ice-options:trickle\r\nm=video 9 UDP/TLS/RTP/SAVPF 96\r\nc=IN IP4 0.0.0.0\r\na=setup:actpass\r\na=ice-ufrag:K8nzu8xqCWiS0tL0W0aiSmgiIrAjnnx9\r\na=ice-pwd:9APgA3x+dDjFVIDb8X1+DnRqJhMMGIrK\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=sendonly\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 nack pli\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 transport-cc\r\na=framerate:30\r\na=ssrc:2 msid:user321286609@host-3d9871f8 webrtctransceiver0\r\na=ssrc:2 cname:user321286609@host-3d9871f8\r\na=mid:video0\r\na=fingerprint:sha-256 86:D4:C6:A5:CE:0F:38:FF:71:8D:09:DE:CF:3E:9C:62:69:60:F2:66:15:AC:D3:EA:52:6F:5C:3C:EC:DA:E5:DE\r\na=rtcp-mux-only\r\n"
},
"queued-packets": 0,
"webrtc": {
"ice": {
"stream_id": 1,
"component_id": 0,
"state": "gathering",
"gathered": 579079429,
"local-candidates": [
"1 1 udp 2015363327 45.131.108.132 45806 typ host",
"2 1 udp 2015363583 172.18.0.1 46808 typ host"
],
"ready": 1
},
"dtls": {
"fingerprint": "33:C6:1E:F7:83:55:8D:F7:A9:04:21:1B:D6:22:5A:CB:FB:C5:15:40:E1:7E:D4:0F:1E:2C:50:C5:87:07:B8:93",
"remote-fingerprint": "86:D4:C6:A5:CE:0F:38:FF:71:8D:09:DE:CF:3E:9C:62:69:60:F2:66:15:AC:D3:EA:52:6F:5C:3C:EC:DA:E5:DE",
"remote-fingerprint-hash": "sha-256",
"dtls-role": "active",
"dtls-state": "created",
"retransmissions": 0,
"valid": false,
"srtp-profile": "none",
"ready": false,
"sctp-association": false,
"stats": {
"in": {
"packets": 0,
"bytes": 0
},
"out": {
"packets": 0,
"bytes": 0
}
}
},
"extensions": {},
"bwe": {
"twcc": false,
"twcc-ext-id": 0
},
"media": {
"video0": {
"type": "video",
"mindex": 0,
"mid": "video0",
"do_nacks": true,
"nack-queue-ms": 0,
"ssrc": {
"ssrc": 3758645973,
"ssrc-peer": 2
},
"direction": {
"send": false,
"recv": true
},
"rtcp": {
"main": {
"base": 90000,
"rtt": 0,
"lost": 0,
"lost-by-remote": 0,
"jitter-local": 0,
"jitter-remote": 0,
"in-link-quality": 100,
"in-media-link-quality": 100,
"out-link-quality": 100,
"out-media-link-quality": 100
}
},
"stats": {
"in": {
"packets": 0,
"bytes": 0,
"bytes_lastsec": 0,
"nacks": 0,
"retransmissions": 0
},
"out": {
"packets": 0,
"bytes": 0,
"bytes_lastsec": 0,
"nacks": 0
}
}
}
}
}
}
And this is the Server Info
Server Info
name: Janus WebRTC Server
version: 1300
version_string: 1.3.0
author: Meetecho s.r.l.
commit-hash: dfd86e34112f512b3a15ba6b7b52a3aa01ea347a
compile-time: Wed Nov 27 11:26:06 UTC 2024
log-to-stdout: true
log-to-file: false
data_channels: true
accepting-new-sessions: true
session-timeout: 60
reclaim-session-timeout: 0
candidates-timeout: 45
server-name: MyJanusInstance
local-ip:
ipv6: false
ice-lite: false
ice-tcp: false
ice-nomination: aggressive
ice-consent-freshness: false
ice-keepalive-conncheck: false
hangup-on-failed: false
full-trickle: true
mdns-enabled: true
min-nack-queue: 200
nack-optimizations: false
twcc-period: 200
dtls-mtu: 1200
static-event-loops: 0
api_secret: false
auth_token: false
event_handlers: false
opaqueid_in_api: false
Dependencies
Library Version
glib2 2.72.4
jansson 2.13.1
libnice 0.1.22
libsrtp libsrtp2 2.5.0
libcurl 7.81.0
crypto OpenSSL 3.0.2 15 Mar 2022
Plugins
Name Author Description Version
JANUS AudioBridge plugin Meetecho s.r.l. This is a plugin implementing an audio conference bridge for Janus, mixing Opus streams. 0.0.13
JANUS Record&Play plugin Meetecho s.r.l. This is a trivial Record&Play plugin for Janus, to record WebRTC sessions and replay them. 0.0.4
JANUS TextRoom plugin Meetecho s.r.l. This is a plugin implementing a text-only room for Janus, using DataChannels. 0.0.2
JANUS NoSIP plugin Meetecho s.r.l. This is a simple RTP bridging plugin that leaves signalling details (e.g., SIP) up to the application. 0.0.1
JANUS SIP plugin Meetecho s.r.l. This is a simple SIP plugin for Janus, allowing WebRTC peers to register at a SIP server and call SIP user agents through a Janus instance. 0.0.9
JANUS VideoCall plugin Meetecho s.r.l. This is a simple video call plugin for Janus, allowing two WebRTC peers to call each other through a server. 0.0.6
JANUS Streaming plugin Meetecho s.r.l. This is a streaming plugin for Janus, allowing WebRTC peers to watch/listen to pre-recorded files or media generated by an external source. 0.0.10
JANUS EchoTest plugin Meetecho s.r.l. This is a trivial EchoTest plugin for Janus, just used to showcase the plugin interface. 0.0.7
JANUS VideoRoom plugin Meetecho s.r.l. This is a plugin implementing a videoconferencing SFU (Selective Forwarding Unit) for Janus, that is an audio/video router. 0.0.10
Transports
Name Author Description Version
JANUS REST (HTTP/HTTPS) transport plugin Meetecho s.r.l. This transport plugin adds REST (HTTP/HTTPS) support to the Janus API via libmicrohttpd. 0.0.2
JANUS WebSockets transport plugin Meetecho s.r.l. This transport plugin adds WebSockets support to the Janus API via libwebsockets. 0.0.1
Event handlers
Name Author Description Version
Loggers
Name Author Description Version
I don’t see remote candidates (WHIP client to Janus). You’ll have to investigate why they’re not getting to Janus.