Piszę strumieniową strukturę radia internetowego za pomocą scala i Play. Opieram się na Iteratees dla rzeczywistego przesyłania strumieniowego, ale napotykam problem, który uniemożliwia chciwemu klientowi pobieranie danych zbyt szybko i zużywanie strumienia dla wszystkich klientów. Aby to zrobić, próbowałem stworzyć Enumeratee, który zmniejszy szybkość, z jaką Enumerator generuje dane. Oto co moja Enumeratee wyglądaZagraj w 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
)
Chodzi o to, że używam zadanie czasomierza stworzyć throttlingIteratee i powiązać to z funkcją Enumeratee.grouped. Wydaje się, że działa całkiem dobrze, ale mam problem z ustaleniem, jaką wartość użyć dla rozmiaru porcji. Chcę, aby te kawałki produkowane były w przybliżeniu w takim samym tempie, jak odtwarzanie dźwięku. Mój plik audio jest zakodowany w 82kb/s i próbowałem go obliczyć pod względem bajtów, ale wartości, które wymyślam, wydają mi się zbyt małe, a dźwięk jest szybszy, niż przesyłane są dane.
Moje pytanie jest dwojakie. Czy podstawowe podejście mam dobre? A jeśli tak, to w jaki sposób ustawić rozmiar kawałka pod względem szybkości transmisji pliku audio.
Dzięki, nie poruszyłem tego od jakiegoś czasu, ale spróbuję wykopać stary kod i przetestować twoje numery w ten weekend, abym mógł przyjąć tę odpowiedź – AndrewSwerlick