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.
![](/var/linux_magazin/storage/images/linux-magazine.com/issues/2013/154/webrtc-protocol/figure-5/591021-1-eng-US/Figure-5_large.png)
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.
![](/var/linux_magazin/storage/images/linux-magazine.com/issues/2013/154/webrtc-protocol/figure-6/591024-1-eng-US/Figure-6_large.png)
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.
![Learn More](https://www.linux-magazine.com/var/linux_magazin/storage/images/media/linux-magazine-eng-us/images/misc/learn-more/834592-1-eng-US/Learn-More_medium.png)
News
-
NVIDIA Released Driver for Upcoming NVIDIA 560 GPU for Linux
Not only has NVIDIA released the driver for its upcoming CPU series, it's the first release that defaults to using open-source GPU kernel modules.
-
OpenMandriva Lx 24.07 Released
If you’re into rolling release Linux distributions, OpenMandriva ROME has a new snapshot with a new kernel.
-
Kernel 6.10 Available for General Usage
Linus Torvalds has released the 6.10 kernel and it includes significant performance increases for Intel Core hybrid systems and more.
-
TUXEDO Computers Releases InfinityBook Pro 14 Gen9 Laptop
Sporting either AMD or Intel CPUs, the TUXEDO InfinityBook Pro 14 is an extremely compact, lightweight, sturdy powerhouse.
-
Google Extends Support for Linux Kernels Used for Android
Because the LTS Linux kernel releases are so important to Android, Google has decided to extend the support period beyond that offered by the kernel development team.
-
Linux Mint 22 Stable Delayed
If you're anxious about getting your hands on the stable release of Linux Mint 22, it looks as if you're going to have to wait a bit longer.
-
Nitrux 3.5.1 Available for Install
The latest version of the immutable, systemd-free distribution includes an updated kernel and NVIDIA driver.
-
Debian 12.6 Released with Plenty of Bug Fixes and Updates
The sixth update to Debian "Bookworm" is all about security mitigations and making adjustments for some "serious problems."
-
Canonical Offers 12-Year LTS for Open Source Docker Images
Canonical is expanding its LTS offering to reach beyond the DEB packages with a new distro-less Docker image.
-
Plasma Desktop 6.1 Released with Several Enhancements
If you're a fan of Plasma Desktop, you should be excited about this new point release.