diff options
Diffstat (limited to 'net/webrtc/gstwebrtc-api/README.md')
-rw-r--r-- | net/webrtc/gstwebrtc-api/README.md | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/net/webrtc/gstwebrtc-api/README.md b/net/webrtc/gstwebrtc-api/README.md new file mode 100644 index 00000000..26174f1a --- /dev/null +++ b/net/webrtc/gstwebrtc-api/README.md @@ -0,0 +1,150 @@ +# gstwebrtc-api + +[![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-brightgreen.svg)](https://opensource.org/licenses/MPL-2.0) + +Javascript API used to integrate GStreamer WebRTC streams produced and consumed by webrtcsink and webrtcsrc elements +into a web browser or a mobile WebView. + +This API allows a complete 360º interconnection between GStreamer and web interfaces for realtime streaming using the +WebRTC protocol. + +This API is released under the Mozilla Public License Version 2.0 (MPL-2.0) that can be found in the LICENSE-MPL-2.0 +file or at https://opensource.org/licenses/MPL-2.0 + +Copyright (C) 2022 Igalia S.L. <<info@igalia.com>><br> +Author: Loïc Le Page <<llepage@igalia.com>> + +It includes external source code from [webrtc-adapter](https://github.com/webrtcHacks/adapter) that is embedded with +the API. The webrtc-adapter BSD 3-Clause license is available at +https://github.com/webrtcHacks/adapter/blob/master/LICENSE.md + +Webrtc-adapter is Copyright (c) 2014, The WebRTC project authors, All rights reserved.<br> +Copyright (c) 2018, The adapter.js project authors, All rights reserved. + +It also includes Keyboard.js source code from the Apache [guacamole-client](https://github.com/apache/guacamole-client) +that is embedded with the API to enable remote control of the webrtcsink producer. + +Keyboard.js is released under the Apache 2.0 license available at: +https://github.com/apache/guacamole-client/blob/master/LICENSE + +## Building the API + +The GstWebRTC API uses [Webpack](https://webpack.js.org/) to bundle all source files and dependencies together. + +You only need to install [Node.js](https://nodejs.org/en/) to run all commands. + +On first time, install the dependencies by calling: +```shell +$ npm install +``` + +Then build the bundle by calling: +```shell +$ npm run make +``` + +It will build and compress the code into the *dist/* folder, there you will find 2 files: +- *gstwebrtc-api-[version].min.js* which is the only file you need to include into your web application to use the API. + It already embeds all dependencies. +- *gstwebrtc-api-[version].min.js.map* which is useful for debugging the API code, you need to put it in the same + folder as the API script on your web server if you want to allow debugging, else you can just ignore it. + +The API documentation is created into the *docs/* folder. It is automatically created when building the whole API. + +If you want to build the documentation only, you can call: +```shell +$ npm run docs +``` + +If you only want to build the API without the documentation, you can call: +```shell +$ npm run build +``` + +## Packaging the API + +You can create a portable package of the API by calling: +```shell +$ npm pack +``` + +It will create a *gstwebrtc-api-[version].tgz* file that contains all source code, documentation and built API. This +portable package can be installed as a dependency in any Node.js project by calling: +```shell +$ npm install gstwebrtc-api-[version].tgz +``` + +## Testing and debugging the API + +To easily test and debug the GstWebRTC API, you just need to: +1. launch the webrtc signalling server by calling (from the repository *gst-plugins-rs* root folder): + ```shell + $ cargo run --bin gst-webrtc-signalling-server + ``` +2. launch the GstWebRTC API server by calling (from the *net/webrtc/gstwebrtc-api* sub-folder): + ```shell + $ npm start + ``` + +It will launch a local HTTPS server listening on port 9090 and using an automatically generated self-signed +certificate. + +With this server you can test the reference example shipped in *index.html* from a web browser on your local computer +or a mobile device. + +## Interconnect with GStreamer pipelines + +Once the signalling and gstwebrtc-api servers launched, you can interconnect the streams produced and consumed from +the web browser with GStreamer pipelines using the webrtcsink and webrtcsrc elements. + +### Consume a WebRTC stream produced by the gstwebrtc-api + +On the web browser side, click on the *Start Capture* button and give access to the webcam. The gstwebrtc-api will +start producing a video stream. + +The signalling server logs will show the registration of a new producer with the same *peer_id* as the *Client ID* +that appears on the webpage. + +Then launch the following GStreamer pipeline: +```shell +$ gst-launch-1.0 playbin uri=gstwebrtc://[signalling server]?peer-id=[client ID of the producer] +``` + +Using the local signalling server, it will look like this: +```shell +$ gst-launch-1.0 playbin uri=gstwebrtc://127.0.0.1:8443?peer-id=e54e5d6b-f597-4e8f-bc96-2cc3765b6567 +``` + +The underlying *uridecodebin* element recognizes the *gstwebrtc://* scheme as a WebRTC stream compatible with the +gstwebrtc-api and will correctly use a *webrtcsrc* element to manage this stream. + +The *gstwebrtc://* scheme is used for normal WebSocket connections to the signalling server, and the *gstwebrtcs://* +scheme for secured connections over SSL or TLS. + +### Produce a GStreamer WebRTC stream consumed by the gstwebrtc-api + +Launch the following GStreamer pipeline: +```shell +$ gst-launch-1.0 videotestsrc ! agingtv ! webrtcsink meta="meta,name=native-stream" +``` + +By default *webrtcsink* element uses *ws://127.0.0.1:8443* for the signalling server address, so there is no need +for more arguments. If you're hosting the signalling server elsewhere, you can specify its address by adding +`signaller::address="ws[s]://[signalling server]"` to the list of *webrtcsink* properties. + +Once the GStreamer pipeline launched, you will see the registration of a new producer in the logs of the signalling +server and a new remote stream, with the name *native-stream*, will appear on the webpage. + +You just need to click on the corresponding entry to connect as a consumer to the remote native stream. + +### Produce a GStreamer interactive WebRTC stream with remote control + +Launch the following GStreamer pipeline: +```shell +$ gst-launch-1.0 wpesrc location=https://gstreamer.freedesktop.org/documentation ! queue ! webrtcsink enable-data-channel-navigation=true meta="meta,name=web-stream" +``` + +Once the GStreamer pipeline launched, you will see a new producer with the name *web-stream*. When connecting to this +producer you will see the remote rendering of the web page. You can interact remotely with this web page, controls are +sent through a special WebRTC data channel while the rendering is done remotely by the +[wpesrc](https://gstreamer.freedesktop.org/documentation/wpe/wpesrc.html) element. |