WebRTC: Video telephony without a browser plugin
Opening a Peer-to-Peer Connection
The next example goes one step further and transmits the media stream via WebRTC. Before the transfer, the browsers involved exchange session descriptions in Session Description Protocol (SDP) format [11]. The descriptions include information about media streams to be transmitted and the IP addresses, ports, and protocols to use.
Figure 5 shows the steps that an application has to take to open a peer-to-peer connection. Initially, create()
, top left in the figure, creates a peer object for the browser on the left, and stream()
stores the local media stream in the local peer object. Next, offer()
generates a session description, and keepLoc()
stores it as a local session description, also in the local peer object. Then, send()
transmits the information to the right-hand browser.
When the session description reaches the right-hand browser, keepRem()
stores it as information about the other party. Then, answer()
generates a local session description for this browser, and keepLoc()
stores it as a local session description. Finally, send()
transmits it back to the left-hand browser, where the local keepRem()
function stores it as a remote session description. This completes the handshake.
WebRTC in the Local Browser
Listings 4 to 6 transfer the media stream via a peer-to-peer connection, as shown in Figure 5. To remove the need for a signaling server in this preliminary study, two video elements just communicate in the Firefox browser on the local machine (Figure 6). Even locally, WebRTC uses a network connection.
Listing 4 shows the HTML document with the example. As in Listing 2, it binds two JavaScript files in the header. Line 9 of the document body contains a video
element for outputting the local media stream, whereas line 10 has one for outputting the media stream transmitted via WebRTC.
Listing 4
Local and Transmitted Media Stream
Listing 5 shows the JavaScript code of the sample application from the localwebrtc.js
file. Querying and configuring the media stream is handled as in Listing 2, but with a different callback function in lines 5 to 19. In Listing 5, line 6, first connects the media stream with the video element. Line 7 generates the local peer object and stores it in the pcLocal
variable, and line 8 creates the remote peer object in pcRemote
. Line 9 stores the local media stream in the pcLocal
peer object.
Listing 5
WebRTC in the Local Browser
The asynchronous createOffer()
method in line 10 creates the session description for the local context and passes it to the callback function in lines 10 to 17, as in the desc
parameter. The setLocalDescription()
method stores the content of desc
as a local session description in the pcLocal
peer object. As the application runs locally, the setRemoteDescription()
method saves the content of desc
in line 12 as a remote session description for the remote peer object, pcRemote
.
The call to the asynchronous createAnswer()
method in line 13 creates the local session description for the remote peer object, pcRemote
, and passes it to the callback function in lines 13 to 16. Line 14 then stores the session description for the remote peer object, pcRemote
, as a local session description, and line 15 stores it as a remote session description for the local peer object, pcLocal
.
The onaddstream
event for the remote peer object, pcRemote
, is triggered in line 18 by calling the onadd()
function from Listing 6, which returns a callback function. It combines all incoming media streams with the video element that has the ID remote
(Listing 4, line 10). Local communication has now been established.
Listing 6
onadd()
WebRTC via the Internet
The typical application scenario for WebRTC on the Internet requires a signaling server. The signaling server forwards the configuration data, as shown in Figure 1. The following example uses the JSON format for this data. Each message corresponds to a JavaScript object with two components: command
describes the type of message; data
stores the payload data.
The application uses three different types of messages: A message of the offer
type (Listing 7) opens a peer-to-peer connection. To acknowledge opening the connection, the remote site sends a message of the answer
type in return.
Listing 7
Offer in JSON Format
The data fields of the two signals contain the respective local session description. When ICE sends a new candidate, it communicates this by sending an ICE-type message. In this example, data
contains the candidate.
« Previous 1 2 3 4 Next »
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.
News
-
Budgie 10.10 Scheduled for Q1 2025 with a Surprising Desktop Update
If Budgie is your desktop environment of choice, 2025 is going to be a great year for you.
-
Firefox 134 Offers Improvements for Linux Version
Fans of Linux and Firefox rejoice, as there's a new version available that includes some handy updates.
-
Serpent OS Arrives with a New Alpha Release
After months of silence, Ikey Doherty has released a new alpha for his Serpent OS.
-
HashiCorp Cofounder Unveils Ghostty, a Linux Terminal App
Ghostty is a new Linux terminal app that's fast, feature-rich, and offers a platform-native GUI while remaining cross-platform.
-
Fedora Asahi Remix 41 Available for Apple Silicon
If you have an Apple Silicon Mac and you're hoping to install Fedora, you're in luck because the latest release supports the M1 and M2 chips.
-
Systemd Fixes Bug While Facing New Challenger in GNU Shepherd
The systemd developers have fixed a really nasty bug amid the release of the new GNU Shepherd init system.
-
AlmaLinux 10.0 Beta Released
The AlmaLinux OS Foundation has announced the availability of AlmaLinux 10.0 Beta ("Purple Lion") for all supported devices with significant changes.
-
Gnome 47.2 Now Available
Gnome 47.2 is now available for general use but don't expect much in the way of newness, as this is all about improvements and bug fixes.
-
Latest Cinnamon Desktop Releases with a Bold New Look
Just in time for the holidays, the developer of the Cinnamon desktop has shipped a new release to help spice up your eggnog with new features and a new look.
-
Armbian 24.11 Released with Expanded Hardware Support
If you've been waiting for Armbian to support OrangePi 5 Max and Radxa ROCK 5B+, the wait is over.