Coder Social home page Coder Social logo

omofolarin / client-sdk-rust Goto Github PK

View Code? Open in Web Editor NEW

This project forked from livekit/rust-sdks

0.0 0.0 0.0 5.92 MB

Rust SDKs for LiveKit

License: Apache License 2.0

Shell 0.87% C++ 24.06% Python 0.17% Rust 74.34% Objective-C++ 0.19% Batchfile 0.38%

client-sdk-rust's Introduction

The LiveKit icon, the name of the repository and some sample code in the background.

📹🎙️🦀 Rust Client SDK for LiveKit

Use this SDK to add real-time video, audio and data features to your Rust app. By connecting to a self- or cloud-hosted LiveKit server, you can quickly build applications like interactive live streaming or video calls with just a few lines of code.

crates.io Builds Tests

⚠️ Warning

This SDK is currently in Developer Preview mode and not ready for production use. There will be bugs and APIs may change during this period.

We welcome and appreciate any feedback or contributions. You can create issues here or chat live with us in the #rust-developer-preview channel within the LiveKit Community Slack.

Features

  • Receiving tracks
  • Cross-platform ( currently tested on Windows & MacOS )
  • Data channels
  • Publishing tracks
  • Adaptive Streaming
  • Dynacast
  • Simulcast
  • Hardware video enc/dec
    • NvEnc for Windows
    • VideoToolbox for MacOS/iOS

Crates

  • livekit-core: LiveKit protocol implementation
  • livekit-utils: Shared utilities between our crates
  • livekit-ffi: Bindings for other languages. Uses livekit-core.
  • livekit-webrtc: Safe Rust bindings to libwebrtc
  • webrtc-sys: Unsafe bindings to libwebrtc

Motivation and Design Goals

LiveKit aims to provide an open source, end-to-end WebRTC stack that works everywhere. We have two goals in mind with this SDK:

  1. Build a standalone, cross-platform LiveKit client SDK for Rustaceans.
  2. Build a common core for other platform-specific SDKs (e.g. Unity, Unreal, iOS, Android)

Regarding (2), we've already developed a number of client SDKs for several platforms and encountered a few challenges in the process:

  • There's a significant amount of business/control logic in our signaling protocol and WebRTC. Currently, this logic needs to be implemented in every new platform we support.
  • Interactions with media devices and encoding/decoding are specific to each platform and framework.
  • For multi-platform frameworks (e.g. Unity, Flutter, React Native), the aforementioned tasks proved to be extremely painful.

Thus, we posited a Rust SDK, something we wanted build anyway, encapsulating all our business logic and platform-specific APIs into a clean set of abstractions, could also serve as the foundation for our other SDKs!

We'll first use it as a basis for our Unity SDK (under development), but over time, it will power our other SDKs, as well.

Getting started

Currently, Tokio is required to use this SDK, however we plan to make the async executor runtime agnostic.

Connecting to a Room and listen to events:

use livekit::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
   let (room, mut room_events) = Room::connect(&url, &token).await?;

   while let Some(event) = room_events.recv().await {
      match event {
         RoomEvent::TrackSubscribed { track, publication, participant } => {
            // ...
         }
         _ => {}
      }
   }

   Ok(())
}

Receive video frames of a subscribed track

match event {
   RoomEvent::TrackSubscribed { track, publication, participant } => {
      if let RemoteTrackHandle::Video(video_track) => {
          let rtc_track = video_track.rtc_track();
          rtc_track.on_frame(Box::new(move |frame, buffer| {
              // Just received a video frame!
              // The buffer is YuvEncoded, you can decode it to ABGR by using our yuv_helper
              // See the simple_room example for the conversion
          });
      } else {
          // Audio Track..
      }
   }
   _ => {}
}

Examples

We made a simple room demo leveraging all the current SDK features. Videos are rendered using wgpu and egui.

FAQ

Do you plan to offer a C/C++ SDK?

Yes! In fact, we also plan to release an SDK for C++ in the coming months. It, like our other platform-specific SDKs, will use the Rust SDK. 🙂

Did you consider C/C++ as your common core?

Yes. We chose Rust over C++ for a few reasons:

  • Rust's ownership model and thread-safety leads to fewer crashes/issues.
  • Rust's build system requires less configuration and is easier to work with.
  • While we love C/C++, it's a bit nicer to write code in Rust.
  • Rust has a rich ecosystem of tools (e.g. websockets, async executor).
  • Having the WebAssembly target will be useful down the road, C++ has Emscripten but it's a bit harder to set up and doesn't yet have WebRTC support.

Did you look at Arcas for libwebrtc bindings?

Yes. Our build system is inspired by LBL's work! Given that some of our logic (e.g. hardware decoder code) is in C++ and that we may need to bridge more/different things than Arcas, we decided it was better to have our own bindings for full control.

Did you consider using webrtc.rs instead of libwebrtc?

Yes! As webrtc.rs matures, we'll eventually migrate to a pure Rust stack. For now, we chose libwebrtc for a few reasons:

  • Chrome's adoption and usage means libwebrtc is thoroughly battle-tested.
  • webrtc.rs is ported from Pion (which our SFU is built on) and a better fit for server-side use.
  • libwebrtc currently supports more features like encoding/decoding and includes platform-specific code for dealing with media devices.


LiveKit Ecosystem
Client SDKsComponents · JavaScript · Rust · iOS/macOS · Android · Flutter · Unity (web) · React Native (beta)
Server SDKsNode.js · Golang · Ruby · Java/Kotlin · PHP (community) · Python (community)
ServicesLivekit server · Egress · Ingress
ResourcesDocs · Example apps · Cloud · Self-hosting · CLI

client-sdk-rust's People

Contributors

davidzhao avatar dsa avatar ocupe avatar spiegela avatar theomonnom avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.