jittr
1.0.0
Implementasi ini dirancang untuk melawan jitter jaringan dan menciptakan aliran media yang andal melalui paket udp. Paket yang tidak berurutan dan penundaan jaringan yang bervariasi adalah salah satu masalah terbesar ketika mencoba streaming terus-menerus misalnya audio melalui udp (dan kemungkinan besar rtp). Struktur data ini melakukan buffering terhadap paket-paket dan menyusun ulang paket-paket tersebut sambil menimbulkan penundaan sesedikit mungkin.
Memutar ulang paket karya dari aliran udp/rtp melalui buffer jitter:
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 ) ;
} ,
}
}