2013-09-28 12 views
6

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.

Odpowiedz

0

kilka rzeczy:

  • 1 kbps = 1000 bitów na sekundę = 125 bitów na sekundę. Tak więc w twoim przypadku 10 250 bajtów na sekundę.
  • Nie widzę problemu z Twoim kodem. Zakładam, że usunąłeś kod, aby poradzić sobie z błędami.
  • Nie znam twojego przypadku użycia, ale przypuszczam, że ustawienie tego typu dławienia może być łatwiejsze w proxy lub serwerze WWW, niż w twoim kodzie.
+0

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

Powiązane problemy