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

jittr

A binary heap based jitter buffer implementation for zero latency udp/rtp streams

3 unstable releases

0.2.0 Jan 9, 2023
0.1.1 Jan 4, 2023
0.1.0 Oct 27, 2022

#322 in Multimedia

Download history 1/week @ 2024-02-13 18/week @ 2024-02-20 43/week @ 2024-02-27 13/week @ 2024-03-05 3/week @ 2024-03-12 6/week @ 2024-03-19 9/week @ 2024-03-26 37/week @ 2024-04-02

53 downloads per month

MIT license

20KB
409 lines

jittr

A binary heap based jitter buffer implementation for zero latency udp/rtp streams


This implementation is designed to fight network jitter and create reliable media streams through udp packets. Unordered packets and varying network delay is one of the biggest problems when trying to constantly streaming e.g. audio through udp (and most likely rtp). This datastructure buffers packets and reorders them whilst introducing as little delay as possible.

Examples

Opus

Playback opus packets from an udp/rtp stream through the jitter buffer:

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);
        },
    }
}

Dependencies

~2MB
~35K SLoC