jittr
1.0.0
تم تصميم هذا التطبيق لمحاربة ارتعاش الشبكة وإنشاء تدفقات وسائط موثوقة من خلال حزم UDP. تعد الحزم غير المرتبة وتأخير الشبكة المتغير أحد أكبر المشكلات عند محاولة التدفق المستمر، على سبيل المثال الصوت من خلال UDP (وعلى الأرجح RTP). تقوم بنية البيانات هذه بتخزين الحزم مؤقتًا وإعادة ترتيبها مع تقديم أقل قدر ممكن من التأخير.
تشغيل حزم opus من دفق udp/rtp عبر المخزن المؤقت للارتعاش:
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 ) ;
} ,
}
}