SlideShare a Scribd company logo
WebRTC broadcasting with WHIP
Lorenzo Miniero
@elminiero
FOSDEM 2022 Real Time Communications
5th February 2022, Brussels My couch
Who am I?
Lorenzo Miniero
• Ph.D @ UniNA
• Chairman @ Meetecho
• Main author of Janus
Contacts and info
• lorenzo@meetecho.com
• https://twitter.com/elminiero
• https://www.slideshare.net/LorenzoMiniero
• https://lminiero.bandcamp.com
MCU as a WebRTC topology
SFU as a WebRTC topology
A slightly variation on the theme
How “traditional” broadcasting typically works
What if we want more interactivity, though?
What if we want more interactivity, though?
What if we want more interactivity, though?
What if we want more interactivity, though?
Why not WebRTC instead?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• Besides, different users may experience different delays (buffering)
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS, XSplit, or others
Why not WebRTC instead?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• Besides, different users may experience different delays (buffering)
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS, XSplit, or others
Why not WebRTC instead?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• Besides, different users may experience different delays (buffering)
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS, XSplit, or others
Why not WebRTC instead?
• Traditional broadcasting efficient but higher latency
• At best (live), delay will typically be in the range of a few seconds
• Besides, different users may experience different delays (buffering)
• WebRTC natively conceived for very low latency, instead
• Born for conversational audio/video/data
• Can be (and often is) easily used for monodirectional streaming as well
• Strangely not really considered by the industry up until recently, though
• Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”)
• Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/
• Tooling an important aspect to foster WebRTC adoption, here
• e.g., a standard way to send media, and tools à la OBS, XSplit, or others
WebRTC audio: Opus
• WebRTC mandates Opus, and it’s a good thing
• High quality audio codec designed for the Internet
• Very flexible in sampling rates, bitrates, FEC, etc.
• Different profiles for voice and music/other
• Both encoding and decoding vary, in case
• Can be mono and stereo, with dynamic sampling rates and bitrates
• Multiopus (5.1 and 7.1)1
• Each packet is basically OGG with multiple stereo Opus streams
• Number of streams determines number of channels
• Not documented, but used by Google for Stadia
1
https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
WebRTC audio: Opus
• WebRTC mandates Opus, and it’s a good thing
• High quality audio codec designed for the Internet
• Very flexible in sampling rates, bitrates, FEC, etc.
• Different profiles for voice and music/other
• Both encoding and decoding vary, in case
• Can be mono and stereo, with dynamic sampling rates and bitrates
• Multiopus (5.1 and 7.1)1
• Each packet is basically OGG with multiple stereo Opus streams
• Number of streams determines number of channels
• Not documented, but used by Google for Stadia
1
https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
WebRTC audio: Opus
• WebRTC mandates Opus, and it’s a good thing
• High quality audio codec designed for the Internet
• Very flexible in sampling rates, bitrates, FEC, etc.
• Different profiles for voice and music/other
• Both encoding and decoding vary, in case
• Can be mono and stereo, with dynamic sampling rates and bitrates
• Multiopus (5.1 and 7.1)1
• Each packet is basically OGG with multiple stereo Opus streams
• Number of streams determines number of channels
• Not documented, but used by Google for Stadia
1
https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
WebRTC video: Simulcasting & SVC
https://webrtchacks.com/sfu-simulcast/
WebRTC video: Simulcasting & SVC
https://webrtchacks.com/chrome-vp9-svc/
Two main challenges: ingestion...
Two main challenges: ... and distribution
(and yeah, maybe scaling too! )
Making WebRTC ingestion easy: WISH / WHIP!
https://www.meetecho.com/blog/whip-janus/ (September 2020)
Making WebRTC ingestion easy: WISH / WHIP!
https://www.meetecho.com/blog/whip-janus-part-ii/
There would be no WHIP without Dr. Alex r
A new Working Group in the IETF...
https://datatracker.ietf.org/wg/wish/about/
... and a new draft for the WHIP specification!
https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
WebRTC-HTTP ingestion protocol (WHIP)
• HTTP-based signalling to create sendonly PeerConnections
• HTTP POST to send SDP offer, and get an SDP answer in the response
• Teardown of sessions using HTTP DELETE
• Authentication and authorization via Bearer tokens
• https://www.rfc-editor.org/rfc/rfc6750.html
• Trickle and ICE restart via HTTP PATCH and SDP fragments
• https://www.rfc-editor.org/rfc/rfc8840.html
• Everything else is your usual WebRTC!
• ICE, DTLS, etc.
A few sequence diagrams
A few sequence diagrams
A few sequence diagrams
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
A WHIP server based on Janus
• Janus is a popular WebRTC server, so good option for WHIP
• It implements its own JSON-based API, though (Janus API)
• Simple (and transparent) solution: basic API translator in front of Janus
• WHIP API maps quite simply to set of Janus API primitives
• No need to change anything in the WebRTC stack
• Implemented simple prototype using node.js and Express
• REST server that implements the WHIP API, and talks to Janus accordingly
• Only takes care of ingest: distribution out of scope (e.g., via SOLEIL)
Simple WHIP Server
https://github.com/lminiero/simple-whip-server/
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Mapping WHIP interactions to the Janus API
Simple WHIP Server in action
Basic UI to create/manage endpoints
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin2 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
2
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin2 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
2
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin2 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
2
https://gstreamer.freedesktop.org/documentation/webrtc/
Writing a WHIP client for testing
• Needs to support HTTP (WHIP API) and have a WebRTC stack
• Browsers are the obvious choice, but what about a native solution?
• Many broadcasters today use custom tools (e.g., OBS)
• Unfortunately OBS-WebRTC is not currently an option
• Used legacy WHIP API, and currently only supports Millicast ingestion
• Chose GStreamer’s webrtcbin2 for the purpose
• Used it already with success in other applications (e.g., JamRTC)
• Modular and very powerful, so easy to feed with external sources
Simple WHIP Client
https://github.com/lminiero/simple-whip-client/
2
https://gstreamer.freedesktop.org/documentation/webrtc/
Simple WHIP Client options
Usage:
whip-client [OPTION?] -- Simple WHIP client
Help Options:
-h, --help Show help options
Application Options:
-u, --url Address of the WHIP endpoint (required)
-t, --token Authentication Bearer token to use (optional)
-A, --audio GStreamer pipeline to use for audio (optional, required if audio-only)
-V, --video GStreamer pipeline to use for video (optional, required if video-only)
-n, --no-trickle Don‘t trickle candidates, but put them in the SDP offer (default: false)
-f, --follow-link Use the Link headers returned by the WHIP server to automatically configure STUN/TURN servers to
use (default: false)
-S, --stun-server STUN server to use, if any (stun://hostname:port)
-T, --turn-server TURN server to use, if any; can be called multiple times
(turn(s)://username:password@host:port?transport=[udp,tcp])
-F, --force-turn In case TURN servers are provided, force using a relay (default: false)
-l, --log-level Logging level (0=disable logging, 7=maximum log level; default: 4)
Simple WHIP Client example
./whip-client -u http://localhost:7080/whip/endpoint/abc123 
-t verysecret 
-A "audiotestsrc is-live=true wave=red-noise ! audioconvert !
audioresample ! queue ! opusenc ! rtpopuspay pt=100 ! queue !
application/x-rtp,media=audio,encoding-name=OPUS,payload=100" 
-V "videotestsrc is-live=true pattern=ball ! videoconvert ! queue !
vp8enc deadline=1 ! rtpvp8pay pt=96 ! queue !
application/x-rtp,media=video,encoding-name=VP8,payload=96" 
-S stun.l.google.com:19302
WHIP client and server + Janus
Simple WHIP Client in action
Testing my WHIP client with Janus
Other WHIP implementations: servers
• Lorenzo Miniero – Simple WHIP Server (Janus)
• https://github.com/lminiero/simple-whip-server
• Juliusz Chroboczek – Galene
• https://github.com/jech/galene/tree/whip
• Sergio Garcia Murillo – Millicast integration
• https://millicast.com/
• Cameron Elliott – Deadsfu
• https://github.com/x186k/deadsfu
Other WHIP implementations: clients
• Lorenzo Miniero – Simple WHIP Client (GStreamer)
• https://github.com/lminiero/simple-whip-client
• Sergio Garcia Murillo – whip-js (JavaScript)
• https://github.com/medooze/whip-js/
• Gustavo Garcia – whip-go (Go)
• https://github.com/ggarber/whip-go/
• Tim Panton – whipi (Java / Raspberry Pi)
• https://github.com/pipe/whipi
• Alberto Gonzalez Trastoy – free-whip (Python)
• https://github.com/agonza1/free-whip/
• Cameron Elliott – whip-whap-js (JavaScript)
• https://github.com/x186k/whip-whap-js
WHIP interop tests @ IETF 112 Hackathon!
https://github.com/IETF-Hackathon/ietf112-project-presentations/blob/main/ietf112-hackathon-whip.pdf
WHIP interop tests @ IETF 112 Hackathon!
Simple WHIP Server Galene Millicast deadsfu
Simple WHIP Client
whip-js
whip-go
whipi
free-whip
whip-whap-js
Integration WHIP in broadcasting workflows
• Old version of OBS-WebRTC did have WHIP support
• Tested for my blog post from last year
• Implemented legacy WHIP API, and used libwebrtc
• No popular streamer tool supports WHIP yet, though
• WHIP will make it easy for the signalling part...
• ... but they’ll still need a working WebRTC stack
• Why not start with a more “loose” integration then?
• Keeping on using existing tools as they work today
• Somehow get them to work with my GStreamer-based WHIP client
Integration WHIP in broadcasting workflows
• Old version of OBS-WebRTC did have WHIP support
• Tested for my blog post from last year
• Implemented legacy WHIP API, and used libwebrtc
• No popular streamer tool supports WHIP yet, though
• WHIP will make it easy for the signalling part...
• ... but they’ll still need a working WebRTC stack
• Why not start with a more “loose” integration then?
• Keeping on using existing tools as they work today
• Somehow get them to work with my GStreamer-based WHIP client
Integration WHIP in broadcasting workflows
• Old version of OBS-WebRTC did have WHIP support
• Tested for my blog post from last year
• Implemented legacy WHIP API, and used libwebrtc
• No popular streamer tool supports WHIP yet, though
• WHIP will make it easy for the signalling part...
• ... but they’ll still need a working WebRTC stack
• Why not start with a more “loose” integration then?
• Keeping on using existing tools as they work today
• Somehow get them to work with my GStreamer-based WHIP client
Enter NDI!
https://www.meetecho.com/blog/webrtc-ndi/
https://www.meetecho.com/blog/webrtc-ndi-part-2/
What is NDI?
• Network Device Interface (NDI)
• Royalty-free software standard developed by NewTek
• https://www.ndi.tv/
• Live exchange of multimedia streams within the same LAN
• Multichannel and uncompressed media streams (high quality)
• mDNS used for service discovery
• Easy to use (and integrate) native SDK
• Available on Windows, Linux, MacOS, Android, etc.
• VLC team working on an alternative implementation
• Widely used in the broadcasters industry
• Natively supported by many devices and streamer tools
What is NDI?
• Network Device Interface (NDI)
• Royalty-free software standard developed by NewTek
• https://www.ndi.tv/
• Live exchange of multimedia streams within the same LAN
• Multichannel and uncompressed media streams (high quality)
• mDNS used for service discovery
• Easy to use (and integrate) native SDK
• Available on Windows, Linux, MacOS, Android, etc.
• VLC team working on an alternative implementation
• Widely used in the broadcasters industry
• Natively supported by many devices and streamer tools
What is NDI?
• Network Device Interface (NDI)
• Royalty-free software standard developed by NewTek
• https://www.ndi.tv/
• Live exchange of multimedia streams within the same LAN
• Multichannel and uncompressed media streams (high quality)
• mDNS used for service discovery
• Easy to use (and integrate) native SDK
• Available on Windows, Linux, MacOS, Android, etc.
• VLC team working on an alternative implementation
• Widely used in the broadcasters industry
• Natively supported by many devices and streamer tools
What is NDI?
• Network Device Interface (NDI)
• Royalty-free software standard developed by NewTek
• https://www.ndi.tv/
• Live exchange of multimedia streams within the same LAN
• Multichannel and uncompressed media streams (high quality)
• mDNS used for service discovery
• Easy to use (and integrate) native SDK
• Available on Windows, Linux, MacOS, Android, etc.
• VLC team working on an alternative implementation
• Widely used in the broadcasters industry
• Natively supported by many devices and streamer tools
We’ve talked about WebRTC-to-NDI before...
What about NDI-to-WebRTC, though?
• There’s a cool NDI plugin for GStreamer
• Makes it easy to use NDI sources in GStreamer pipelines
• https://github.com/teltek/gst-plugin-ndi
• Hey, our WHIP client is based on GStreamer too!
• Audio and video pipelines are customizable (command line)
• NDI plugin as source for the media −→ encoders/WebRTC will do the rest
• Of course, we need something that generates NDI
• OBS has an NDI plugin, for NDI input and output
• https://github.com/Palakis/obs-ndi
What about NDI-to-WebRTC, though?
• There’s a cool NDI plugin for GStreamer
• Makes it easy to use NDI sources in GStreamer pipelines
• https://github.com/teltek/gst-plugin-ndi
• Hey, our WHIP client is based on GStreamer too!
• Audio and video pipelines are customizable (command line)
• NDI plugin as source for the media −→ encoders/WebRTC will do the rest
• Of course, we need something that generates NDI
• OBS has an NDI plugin, for NDI input and output
• https://github.com/Palakis/obs-ndi
What about NDI-to-WebRTC, though?
• There’s a cool NDI plugin for GStreamer
• Makes it easy to use NDI sources in GStreamer pipelines
• https://github.com/teltek/gst-plugin-ndi
• Hey, our WHIP client is based on GStreamer too!
• Audio and video pipelines are customizable (command line)
• NDI plugin as source for the media −→ encoders/WebRTC will do the rest
• Of course, we need something that generates NDI
• OBS has an NDI plugin, for NDI input and output
• https://github.com/Palakis/obs-ndi
1. Configure NDI output in OBS
2. Create your scenes in OBS
3. Setup the WHIP client to capture NDI
Ready for our demo!
Ready for our demo!
Ready for our demo!
More details in a recent CommCon talk
https://2021.commcon.xyz/talks/whip-ndi-and-janus-genesis-of-a-broadcasting-demo
Next step: broadcasting the stream
• WHIP server + Janus get you in a VideoRoom, and it’s a good starting point
• That’s the whole point of WebRTC ingest!
• Already “consumable” via VideoRoom itself (SFU)
• Janus VideoRoom plugin not really optimized for broadcasting, though
• Conceived for videoconferencing use cases
• Will not work well if you have to feed, e.g., 100’s or 1000’s
• Janus Streaming plugin a much better choice
• Natively optimized for doing one-to-many
• Can receive media from VideoRoom (and so WHIP) via “RTP forwarders”
• Even better, multiple Janus instances can work together
Next step: broadcasting the stream
• WHIP server + Janus get you in a VideoRoom, and it’s a good starting point
• That’s the whole point of WebRTC ingest!
• Already “consumable” via VideoRoom itself (SFU)
• Janus VideoRoom plugin not really optimized for broadcasting, though
• Conceived for videoconferencing use cases
• Will not work well if you have to feed, e.g., 100’s or 1000’s
• Janus Streaming plugin a much better choice
• Natively optimized for doing one-to-many
• Can receive media from VideoRoom (and so WHIP) via “RTP forwarders”
• Even better, multiple Janus instances can work together
Next step: broadcasting the stream
• WHIP server + Janus get you in a VideoRoom, and it’s a good starting point
• That’s the whole point of WebRTC ingest!
• Already “consumable” via VideoRoom itself (SFU)
• Janus VideoRoom plugin not really optimized for broadcasting, though
• Conceived for videoconferencing use cases
• Will not work well if you have to feed, e.g., 100’s or 1000’s
• Janus Streaming plugin a much better choice
• Natively optimized for doing one-to-many
• Can receive media from VideoRoom (and so WHIP) via “RTP forwarders”
• Even better, multiple Janus instances can work together
Ph.D Thesis on WebRTC broadcasting (2015)
Using SOLEIL for the purpose
• “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis)
• In a nutshell, tree-based distribution of WebRTC feeds
• Ingest and edges are WebRTC (Janus), everything in the middle just RTP
• Working with RTP in intermediate layers has many advantages
• No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools
• You can even take advantage of multicast, here
• Just needs RTP forwarding to start everything
• PR available in WHIP server to do RTP forwarding (merged)
• https://github.com/lminiero/simple-whip-server/pull/2
Using SOLEIL for the purpose
• “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis)
• In a nutshell, tree-based distribution of WebRTC feeds
• Ingest and edges are WebRTC (Janus), everything in the middle just RTP
• Working with RTP in intermediate layers has many advantages
• No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools
• You can even take advantage of multicast, here
• Just needs RTP forwarding to start everything
• PR available in WHIP server to do RTP forwarding (merged)
• https://github.com/lminiero/simple-whip-server/pull/2
Using SOLEIL for the purpose
• “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis)
• In a nutshell, tree-based distribution of WebRTC feeds
• Ingest and edges are WebRTC (Janus), everything in the middle just RTP
• Working with RTP in intermediate layers has many advantages
• No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools
• You can even take advantage of multicast, here
• Just needs RTP forwarding to start everything
• PR available in WHIP server to do RTP forwarding (merged)
• https://github.com/lminiero/simple-whip-server/pull/2
To learn more about RTP forwarders...
https://archive.fosdem.org/2020/schedule/event/janus/
To learn more about RTP forwarders...
https://archive.fosdem.org/2020/schedule/event/janus/
To learn more about RTP forwarders...
https://archive.fosdem.org/2020/schedule/event/janus/
Distributing WHIP Janus streams via SOLEIL
Distributing WHIP Janus streams via SOLEIL
Distributing WHIP Janus streams via SOLEIL
Distributing WHIP Janus streams via SOLEIL
Distributing WHIP Janus streams via SOLEIL
Leveraging multicast internally for RTP
Leveraging multicast internally for RTP
Thanks! Questions? Comments?
Contacts
• https://twitter.com/elminiero
• https://twitter.com/meetecho
• https://www.meetecho.com

More Related Content

What's hot (20)

PDF
LCA13: Power State Coordination Interface
Linaro
 
PDF
IIJmio meeting #2 IIJmioとIPv6の話
techlog (Internet Initiative Japan Inc.)
 
PDF
WebSocketでリアルタイム処理をする
龍一 田中
 
PDF
QEMU in Cross building
Tetsuyuki Kobayashi
 
PDF
The H.264 Integer Transform
Iain Richardson
 
PPTX
MediaRecorder と WebM で、オレオレ Live Streaming
mganeko
 
PPTX
VyOSで作るIPv4 Router/IPv6 Bridge
KLab Inc. / Tech
 
PPTX
5分で解るセキュアコーディング
Yasuo Ohgaki
 
PDF
さくらのVPS で IPv4 over IPv6ルータの構築
Tomocha Potter
 
PPTX
Amazon Kinesis Video Streams WebRTC 使ってみた
mganeko
 
PDF
What's New in Helix QAC 2019.1
Perforce
 
PDF
ACRiウェビナー:小野様ご講演資料
直久 住川
 
PDF
Wowzaを用いた配信基盤 Takusuta tech conf01
Kazuhiro Ota
 
PDF
知っておくべきCephのIOアクセラレーション技術とその活用方法 - OpenStack最新情報セミナー 2015年9月
VirtualTech Japan Inc.
 
PPTX
ぼくとJenkinsおじさんの360日戦争
goccy
 
PDF
仮想化環境におけるパケットフォワーディング
Takuya ASADA
 
PDF
仕事の捉え方の話 #ssmjp
(^-^) togakushi
 
PDF
New VIdeo CODEC AV1
Tetsuyuki Kobayashi
 
PPTX
An Introduction to ROS-Industrial
Clay Flannigan
 
PDF
Video Compression, Part 3-Section 2, Some Standard Video Codecs
Dr. Mohieddin Moradi
 
LCA13: Power State Coordination Interface
Linaro
 
IIJmio meeting #2 IIJmioとIPv6の話
techlog (Internet Initiative Japan Inc.)
 
WebSocketでリアルタイム処理をする
龍一 田中
 
QEMU in Cross building
Tetsuyuki Kobayashi
 
The H.264 Integer Transform
Iain Richardson
 
MediaRecorder と WebM で、オレオレ Live Streaming
mganeko
 
VyOSで作るIPv4 Router/IPv6 Bridge
KLab Inc. / Tech
 
5分で解るセキュアコーディング
Yasuo Ohgaki
 
さくらのVPS で IPv4 over IPv6ルータの構築
Tomocha Potter
 
Amazon Kinesis Video Streams WebRTC 使ってみた
mganeko
 
What's New in Helix QAC 2019.1
Perforce
 
ACRiウェビナー:小野様ご講演資料
直久 住川
 
Wowzaを用いた配信基盤 Takusuta tech conf01
Kazuhiro Ota
 
知っておくべきCephのIOアクセラレーション技術とその活用方法 - OpenStack最新情報セミナー 2015年9月
VirtualTech Japan Inc.
 
ぼくとJenkinsおじさんの360日戦争
goccy
 
仮想化環境におけるパケットフォワーディング
Takuya ASADA
 
仕事の捉え方の話 #ssmjp
(^-^) togakushi
 
New VIdeo CODEC AV1
Tetsuyuki Kobayashi
 
An Introduction to ROS-Industrial
Clay Flannigan
 
Video Compression, Part 3-Section 2, Some Standard Video Codecs
Dr. Mohieddin Moradi
 

Similar to WHIP WebRTC Broadcasting @ FOSDEM 2022 (20)

PDF
WebRTC Broadcasting @ TADSummit 2023
Lorenzo Miniero
 
PDF
WHIP and Janus @ IIT-RTC 2021
Lorenzo Miniero
 
PDF
WebRTC eduCONF
Mihály Mészáros
 
PDF
DevCon 5 (December 2013) - WebRTC & WebSockets
Crocodile WebRTC SDK and Cloud Signalling Network
 
PDF
[workshop] The Revolutionary WebRTC
Giacomo Vacca
 
PPTX
Upperside Webinar - WebRTC Standards Update
UppersideConferences
 
PDF
WebRTC standards update (Jul 2014)
Victor Pascual Ávila
 
PDF
WebRTC Standards Update (October 2014)
Victor Pascual Ávila
 
PDF
WebRTC standards update (April 2014)
Victor Pascual Ávila
 
PDF
Can WebRTC help musicians? @ FOSDEM 2021
Lorenzo Miniero
 
PDF
WebRTC standards update - November 2014
Victor Pascual Ávila
 
PDF
BWE in Janus
Lorenzo Miniero
 
PDF
WebRTC for Telco: Informa's WebRTC Global Summit Preconference
Tsahi Levent-levi
 
PDF
Workshop oracle
Douglas Tait
 
PDF
WebRTC. Yet Another Overview, for IT Technicians.
Vladimir Beloborodov
 
PDF
WebRTC standards update (13 Nov 2013)
Victor Pascual Ávila
 
PPTX
DeveloperWeek 2015 - WebRTC - Where to start and how to scale
Dialogic Inc.
 
PDF
The future of WebRTC - Sept 2021
Arnaud BUDKIEWICZ
 
PDF
Janus + Audio @ Open Source World
Lorenzo Miniero
 
WebRTC Broadcasting @ TADSummit 2023
Lorenzo Miniero
 
WHIP and Janus @ IIT-RTC 2021
Lorenzo Miniero
 
WebRTC eduCONF
Mihály Mészáros
 
DevCon 5 (December 2013) - WebRTC & WebSockets
Crocodile WebRTC SDK and Cloud Signalling Network
 
[workshop] The Revolutionary WebRTC
Giacomo Vacca
 
Upperside Webinar - WebRTC Standards Update
UppersideConferences
 
WebRTC standards update (Jul 2014)
Victor Pascual Ávila
 
WebRTC Standards Update (October 2014)
Victor Pascual Ávila
 
WebRTC standards update (April 2014)
Victor Pascual Ávila
 
Can WebRTC help musicians? @ FOSDEM 2021
Lorenzo Miniero
 
WebRTC standards update - November 2014
Victor Pascual Ávila
 
BWE in Janus
Lorenzo Miniero
 
WebRTC for Telco: Informa's WebRTC Global Summit Preconference
Tsahi Levent-levi
 
Workshop oracle
Douglas Tait
 
WebRTC. Yet Another Overview, for IT Technicians.
Vladimir Beloborodov
 
WebRTC standards update (13 Nov 2013)
Victor Pascual Ávila
 
DeveloperWeek 2015 - WebRTC - Where to start and how to scale
Dialogic Inc.
 
The future of WebRTC - Sept 2021
Arnaud BUDKIEWICZ
 
Janus + Audio @ Open Source World
Lorenzo Miniero
 
Ad

More from Lorenzo Miniero (20)

PDF
Multistream in SIP and NoSIP @ OpenSIPS Summit 2025
Lorenzo Miniero
 
PDF
RTP Over QUIC: An Interesting Opportunity Or Wasted Time?
Lorenzo Miniero
 
PDF
WebRTC and QUIC: how hard can it be? @ RTC.ON 2024
Lorenzo Miniero
 
PDF
WebRTC and SIP not just audio and video @ OpenSIPS 2024
Lorenzo Miniero
 
PDF
SIP trunking in Janus @ Kamailio World 2024
Lorenzo Miniero
 
PDF
Getting AV1/SVC to work in the Janus WebRTC Server
Lorenzo Miniero
 
PDF
The challenges of hybrid meetings @ CommCon 2023
Lorenzo Miniero
 
PDF
Real-Time Text and WebRTC @ Kamailio World 2023
Lorenzo Miniero
 
PDF
Become a rockstar using FOSS!
Lorenzo Miniero
 
PDF
WebRTC, RED and Janus @ ClueCon21
Lorenzo Miniero
 
PDF
JamRTC @ Wonder WebRTC unConference
Lorenzo Miniero
 
PDF
Janus Workshop pt.2 @ ClueCon 2021
Lorenzo Miniero
 
PDF
Janus + NDI @ ClueCon 2021
Lorenzo Miniero
 
PDF
Virtual IETF meetings with WebRTC @ IETF 109 MOPS
Lorenzo Miniero
 
PDF
Can SFUs and MCUs be friends @ IIT-RTC 2020
Lorenzo Miniero
 
PDF
Insertable Streams and E2EE @ ClueCon2020
Lorenzo Miniero
 
PDF
Janus Workshop @ ClueCon 2020
Lorenzo Miniero
 
PDF
Turning live events to virtual with Janus
Lorenzo Miniero
 
PDF
Janus RTP forwarders @ FOSDEM 2020
Lorenzo Miniero
 
PDF
Janus workshop @ RTC2019 Beijing
Lorenzo Miniero
 
Multistream in SIP and NoSIP @ OpenSIPS Summit 2025
Lorenzo Miniero
 
RTP Over QUIC: An Interesting Opportunity Or Wasted Time?
Lorenzo Miniero
 
WebRTC and QUIC: how hard can it be? @ RTC.ON 2024
Lorenzo Miniero
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
Lorenzo Miniero
 
SIP trunking in Janus @ Kamailio World 2024
Lorenzo Miniero
 
Getting AV1/SVC to work in the Janus WebRTC Server
Lorenzo Miniero
 
The challenges of hybrid meetings @ CommCon 2023
Lorenzo Miniero
 
Real-Time Text and WebRTC @ Kamailio World 2023
Lorenzo Miniero
 
Become a rockstar using FOSS!
Lorenzo Miniero
 
WebRTC, RED and Janus @ ClueCon21
Lorenzo Miniero
 
JamRTC @ Wonder WebRTC unConference
Lorenzo Miniero
 
Janus Workshop pt.2 @ ClueCon 2021
Lorenzo Miniero
 
Janus + NDI @ ClueCon 2021
Lorenzo Miniero
 
Virtual IETF meetings with WebRTC @ IETF 109 MOPS
Lorenzo Miniero
 
Can SFUs and MCUs be friends @ IIT-RTC 2020
Lorenzo Miniero
 
Insertable Streams and E2EE @ ClueCon2020
Lorenzo Miniero
 
Janus Workshop @ ClueCon 2020
Lorenzo Miniero
 
Turning live events to virtual with Janus
Lorenzo Miniero
 
Janus RTP forwarders @ FOSDEM 2020
Lorenzo Miniero
 
Janus workshop @ RTC2019 Beijing
Lorenzo Miniero
 
Ad

Recently uploaded (20)

PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PPTX
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
PDF
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
PPTX
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
Build with AI and GDG Cloud Bydgoszcz- ADK .pdf
jaroslawgajewski1
 
PDF
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PPTX
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
PDF
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
Researching The Best Chat SDK Providers in 2025
Ray Fields
 
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
Build with AI and GDG Cloud Bydgoszcz- ADK .pdf
jaroslawgajewski1
 
CIFDAQ's Market Wrap : Bears Back in Control?
CIFDAQ
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
AI Code Generation Risks (Ramkumar Dilli, CIO, Myridius)
Priyanka Aash
 
OFFOFFBOX™ – A New Era for African Film | Startup Presentation
ambaicciwalkerbrian
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 

WHIP WebRTC Broadcasting @ FOSDEM 2022

  • 1. WebRTC broadcasting with WHIP Lorenzo Miniero @elminiero FOSDEM 2022 Real Time Communications 5th February 2022, Brussels My couch
  • 2. Who am I? Lorenzo Miniero • Ph.D @ UniNA • Chairman @ Meetecho • Main author of Janus Contacts and info • [email protected] • https://twitter.com/elminiero • https://www.slideshare.net/LorenzoMiniero • https://lminiero.bandcamp.com
  • 3. MCU as a WebRTC topology
  • 4. SFU as a WebRTC topology
  • 5. A slightly variation on the theme
  • 7. What if we want more interactivity, though?
  • 8. What if we want more interactivity, though?
  • 9. What if we want more interactivity, though?
  • 10. What if we want more interactivity, though?
  • 11. Why not WebRTC instead? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • Besides, different users may experience different delays (buffering) • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS, XSplit, or others
  • 12. Why not WebRTC instead? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • Besides, different users may experience different delays (buffering) • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS, XSplit, or others
  • 13. Why not WebRTC instead? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • Besides, different users may experience different delays (buffering) • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS, XSplit, or others
  • 14. Why not WebRTC instead? • Traditional broadcasting efficient but higher latency • At best (live), delay will typically be in the range of a few seconds • Besides, different users may experience different delays (buffering) • WebRTC natively conceived for very low latency, instead • Born for conversational audio/video/data • Can be (and often is) easily used for monodirectional streaming as well • Strangely not really considered by the industry up until recently, though • Topic of my Ph.D years ago (“Streaming Of Large scale Events over Internet cLouds”) • Clearing the industry FUD: https://webrtcbydralex.com/index.php/2020/04/14/ • Tooling an important aspect to foster WebRTC adoption, here • e.g., a standard way to send media, and tools à la OBS, XSplit, or others
  • 15. WebRTC audio: Opus • WebRTC mandates Opus, and it’s a good thing • High quality audio codec designed for the Internet • Very flexible in sampling rates, bitrates, FEC, etc. • Different profiles for voice and music/other • Both encoding and decoding vary, in case • Can be mono and stereo, with dynamic sampling rates and bitrates • Multiopus (5.1 and 7.1)1 • Each packet is basically OGG with multiple stereo Opus streams • Number of streams determines number of channels • Not documented, but used by Google for Stadia 1 https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
  • 16. WebRTC audio: Opus • WebRTC mandates Opus, and it’s a good thing • High quality audio codec designed for the Internet • Very flexible in sampling rates, bitrates, FEC, etc. • Different profiles for voice and music/other • Both encoding and decoding vary, in case • Can be mono and stereo, with dynamic sampling rates and bitrates • Multiopus (5.1 and 7.1)1 • Each packet is basically OGG with multiple stereo Opus streams • Number of streams determines number of channels • Not documented, but used by Google for Stadia 1 https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
  • 17. WebRTC audio: Opus • WebRTC mandates Opus, and it’s a good thing • High quality audio codec designed for the Internet • Very flexible in sampling rates, bitrates, FEC, etc. • Different profiles for voice and music/other • Both encoding and decoding vary, in case • Can be mono and stereo, with dynamic sampling rates and bitrates • Multiopus (5.1 and 7.1)1 • Each packet is basically OGG with multiple stereo Opus streams • Number of streams determines number of channels • Not documented, but used by Google for Stadia 1 https://webrtcbydralex.com/index.php/2020/04/08/surround-sound-5-1-and-7-1-in-libwebrtc-and-chrome/
  • 18. WebRTC video: Simulcasting & SVC https://webrtchacks.com/sfu-simulcast/
  • 19. WebRTC video: Simulcasting & SVC https://webrtchacks.com/chrome-vp9-svc/
  • 20. Two main challenges: ingestion...
  • 21. Two main challenges: ... and distribution
  • 22. (and yeah, maybe scaling too! )
  • 23. Making WebRTC ingestion easy: WISH / WHIP! https://www.meetecho.com/blog/whip-janus/ (September 2020)
  • 24. Making WebRTC ingestion easy: WISH / WHIP! https://www.meetecho.com/blog/whip-janus-part-ii/
  • 25. There would be no WHIP without Dr. Alex r
  • 26. A new Working Group in the IETF... https://datatracker.ietf.org/wg/wish/about/
  • 27. ... and a new draft for the WHIP specification! https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html
  • 28. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 29. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 30. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 31. WebRTC-HTTP ingestion protocol (WHIP) • HTTP-based signalling to create sendonly PeerConnections • HTTP POST to send SDP offer, and get an SDP answer in the response • Teardown of sessions using HTTP DELETE • Authentication and authorization via Bearer tokens • https://www.rfc-editor.org/rfc/rfc6750.html • Trickle and ICE restart via HTTP PATCH and SDP fragments • https://www.rfc-editor.org/rfc/rfc8840.html • Everything else is your usual WebRTC! • ICE, DTLS, etc.
  • 32. A few sequence diagrams
  • 33. A few sequence diagrams
  • 34. A few sequence diagrams
  • 35. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 36. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 37. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 38. A WHIP server based on Janus • Janus is a popular WebRTC server, so good option for WHIP • It implements its own JSON-based API, though (Janus API) • Simple (and transparent) solution: basic API translator in front of Janus • WHIP API maps quite simply to set of Janus API primitives • No need to change anything in the WebRTC stack • Implemented simple prototype using node.js and Express • REST server that implements the WHIP API, and talks to Janus accordingly • Only takes care of ingest: distribution out of scope (e.g., via SOLEIL) Simple WHIP Server https://github.com/lminiero/simple-whip-server/
  • 39. Mapping WHIP interactions to the Janus API
  • 40. Mapping WHIP interactions to the Janus API
  • 41. Mapping WHIP interactions to the Janus API
  • 42. Mapping WHIP interactions to the Janus API
  • 43. Mapping WHIP interactions to the Janus API
  • 44. Simple WHIP Server in action
  • 45. Basic UI to create/manage endpoints
  • 46. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin2 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 2 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 47. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin2 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 2 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 48. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin2 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 2 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 49. Writing a WHIP client for testing • Needs to support HTTP (WHIP API) and have a WebRTC stack • Browsers are the obvious choice, but what about a native solution? • Many broadcasters today use custom tools (e.g., OBS) • Unfortunately OBS-WebRTC is not currently an option • Used legacy WHIP API, and currently only supports Millicast ingestion • Chose GStreamer’s webrtcbin2 for the purpose • Used it already with success in other applications (e.g., JamRTC) • Modular and very powerful, so easy to feed with external sources Simple WHIP Client https://github.com/lminiero/simple-whip-client/ 2 https://gstreamer.freedesktop.org/documentation/webrtc/
  • 50. Simple WHIP Client options Usage: whip-client [OPTION?] -- Simple WHIP client Help Options: -h, --help Show help options Application Options: -u, --url Address of the WHIP endpoint (required) -t, --token Authentication Bearer token to use (optional) -A, --audio GStreamer pipeline to use for audio (optional, required if audio-only) -V, --video GStreamer pipeline to use for video (optional, required if video-only) -n, --no-trickle Don‘t trickle candidates, but put them in the SDP offer (default: false) -f, --follow-link Use the Link headers returned by the WHIP server to automatically configure STUN/TURN servers to use (default: false) -S, --stun-server STUN server to use, if any (stun://hostname:port) -T, --turn-server TURN server to use, if any; can be called multiple times (turn(s)://username:password@host:port?transport=[udp,tcp]) -F, --force-turn In case TURN servers are provided, force using a relay (default: false) -l, --log-level Logging level (0=disable logging, 7=maximum log level; default: 4)
  • 51. Simple WHIP Client example ./whip-client -u http://localhost:7080/whip/endpoint/abc123 -t verysecret -A "audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay pt=100 ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=100" -V "videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay pt=96 ! queue ! application/x-rtp,media=video,encoding-name=VP8,payload=96" -S stun.l.google.com:19302
  • 52. WHIP client and server + Janus
  • 53. Simple WHIP Client in action
  • 54. Testing my WHIP client with Janus
  • 55. Other WHIP implementations: servers • Lorenzo Miniero – Simple WHIP Server (Janus) • https://github.com/lminiero/simple-whip-server • Juliusz Chroboczek – Galene • https://github.com/jech/galene/tree/whip • Sergio Garcia Murillo – Millicast integration • https://millicast.com/ • Cameron Elliott – Deadsfu • https://github.com/x186k/deadsfu
  • 56. Other WHIP implementations: clients • Lorenzo Miniero – Simple WHIP Client (GStreamer) • https://github.com/lminiero/simple-whip-client • Sergio Garcia Murillo – whip-js (JavaScript) • https://github.com/medooze/whip-js/ • Gustavo Garcia – whip-go (Go) • https://github.com/ggarber/whip-go/ • Tim Panton – whipi (Java / Raspberry Pi) • https://github.com/pipe/whipi • Alberto Gonzalez Trastoy – free-whip (Python) • https://github.com/agonza1/free-whip/ • Cameron Elliott – whip-whap-js (JavaScript) • https://github.com/x186k/whip-whap-js
  • 57. WHIP interop tests @ IETF 112 Hackathon! https://github.com/IETF-Hackathon/ietf112-project-presentations/blob/main/ietf112-hackathon-whip.pdf
  • 58. WHIP interop tests @ IETF 112 Hackathon! Simple WHIP Server Galene Millicast deadsfu Simple WHIP Client whip-js whip-go whipi free-whip whip-whap-js
  • 59. Integration WHIP in broadcasting workflows • Old version of OBS-WebRTC did have WHIP support • Tested for my blog post from last year • Implemented legacy WHIP API, and used libwebrtc • No popular streamer tool supports WHIP yet, though • WHIP will make it easy for the signalling part... • ... but they’ll still need a working WebRTC stack • Why not start with a more “loose” integration then? • Keeping on using existing tools as they work today • Somehow get them to work with my GStreamer-based WHIP client
  • 60. Integration WHIP in broadcasting workflows • Old version of OBS-WebRTC did have WHIP support • Tested for my blog post from last year • Implemented legacy WHIP API, and used libwebrtc • No popular streamer tool supports WHIP yet, though • WHIP will make it easy for the signalling part... • ... but they’ll still need a working WebRTC stack • Why not start with a more “loose” integration then? • Keeping on using existing tools as they work today • Somehow get them to work with my GStreamer-based WHIP client
  • 61. Integration WHIP in broadcasting workflows • Old version of OBS-WebRTC did have WHIP support • Tested for my blog post from last year • Implemented legacy WHIP API, and used libwebrtc • No popular streamer tool supports WHIP yet, though • WHIP will make it easy for the signalling part... • ... but they’ll still need a working WebRTC stack • Why not start with a more “loose” integration then? • Keeping on using existing tools as they work today • Somehow get them to work with my GStreamer-based WHIP client
  • 63. What is NDI? • Network Device Interface (NDI) • Royalty-free software standard developed by NewTek • https://www.ndi.tv/ • Live exchange of multimedia streams within the same LAN • Multichannel and uncompressed media streams (high quality) • mDNS used for service discovery • Easy to use (and integrate) native SDK • Available on Windows, Linux, MacOS, Android, etc. • VLC team working on an alternative implementation • Widely used in the broadcasters industry • Natively supported by many devices and streamer tools
  • 64. What is NDI? • Network Device Interface (NDI) • Royalty-free software standard developed by NewTek • https://www.ndi.tv/ • Live exchange of multimedia streams within the same LAN • Multichannel and uncompressed media streams (high quality) • mDNS used for service discovery • Easy to use (and integrate) native SDK • Available on Windows, Linux, MacOS, Android, etc. • VLC team working on an alternative implementation • Widely used in the broadcasters industry • Natively supported by many devices and streamer tools
  • 65. What is NDI? • Network Device Interface (NDI) • Royalty-free software standard developed by NewTek • https://www.ndi.tv/ • Live exchange of multimedia streams within the same LAN • Multichannel and uncompressed media streams (high quality) • mDNS used for service discovery • Easy to use (and integrate) native SDK • Available on Windows, Linux, MacOS, Android, etc. • VLC team working on an alternative implementation • Widely used in the broadcasters industry • Natively supported by many devices and streamer tools
  • 66. What is NDI? • Network Device Interface (NDI) • Royalty-free software standard developed by NewTek • https://www.ndi.tv/ • Live exchange of multimedia streams within the same LAN • Multichannel and uncompressed media streams (high quality) • mDNS used for service discovery • Easy to use (and integrate) native SDK • Available on Windows, Linux, MacOS, Android, etc. • VLC team working on an alternative implementation • Widely used in the broadcasters industry • Natively supported by many devices and streamer tools
  • 67. We’ve talked about WebRTC-to-NDI before...
  • 68. What about NDI-to-WebRTC, though? • There’s a cool NDI plugin for GStreamer • Makes it easy to use NDI sources in GStreamer pipelines • https://github.com/teltek/gst-plugin-ndi • Hey, our WHIP client is based on GStreamer too! • Audio and video pipelines are customizable (command line) • NDI plugin as source for the media −→ encoders/WebRTC will do the rest • Of course, we need something that generates NDI • OBS has an NDI plugin, for NDI input and output • https://github.com/Palakis/obs-ndi
  • 69. What about NDI-to-WebRTC, though? • There’s a cool NDI plugin for GStreamer • Makes it easy to use NDI sources in GStreamer pipelines • https://github.com/teltek/gst-plugin-ndi • Hey, our WHIP client is based on GStreamer too! • Audio and video pipelines are customizable (command line) • NDI plugin as source for the media −→ encoders/WebRTC will do the rest • Of course, we need something that generates NDI • OBS has an NDI plugin, for NDI input and output • https://github.com/Palakis/obs-ndi
  • 70. What about NDI-to-WebRTC, though? • There’s a cool NDI plugin for GStreamer • Makes it easy to use NDI sources in GStreamer pipelines • https://github.com/teltek/gst-plugin-ndi • Hey, our WHIP client is based on GStreamer too! • Audio and video pipelines are customizable (command line) • NDI plugin as source for the media −→ encoders/WebRTC will do the rest • Of course, we need something that generates NDI • OBS has an NDI plugin, for NDI input and output • https://github.com/Palakis/obs-ndi
  • 71. 1. Configure NDI output in OBS
  • 72. 2. Create your scenes in OBS
  • 73. 3. Setup the WHIP client to capture NDI
  • 74. Ready for our demo!
  • 75. Ready for our demo!
  • 76. Ready for our demo!
  • 77. More details in a recent CommCon talk https://2021.commcon.xyz/talks/whip-ndi-and-janus-genesis-of-a-broadcasting-demo
  • 78. Next step: broadcasting the stream • WHIP server + Janus get you in a VideoRoom, and it’s a good starting point • That’s the whole point of WebRTC ingest! • Already “consumable” via VideoRoom itself (SFU) • Janus VideoRoom plugin not really optimized for broadcasting, though • Conceived for videoconferencing use cases • Will not work well if you have to feed, e.g., 100’s or 1000’s • Janus Streaming plugin a much better choice • Natively optimized for doing one-to-many • Can receive media from VideoRoom (and so WHIP) via “RTP forwarders” • Even better, multiple Janus instances can work together
  • 79. Next step: broadcasting the stream • WHIP server + Janus get you in a VideoRoom, and it’s a good starting point • That’s the whole point of WebRTC ingest! • Already “consumable” via VideoRoom itself (SFU) • Janus VideoRoom plugin not really optimized for broadcasting, though • Conceived for videoconferencing use cases • Will not work well if you have to feed, e.g., 100’s or 1000’s • Janus Streaming plugin a much better choice • Natively optimized for doing one-to-many • Can receive media from VideoRoom (and so WHIP) via “RTP forwarders” • Even better, multiple Janus instances can work together
  • 80. Next step: broadcasting the stream • WHIP server + Janus get you in a VideoRoom, and it’s a good starting point • That’s the whole point of WebRTC ingest! • Already “consumable” via VideoRoom itself (SFU) • Janus VideoRoom plugin not really optimized for broadcasting, though • Conceived for videoconferencing use cases • Will not work well if you have to feed, e.g., 100’s or 1000’s • Janus Streaming plugin a much better choice • Natively optimized for doing one-to-many • Can receive media from VideoRoom (and so WHIP) via “RTP forwarders” • Even better, multiple Janus instances can work together
  • 81. Ph.D Thesis on WebRTC broadcasting (2015)
  • 82. Using SOLEIL for the purpose • “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis) • In a nutshell, tree-based distribution of WebRTC feeds • Ingest and edges are WebRTC (Janus), everything in the middle just RTP • Working with RTP in intermediate layers has many advantages • No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools • You can even take advantage of multicast, here • Just needs RTP forwarding to start everything • PR available in WHIP server to do RTP forwarding (merged) • https://github.com/lminiero/simple-whip-server/pull/2
  • 83. Using SOLEIL for the purpose • “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis) • In a nutshell, tree-based distribution of WebRTC feeds • Ingest and edges are WebRTC (Janus), everything in the middle just RTP • Working with RTP in intermediate layers has many advantages • No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools • You can even take advantage of multicast, here • Just needs RTP forwarding to start everything • PR available in WHIP server to do RTP forwarding (merged) • https://github.com/lminiero/simple-whip-server/pull/2
  • 84. Using SOLEIL for the purpose • “Streaming Of Large scale Events over Internet cLouds” (Ph.D Thesis) • In a nutshell, tree-based distribution of WebRTC feeds • Ingest and edges are WebRTC (Janus), everything in the middle just RTP • Working with RTP in intermediate layers has many advantages • No WebRTC overhead, and easier to route/manipulate by non-WebRTC tools • You can even take advantage of multicast, here • Just needs RTP forwarding to start everything • PR available in WHIP server to do RTP forwarding (merged) • https://github.com/lminiero/simple-whip-server/pull/2
  • 85. To learn more about RTP forwarders... https://archive.fosdem.org/2020/schedule/event/janus/
  • 86. To learn more about RTP forwarders... https://archive.fosdem.org/2020/schedule/event/janus/
  • 87. To learn more about RTP forwarders... https://archive.fosdem.org/2020/schedule/event/janus/
  • 88. Distributing WHIP Janus streams via SOLEIL
  • 89. Distributing WHIP Janus streams via SOLEIL
  • 90. Distributing WHIP Janus streams via SOLEIL
  • 91. Distributing WHIP Janus streams via SOLEIL
  • 92. Distributing WHIP Janus streams via SOLEIL
  • 95. Thanks! Questions? Comments? Contacts • https://twitter.com/elminiero • https://twitter.com/meetecho • https://www.meetecho.com