jittr
1.0.0
Esta implementação foi projetada para combater o jitter da rede e criar fluxos de mídia confiáveis através de pacotes UDP. Pacotes não ordenados e atrasos variáveis na rede são um dos maiores problemas ao tentar transmitir constantemente, por exemplo, áudio através de udp (e provavelmente rtp). Essa estrutura de dados armazena em buffer os pacotes e os reordena, introduzindo o mínimo de atraso possível.
Reproduza pacotes opus de um fluxo udp/rtp através do buffer de 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 ) ;
} ,
}
}