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 视频
每月328次 下载
用于 livekit-ffi
4.5MB
105K SLoC

📹🎙️🦀 LiveKit的Rust客户端SDK
使用此SDK将实时视频、音频和数据功能添加到您的Rust应用程序中。通过连接到LiveKit云或自托管服务器,您可以通过几行代码快速构建多模态AI、实时直播或视频通话等应用程序。
特性
- 接收轨道
- 发布轨道
- 数据通道
- Simulcast
- SVC编解码器(AV1/VP9)
- 自适应流
- Dynacast
- 硬件视频编/解码
- MacOS/iOS的VideoToolbox
- 支持的平台
- Windows
- MacOS
- Linux
- iOS
- Android
库
livekit-api
: 服务器API和身份验证令牌生成livekit
: LiveKit实时SDKlivekit-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:#?}");
}
});
},
}
},
_ => {}
}
示例
- 基本房间:简单示例,连接到房间。
- wgpu_room:使用 wgpu 和 egui 进行视频渲染的完整示例应用。
- 移动端:针对 iOS 和 Android 的移动应用
- 从磁盘播放:从 wav 文件发布音频
- 保存到磁盘:将接收到的音频保存到 wav 文件
动机和设计目标
LiveKit 致力于提供适用于所有平台的开源、端到端 WebRTC 堆栈。我们通过此 SDK 设定了两个目标
- 为 Rustaceans 构建一个独立、跨平台的 LiveKit 客户端 SDK。
- 构建适用于其他平台特定 SDK 的通用核心(例如 Unity、Unreal、iOS、Android)
关于(2),我们已经为多个平台开发了许多 客户端 SDK,并在过程中遇到了一些挑战
- 我们的信令协议和 WebRTC 中有大量的业务/控制逻辑。目前,这些逻辑需要在我们支持的每个新平台上实现。
- 与媒体设备和编解码器的交互特定于每个平台和框架。
- 对于多平台框架(例如 Unity、Flutter、React Native),上述任务证明非常痛苦。
因此,我们提出了一个 Rust SDK,这是我们无论如何都想构建的东西,将所有业务逻辑和平台特定 API 封装成一套干净的抽象,还可以作为我们其他 SDK 的基础!
我们首先将其作为 Unity SDK(正在开发中)的基础,但随着时间的推移,它还将为我们的其他 SDK 提供动力。
LiveKit 生态系统 | |
---|---|
实时 SDK | React 组件 · 浏览器 · Swift 组件 · iOS/macOS/visionOS · Android · Flutter · React Native · Rust · Node.js · Python · Unity (web) · Unity (beta) |
服务器 API | Node.js · Golang · Ruby · Java/Kotlin · Python · Rust · PHP (community) |
代理框架 | Python · Playground |
服务 | LiveKit 服务器 · Egress · Ingress · SIP |
资源 | 文档 · 示例应用 · 云服务 · 自托管 · 命令行工具 |
依赖项
~9-27MB
~457K SLoC