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.
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