jittr
1.0.0
Diese Implementierung soll Netzwerk-Jitter bekämpfen und zuverlässige Medienströme durch UDP-Pakete erstellen. Ungeordnete Pakete und unterschiedliche Netzwerkverzögerungen sind eines der größten Probleme, wenn Sie versuchen, ständig Audiodaten über UDP (und höchstwahrscheinlich RTP) zu streamen. Diese Datenstruktur puffert Pakete und ordnet sie neu, während sie gleichzeitig so wenig Verzögerung wie möglich verursacht.
Opus-Pakete von einem UDP/RTP-Stream über den Jitter-Puffer abspielen:
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 ) ;
} ,
}
}