#udp #streaming #binary-heap #video #audio-video #audio #jitterbuffer

jittr

基于二叉堆的抖动缓冲区实现,用于零延迟 udp/rtp 流

3 个不稳定版本

0.2.0 2023年1月9日
0.1.1 2023年1月4日
0.1.0 2022年10月27日

#339多媒体

MIT 许可证

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