2013-09-28 13 views
6

Sto scrivendo un framework di streaming web radio utilizzando scala e Play. Sto facendo affidamento su Iteratees per lo streaming reale, ma mi sto imbattendo in un problema che tenta di impedire a un client avido di scaricare i dati troppo velocemente e di consumare il flusso per tutti i client. Per fare ciò, ho cercato di creare un enumerato che ridurrebbe la velocità con cui l'enumeratore produce i dati. Ecco quello che sembra il mio Enumeratee comeRiproduci Iteratee throttling

val throttlingIteratee = Iteratee.foldM[Array[Byte], Array[Byte]](new Array[Byte](0)) { 
(result, chunk) => 
    val prom = Promise[Array[Byte]]() 
    timer.schedule(new TimerTask{ 
    def run() = prom.success(result ++ chunk) 
    },1000) 
    prom.future  
} 

private val chunker = Enumeratee.grouped( 
    Traversable.take[Array[Byte]](31792) &>> throttlingIteratee 
) 

L'idea è che io uso il compito timer per creare un throttlingIteratee e abbinamento che con la funzione Enumeratee.grouped. Questo sembra funzionare abbastanza bene, ma sto avendo problemi a capire quale valore usare per la dimensione del blocco. Voglio produrre pezzi di questo tipo all'incirca alla stessa velocità dell'audio. Il mio file audio è codificato a 82kpbs, e ho cercato di calcolarlo in termini di byte, ma i valori che ho trovato sembrano troppo piccoli e l'audio viene riprodotto più velocemente di quanto i dati siano in streaming.

La mia domanda è doppia. L'approccio di base è quello giusto? E se lo è, come faccio per impostare la dimensione del blocco in termini di bit rate del file audio.

risposta

0

Alcune cose:

  • 1 kbps = 1000 bit al secondo = 125 byte al secondo. Quindi nel tuo caso 10.250 byte al secondo.
  • Non vedo alcun problema con il tuo codice. Presumo che hai spogliato il codice per gestire i fallimenti per chiarezza.
  • Non conosco il tuo caso d'uso, ma suppongo che l'impostazione di questo tipo di limitazione possa essere eseguita più facilmente in un proxy o in un server web anziché nel codice.
+0

Grazie, non l'ho toccato da un po ', ma proverò a scavare il mio vecchio codice e testare i tuoi numeri questo fine settimana così posso accettare questa risposta – AndrewSwerlick