jittr
1.0.0
การใช้งานนี้ออกแบบมาเพื่อต่อสู้กับการกระวนกระวายใจของเครือข่ายและสร้างสตรีมสื่อที่เชื่อถือได้ผ่านแพ็กเก็ต udp แพ็กเก็ตที่ไม่ได้เรียงลำดับและความล่าช้าของเครือข่ายที่แตกต่างกันเป็นหนึ่งในปัญหาที่ใหญ่ที่สุดเมื่อพยายามสตรีมอย่างต่อเนื่อง เช่น เสียงผ่าน udp (และน่าจะเป็น rtp มากที่สุด) โครงสร้างข้อมูลนี้จะบัฟเฟอร์แพ็กเก็ตและเรียงลำดับใหม่โดยทำให้เกิดความล่าช้าน้อยที่สุด
การเล่นแพ็กเก็ต Opus จากสตรีม udp/rtp ผ่านบัฟเฟอร์ 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 ) ;
} ,
}
}