This is a prototype implementation of a WHEP client, developed by Meetecho. While it's conceived to be used mostly for testing with Simple WHEP Server (based on Janus), as a standard WHEP implementation in theory it should be able to interoperate just as well with other WHEP implementations. Notice, though, that just as the WHEP server, this client only implements sessions based on the server offering, meaning it will not work in case the WHEP server expects an offer from the client instead.
Note: this is an implementation of WHEP (WebRTC-HTTP egress protocol), NOT WHIP (WebRTC-HTTP ingestion protocol). If you're looking for a WHIP client to ingest media in a server, check Simple WHEP Client instead.
The main dependencies of this client are:
- pkg-config
- GLib
- libsoup (~= 2.4)
- GStreamer (>= 1.16)
Make sure the related development versions of the libraries are installed, before attempting to build the client, as to keep things simple the Makefile
is actually very raw and naive: it makes use of pkg-config
to detect where the libraries are installed, but if some are not available it will still try to proceed (and will fail with possibly misleading error messages). All of the libraries should be available in most repos (they definitely are on Fedora, which is what I use everyday, and to my knowledge Ubuntu as well).
Notice that, while the Makefile assumes a Linux build, at least in principle it should be possible to build it on other platforms as well, as it makes us of cross-platform dependencies. In case you're willing to submit enhancements to the Makefile to build the client on Windows and/or MacOS as well, it would be more than welcome.
Once the dependencies are installed, all you need to do to build the WHEP client is to type:
make
This will create a whep-client
executable. Trying to launch that without arguments should display a help section:
Usage:
whep-client [OPTION?] -- Simple WHEP client
Help Options:
-h, --help Show help options
Application Options:
-u, --url Address of the WHEP endpoint (required)
-t, --token Authentication Bearer token to use (optional)
-n, --no-trickle Don't trickle candidates, but put them in the SDP answer (default: false)
-f, --follow-link Use the Link headers returned by the WHEP 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)
-o, --disable-colors Disable colors in the logging (default: enabled)
-L, --log-timestamps Enable logging timestamps (default: disabled)
-e, --eos-sink-name GStreamer sink name for EOS signal
-b, --jitter-buffer Jitter buffer (latency) to use in RTP, in milliseconds (default: -1, use webrtcbin's default)
The WHEP client requires a single argument, that is the WHEP endpoint to subscribe to (e.g., an endpoint created in the Simple WHEP Server). Unlike the WHIP client, you're not required to provide any pipeline for audio or video: incoming streams are automatically detected from the negotiation process, and rendered accordingly.
A simple example, that assumes the specified endpoint requires the "verysecret" token via Bearer authorization, is the following:
./whep-client -u http://localhost:7090/whep/endpoint/abc123 -t verysecret
In case, e.g., STUN is needed too, the above command can be extended like this:
./whep-client -u http://localhost:7080/whip/endpoint/abc123 \
-t verysecret -S stun://stun.l.google.com:19302
You can stop the client via CTRL+C, which will automatically send an HTTP DELETE to the WHEP resource to tear down the session.