4 ms·
Another library that I would recommend people look into for live streaming to WebRTC, as an alternative to Pion used in this project, is Janus WebRTC Server. I
by iod 2y ago
Another library that I would recommend people look into for live streaming to WebRTC, as an alternative to Pion used in this project, is Janus WebRTC Server. I use it for ingesting RTP streams I generate from usb webcams and then playing it with very low latency in the browser. It even has a feature where you can stream multiple streams simultaneously. It also has a simple http api for adding, updating, and removing streams on demand.
Here is the library's streaming demo:
https://janus.conf.meetecho.com/demos/streaming.html https://janus.conf.meetecho.com/demos/streaming.html
- tamimio 2y ago> I use it for ingesting RTP streams I generate from usb webcams and then playing it with very low latency in the browser. Do you have any write up about this? I did try Janus years ago, it wasn’t great, slow, and buggy, but I don’t know about its current state now.
- iod 2y agoI used the demo streaming.html code linked above as-is and host it statically on Nginx alongside Janus on a cloud VPS. As far as config, there is just the one file: /etc/janus/janus.plugin.streaming.jcfg , but you can leave it blank and just use the html api¹ if you don't want to mess with that file as the API has an option: "permanent":true that automatically generates/updates the config for you. You can substitute srtp (secure) for regular rtp for testing, but I prefer to use the secure variant since it goes out to a public VPS and doesn't really incur any overhead for my source devices. ¹ https://janus.conf.meetecho.com/docs/streaming#streamapi https://janus.conf.meetecho.com/docs/streaming#streamapi I wrote a little helper shell code using wget, openssl, dd, jq, and jo to make it easy to talk JSON to the API, for the one-off configs I do. Here is an example of what I use which demonstrates simulcast and srtp ingestion for both h264 and vp8 video streams as well as opus audio. Just fill in the [ ]'s with your specifics. I then use ffmpeg to generate all the streams and pipe to the appropriate ports for each simulcast level and target. If you use gstreamer beware srtp key format is different. #!/bin/sh server="https://[YOUR_JANUS_SERVER_HOST]/janus" token(){ dd if=/dev/urandom bs=6 count=1 status=none|openssl base64;} post_jo(){ first="$1";shift;wget --quiet --output-document - --post-data "$(jo -- "$@")" "$server$first";} tx(){ post_jo "$@" transaction="$(token)";} data_id(){ jq ".data.id//(null|halt_error(1))";} message()( set -e id="$(tx / janus=create|data_id)" # create janus session and store id hn="$(tx "/$id" janus=attach plugin=janus.plugin.streaming|data_id)" # create plugin session and store id tx "/$id/$hn" janus=message body="$(jo -- "$@")" tx "/$id" janus=destroy >/dev/null ) # example usage: # list all streams message request=list|jq .plugindata.data.list # remove stream with id 666 message request=destroy id=666 secret=adminpwd permanent=true|jq # create new stream message request=create id=666 secret=adminpwd permanent=true name=[YOUR_STREAM_NAME] type=rtp media=["$( jo type=video mid=v1 codec=h264 pt=96 simulcast=true svc=false port=5010 port2=5020 port3=5030 \ fmtp=level-asymmetry-allowed=1\;packetization-mode=1\;profile-level-id=42c01f )","$( jo type=video mid=v2 codec=vp8 pt=96 simulcast=true svc=false port=5012 port2=5022 port3=5032 )","$( jo type=audio mid=a codec=opus pt=97 port=5000 )"] srtpsuite=80 srtpcrypto=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz|jq # your srtp token needs to match your source # show new stream info to verify configuration message request=info id=666 secret=adminpwd|jq # on streaming source device ffmpeg [YOUR_INPUT_CONFIG HERE] -f rtp -srtp_out_suite SRTP_AES128_CM_HMAC_SHA1_80 -srtp_out_params zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz srtp://[YOUR_JANUS_SERVER_HOST]/:[PORT] # for gstreamer, showing alternative key format gst-launch-1.0 [YOUR_INPUT_CONFIG HERE] ! rtpav1pay ! srtpenc key=cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3cf3 ! udpsink host=[YOUR_JANUS_SERVER_HOST] port=[PORT]
- rgovostes 2y agoJanus is used by the PiKVM project for WebRTC streaming. I found it arcane to configure and never got it to work over Tailscale (https://janus.discourse.group/t/failing-to-establish-webrtc-stream-over-tailscale-interface/1026 https://janus.discourse.group/t/failing-to-establish-webrtc-...).
- iod 2y agoI went to your discourse link. As Lorenzo was trying to say, you will want to get a better idea what is going on with ICE candidate gathering. In firefox there is an about:config setting that might help with this: media.peerconnection.ice.obfuscate_host_addresses = false which will show the actual deobfuscated candidates host addresses. Here is a tool you can run on your client to see the stun candidates received. https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ https://webrtc.github.io/samples/src/content/peerconnection/... If you do not get any valid candidates, then it is most likely a misconfiguration of your browser, vpn, firewall or network. Unfortunately this is most likely not a Janus thing, but I would need more information to know for sure.