11个不稳定版本 (4个破坏性更改)

0.5.1 2024年8月22日
0.4.1 2024年6月24日
0.3.2 2024年2月28日
0.2.0 2023年8月3日
0.1.1 2023年1月12日

#141 in 视频

Download history 77/week @ 2024-05-02 60/week @ 2024-05-09 83/week @ 2024-05-16 56/week @ 2024-05-23 51/week @ 2024-05-30 82/week @ 2024-06-06 59/week @ 2024-06-13 172/week @ 2024-06-20 31/week @ 2024-06-27 43/week @ 2024-07-04 32/week @ 2024-07-11 20/week @ 2024-07-18 52/week @ 2024-07-25 85/week @ 2024-08-01 108/week @ 2024-08-08 80/week @ 2024-08-15

每月328次 下载
用于 livekit-ffi

Apache-2.0

4.5MB
105K SLoC

Go 56K SLoC // 0.1% comments Rust 49K SLoC // 0.0% comments Shell 50 SLoC // 0.4% comments TypeScript 11 SLoC JavaScript 10 SLoC
The LiveKit icon, the name of the repository and some sample code in the background.

📹🎙️🦀 LiveKit的Rust客户端SDK

使用此SDK将实时视频、音频和数据功能添加到您的Rust应用程序中。通过连接到LiveKit云或自托管服务器,您可以通过几行代码快速构建多模态AI、实时直播或视频通话等应用程序。

crates.io livekit docs.rs Builds Tests

特性

  • 接收轨道
  • 发布轨道
  • 数据通道
  • Simulcast
  • SVC编解码器(AV1/VP9)
  • 自适应流
  • Dynacast
  • 硬件视频编/解码
    • MacOS/iOS的VideoToolbox
  • 支持的平台
    • Windows
    • MacOS
    • Linux
    • iOS
    • Android

  • livekit-api: 服务器API和身份验证令牌生成
  • livekit: LiveKit实时SDK
  • livekit-ffi: 内部库,用于为其他语言生成绑定
  • livekit-protocol: LiveKit协议生成代码

当将SDK作为依赖项添加到您的项目时,请确保在Cargo配置中添加必要的rustflags,否则链接可能会失败。

另外,请参阅支持的平台工具包列表。

入门

目前,使用此SDK需要Tokio,但我们计划使其异步执行器运行时不依赖于任何特定。

使用服务器API

生成访问令牌

use livekit_api::access_token;
use std::env;

fn create_token() -> Result<String, access_token::AccessTokenError> {
    let api_key = env::var("LIVEKIT_API_KEY").expect("LIVEKIT_API_KEY is not set");
    let api_secret = env::var("LIVEKIT_API_SECRET").expect("LIVEKIT_API_SECRET is not set");

    let token = access_token::AccessToken::with_api_key(&api_key, &api_secret)
        .with_identity("rust-bot")
        .with_name("Rust Bot")
        .with_grants(access_token::VideoGrants {
             room_join: true,
             room: "my-room".to_string(),
             ..Default::default()
        })
        .to_jwt();
    return token
}

使用RoomService API创建房间

use livekit_api::services::room::{CreateRoomOptions, RoomClient};

#[tokio::main]
async fn main() {
    let room_service = RoomClient::new("https://127.0.0.1:7880").unwrap();

    let room = room_service
        .create_room("my_room", CreateRoomOptions::default())
        .await
        .unwrap();

    println!("Created room: {:?}", room);
}

使用实时SDK

连接到房间并监听事件

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(())
}

接收已订阅轨道的视频帧

...
use futures::StreamExt; // this trait is required for iterating on audio & video frames
use livekit::prelude::*;

match event {
    RoomEvent::TrackSubscribed { track, publication, participant } => {
        match track {
            RemoteTrack::Audio(audio_track) => {
                let rtc_track = audio_track.rtc_track();
                let mut audio_stream = NativeAudioStream::new(rtc_track);
                tokio::spawn(async move {
                    // Receive the audio frames in a new task
                    while let Some(audio_frame) = audio_stream.next().await {
                        log::info!("received audio frame - {audio_frame:#?}");
                    }
                });
            },
            RemoteTrack::Video(video_track) => {
                let rtc_track = video_track.rtc_track();
                let mut video_stream = NativeVideoStream::new(rtc_track);
                tokio::spawn(async move {
                    // Receive the video frames in a new task
                    while let Some(video_frame) = video_stream.next().await {
                        log::info!("received video frame - {video_frame:#?}");
                    }
                });
            },
        }
    },
    _ => {}
}

示例

动机和设计目标

LiveKit 致力于提供适用于所有平台的开源、端到端 WebRTC 堆栈。我们通过此 SDK 设定了两个目标

  1. 为 Rustaceans 构建一个独立、跨平台的 LiveKit 客户端 SDK。
  2. 构建适用于其他平台特定 SDK 的通用核心(例如 Unity、Unreal、iOS、Android)

关于(2),我们已经为多个平台开发了许多 客户端 SDK,并在过程中遇到了一些挑战

  • 我们的信令协议和 WebRTC 中有大量的业务/控制逻辑。目前,这些逻辑需要在我们支持的每个新平台上实现。
  • 与媒体设备和编解码器的交互特定于每个平台和框架。
  • 对于多平台框架(例如 Unity、Flutter、React Native),上述任务证明非常痛苦。

因此,我们提出了一个 Rust SDK,这是我们无论如何都想构建的东西,将所有业务逻辑和平台特定 API 封装成一套干净的抽象,还可以作为我们其他 SDK 的基础!

我们首先将其作为 Unity SDK(正在开发中)的基础,但随着时间的推移,它还将为我们的其他 SDK 提供动力。


LiveKit 生态系统
实时 SDKReact 组件 · 浏览器 · Swift 组件 · iOS/macOS/visionOS · Android · Flutter · React Native · Rust · Node.js · Python · Unity (web) · Unity (beta)
服务器 APINode.js · Golang · Ruby · Java/Kotlin · Python · Rust · PHP (community)
代理框架Python · Playground
服务LiveKit 服务器 · Egress · Ingress · SIP
资源文档 · 示例应用 · 云服务 · 自托管 · 命令行工具

依赖项

~9-27MB
~457K SLoC