gstreamer/webrtc
Nirbheek Chauhan 55e86469d9 Check for all necessary plugins at startup
People seem to be having problems ensuring that they have all the
right plugins built, so make it a bit easier for them.
2018-03-10 01:54:48 +05:30
..
multiparty-sendrecv/gst Check for all necessary plugins at startup 2018-03-10 01:54:48 +05:30
sendrecv Check for all necessary plugins at startup 2018-03-10 01:54:48 +05:30
signalling Update Protocol.md 2017-10-29 04:08:45 +05:30
.gitignore Add sendrecv implementation in js and gst webrtc 2017-10-21 20:02:19 +05:30
LICENSE Initial commit 2017-10-21 19:43:01 +05:30
README.md README: link to blog post, document multiparty example 2018-02-17 08:13:36 +05:30

GStreamer WebRTC demos

All demos use the same signalling server in the signalling/ directory

Build

The GStreamer WebRTC implementation has now been merged upstream, so all you need is the latest GStreamer git master, as of 2 February 2018 or later:

You can build these with either Autotools gst-uninstalled:

https://arunraghavan.net/2014/07/quick-start-guide-to-gst-uninstalled-1-x/

Or with Meson gst-build:

https://cgit.freedesktop.org/gstreamer/gst-build/

You may need to install the following packages using your package manager:

json-glib, libsoup, libnice, libnice-gstreamer1 (the gstreamer plugin for libnice)

Documentation

Currently, the best way to understand the API is to read the examples. This post breaking down the API should help with that:

http://blog.nirbheek.in/2018/02/gstreamer-webrtc.html

Examples

sendrecv: Send and receive audio and video

  • Serve the js/ directory on the root of your website, or open https://webrtc.nirbheek.in
    • The JS code assumes the signalling server is on port 8443 of the same server serving the HTML
  • Build the sources in the gst/ directory on your machine
$ gcc webrtc-sendrecv.c $(pkg-config --cflags --libs gstreamer-webrtc-1.0 gstreamer-sdp-1.0 libsoup-2.4 json-glib-1.0) -o webrtc-sendrecv
  • Open the website in a browser and ensure that the status is "Registered with server, waiting for call", and note the id too.
  • Run webrtc-sendrecv --peer-id=ID with the id from the browser. You will see state changes and an SDP exchange.
  • You will see a bouncing ball + hear red noise in the browser, and your browser's webcam + mic in the gst app

TODO: Port to Python and Rust.

multiparty-sendrecv: Multiparty audio conference with N peers

  • Build the sources in the gst/ directory on your machine
$ gcc mp-webrtc-sendrecv.c $(pkg-config --cflags --libs gstreamer-webrtc-1.0 gstreamer-sdp-1.0 libsoup-2.4 json-glib-1.0) -o mp-webrtc-sendrecv
  • Run mp-webrtc-sendrecv --room-id=ID with ID as a room name. The peer will connect to the signalling server and setup a conference room.
  • Run this as many times as you like, each will spawn a peer that sends red noise and outputs the red noise it receives from other peers.
    • To change what a peer sends, find the audiotestsrc element in the source and change the wave property.
    • You can, of course, also replace audiotestsrc itself with autoaudiosrc (any platform) or pulsesink (on linux).
  • TODO: implement JS to do the same, derived from the JS for the sendrecv example.

TODO: Selective Forwarding Unit (SFU) example

  • Server routes media between peers
  • Participant sends 1 stream, receives n-1 streams

TODO: Multipoint Control Unit (MCU) example

  • Server mixes media from all participants
  • Participant sends 1 stream, receives 1 stream