3 个不稳定版本
0.2.0 | 2023年1月9日 |
---|---|
0.1.1 | 2023年1月4日 |
0.1.0 | 2022年10月27日 |
#339 在 多媒体 中
20KB
409 行
jittr
基于二叉堆的抖动缓冲区实现,用于零延迟 udp/rtp 流
此实现旨在对抗网络抖动并通过 udp 数据包创建可靠的媒体流。无序数据包和变化的网络延迟是尝试通过 udp(以及很可能是 rtp)不断传输,例如音频时遇到的最大问题之一。此数据结构缓冲数据包并重新排序它们,同时尽可能减少延迟。
示例
Opus
通过抖动缓冲区播放 udp/rtp 流中的 opus 数据包
use async_std::stream::interval;
use std::time::Duration;
use jittr::{JitterBuffer, Packet};
let mut rtp_stream = /* your rtp stream */;
/// Your Packet implementation
struct Opus { .. }
impl Packet for Opus { .. }
/// Create a jitter buffer for Opus packets
/// It can hold up to 10 packets before it starts to discard old packets
let mut jitter = JitterBuffer::<Opus, 10>::new();
/// Create an interval for packet playback
/// A typical length for audio packets is between 10 and 20ms
let mut playback = interval(Duration::from_millis(20));
loop {
futures::select! {
_ = playback.next().fuse() => {
let packet = jittr.pop();
let pcm = /* Opus decodes audio if present or infers if none */
// Write pcm to speaker
},
rtp = rtp_stream.next().fuse() => {
let opus: Opus = rtp.unwrap();
jittr.push(opus);
},
}
}
依赖项
~2MB
~35K SLoC