Top Related Projects
Pure Go implementation of the WebRTC API
Janus WebRTC Server
Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.
📡 Simple WebRTC video, voice, and data channels
Simple peer-to-peer with WebRTC.
Quick Overview
The webrtc-rs
project is a Rust implementation of the WebRTC (Web Real-Time Communication) protocol, which enables real-time communication between web browsers and devices. It provides a high-level API for building WebRTC-based applications in Rust.
Pros
- Cross-platform: The library is designed to be cross-platform, supporting Windows, macOS, and Linux.
- Asynchronous: The library uses Rust's async/await syntax, making it easy to integrate with other asynchronous Rust code.
- Modular: The library is divided into several modules, allowing developers to use only the parts they need.
- Actively Maintained: The project has regular updates and a responsive community.
Cons
- Limited Documentation: The project's documentation could be more comprehensive, especially for beginners.
- Steep Learning Curve: Integrating WebRTC into a Rust application can be challenging, especially for developers new to both Rust and WebRTC.
- Dependency on C/C++ Libraries: The library relies on C/C++ libraries for some low-level functionality, which can make it more difficult to deploy and maintain.
- Lack of Feature Parity: The library may not yet have feature parity with the official WebRTC implementation in C++.
Code Examples
Here are a few code examples demonstrating the usage of the webrtc-rs
library:
Establishing a WebRTC Connection
use webrtc::api::APIBuilder;
use webrtc::ice_transport::ice_server::RTCIceServer;
use webrtc::peer_connection::configuration::RTCConfiguration;
use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState;
#[tokio::main]
async fn main() {
let api = APIBuilder::new().build();
let configuration = RTCConfiguration {
ice_servers: vec![RTCIceServer {
urls: vec!["stun:stun.l.google.com:19302".to_string()],
..Default::default()
}],
..Default::default()
};
let peer_connection = api.new_peer_connection(configuration).await.unwrap();
// Add event listeners and handle signaling
peer_connection.on_connection_state_change(|state| {
println!("Connection state changed: {:?}", state);
if state == RTCPeerConnectionState::Connected {
println!("Connected!");
}
});
// Perform signaling and exchange ICE candidates
// ...
}
Sending and Receiving Data Channels
use webrtc::data_channel::data_channel_init::RTCDataChannelInit;
use webrtc::data_channel::RTCDataChannel;
use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState;
#[tokio::main]
async fn main() {
// Establish a WebRTC connection (see previous example)
let data_channel = peer_connection
.create_data_channel("my-channel", &RTCDataChannelInit::default())
.await
.unwrap();
data_channel.on_message(|message| {
println!("Received message: {:?}", message);
});
data_channel.send("Hello, WebRTC!").await.unwrap();
}
Capturing and Sending Video
use webrtc::media::track::track_local::kind::video::RTCVideoTrackInit;
use webrtc::media::track::track_local::RTCLocalTrack;
use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState;
#[tokio::main]
async fn main() {
// Establish a WebRTC connection (see previous example)
let video_track = RTCLocalTrack::new(
RTCVideoTrackInit {
track_identifier: "video_track".to_string(),
..Default::default()
},
None,
)
.await
.unwrap();
peer_connection.add_track
Competitor Comparisons
Pure Go implementation of the WebRTC API
Pros of Pion
- Written in Go, which offers better performance and concurrency handling compared to Rust
- More mature project with a larger community and ecosystem
- Extensive documentation and examples available
Cons of Pion
- Less memory-safe than Rust-based WebRTC
- Potentially higher memory usage due to Go's garbage collection
- May have slightly longer compile times compared to Rust
Code Comparison
WebRTC-rs:
use webrtc::peer_connection::RTCPeerConnection;
use webrtc::peer_connection::configuration::RTCConfiguration;
let config = RTCConfiguration::default();
let pc = RTCPeerConnection::new(&config)?;
Pion:
import (
"github.com/pion/webrtc/v3"
)
peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{})
if err != nil {
panic(err)
}
Both repositories provide WebRTC implementations in their respective languages. WebRTC-rs offers the benefits of Rust's memory safety and performance, while Pion leverages Go's simplicity and extensive standard library. The choice between them often depends on the developer's language preference and specific project requirements.
Janus WebRTC Server
Pros of Janus-gateway
- Mature and widely-used WebRTC server implementation with extensive features
- Supports multiple programming languages through its REST API and WebSocket interface
- Highly scalable and suitable for large-scale deployments
Cons of Janus-gateway
- Written in C, which may be less accessible for developers more familiar with higher-level languages
- Steeper learning curve compared to WebRTC-rs due to its comprehensive feature set
Code Comparison
Janus-gateway (C):
janus_plugin *create(void) {
janus_plugin *plugin = (janus_plugin *)calloc(1, sizeof(janus_plugin));
plugin->init = janus_echotest_init;
plugin->destroy = janus_echotest_destroy;
plugin->handle_message = janus_echotest_handle_message;
return plugin;
}
WebRTC-rs (Rust):
pub async fn create_peer_connection(
config: RTCConfiguration,
) -> Result<RTCPeerConnection> {
RTCPeerConnection::new(config).await
}
The code snippets demonstrate the different approaches and languages used in each project. Janus-gateway uses C for low-level control, while WebRTC-rs leverages Rust's safety and modern syntax.
Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.
Pros of jitsi-meet
- Full-featured video conferencing solution with a complete user interface
- Supports large-scale meetings with multiple participants
- Includes additional features like screen sharing, chat, and recording
Cons of jitsi-meet
- More complex setup and deployment compared to a lightweight library
- Higher resource requirements due to its comprehensive feature set
- Less flexibility for custom implementations or integrations
Code Comparison
jitsi-meet (JavaScript):
import { JitsiMeetJS } from 'lib-jitsi-meet';
const connection = new JitsiMeetJS.JitsiConnection(null, null, options);
connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
connection.connect();
webrtc (Rust):
use webrtc::peer_connection::RTCPeerConnection;
let peer_connection = RTCPeerConnection::new()?;
let data_channel = peer_connection.create_data_channel("data", None)?;
Summary
jitsi-meet is a comprehensive video conferencing solution with a full user interface, while webrtc is a lower-level WebRTC implementation in Rust. jitsi-meet offers a ready-to-use platform but may be less flexible for custom integrations. webrtc provides more control over the WebRTC implementation but requires more development effort to create a complete application.
📡 Simple WebRTC video, voice, and data channels
Pros of simple-peer
- Easier to use and more beginner-friendly
- Provides a higher-level abstraction for WebRTC
- Supports both Node.js and browser environments
Cons of simple-peer
- Less flexible and customizable than webrtc
- May not support all advanced WebRTC features
- Written in JavaScript, which may have performance limitations compared to Rust
Code Comparison
simple-peer (JavaScript):
const peer = new SimplePeer({ initiator: true })
peer.on('signal', data => {
// send signal data to peer
})
peer.on('connect', () => {
peer.send('hello')
})
webrtc (Rust):
let pc = RTCPeerConnection::new()?;
let dc = pc.create_data_channel("data")?;
dc.on_open(Box::new(move || {
dc.send_text("hello").unwrap();
}));
Both libraries provide abstractions for WebRTC functionality, but simple-peer offers a more straightforward API for basic use cases. webrtc, being a Rust implementation, provides lower-level control and potentially better performance, but requires more setup and understanding of WebRTC concepts.
simple-peer is ideal for quick prototyping and simpler applications, while webrtc is better suited for more complex, performance-critical projects that require fine-grained control over WebRTC functionality.
Simple peer-to-peer with WebRTC.
Pros of PeerJS
- Written in JavaScript, making it more accessible for web developers
- Simpler API, abstracting away much of WebRTC's complexity
- Extensive documentation and examples available
Cons of PeerJS
- Less flexible and customizable compared to WebRTC
- Limited to browser environments, unlike WebRTC which can be used in various contexts
- May have higher latency due to additional abstraction layer
Code Comparison
PeerJS:
const peer = new Peer();
peer.on('open', (id) => {
const conn = peer.connect('remote-peer-id');
conn.on('open', () => {
conn.send('Hello!');
});
});
WebRTC:
let peer_connection = RTCPeerConnection::new()?;
let data_channel = peer_connection.create_data_channel("data")?;
data_channel.on_open(Box::new(move || {
data_channel.send_text("Hello!").unwrap();
}));
Summary
PeerJS offers a more straightforward approach for web developers, with a focus on ease of use and browser compatibility. WebRTC, on the other hand, provides greater flexibility and can be used in various environments beyond browsers. The choice between the two depends on the specific requirements of the project and the developer's familiarity with the respective languages and ecosystems.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
A pure Rust implementation of WebRTC stack. Rewrite Pion WebRTC stack in Rust
Sponsored with ð by
Silver Sponsors:
Bronze Sponsors:
AdrianEddy
Table of Content
Overview
WebRTC.rs is a pure Rust implementation of WebRTC stack, which rewrites Pion stack in Rust. This project is still in active and early development stage, please refer to the Roadmap to track the major milestones and releases. Examples provide code samples to show how to use webrtc-rs to build media and data channel applications.
Features
WebRTC
Media
Interceptor
Data
RTP
RTCP
SRTP
SCTP
DTLS
mDNS
STUN
TURN
ICE
SDP
Util
Building
Toolchain
Minimum Supported Rust Version: 1.65.0
Our minimum supported rust version(MSRV) policy is to support versions of the compiler released within the last six months. We don't eagerly bump the minimum version we support, instead the minimum will be bumped on a needed by needed basis, usually because downstream dependencies force us to.
Note: Changes to the minimum supported version are not consider breaking from a semver perspective.
Monorepo Setup
All webrtc dependent crates and examples are included in this repository at the top level in a Cargo workspace.
To build all webrtc examples:
cd examples
cargo test # build all examples (maybe very slow)
#[ or just build single example (much faster)
cargo build --example play-from-disk-vpx # build play-from-disk-vpx example only
cargo build --example play-from-disk-h264 # build play-from-disk-h264 example only
#...
#]
To build webrtc crate:
cargo build [or clippy or test or fmt]
Open Source License
Dual licensing under both MIT and Apache-2.0 is the currently accepted standard by the Rust language community and has been used for both the compiler and many public libraries since (see https://doc.rust-lang.org/1.6.0/complement-project-faq.html#why-dual-mitasl2-license). In order to match the community standards, webrtc-rs is using the dual MIT+Apache-2.0 license.
Contributing
Contributors or Pull Requests are Welcome!!!
Top Related Projects
Pure Go implementation of the WebRTC API
Janus WebRTC Server
Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.
📡 Simple WebRTC video, voice, and data channels
Simple peer-to-peer with WebRTC.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot