2013-09-28 34 views
6

我正在寫一個使用Scala和Play的流式Web收音機框架。我依賴於Iteratees進行實際流式傳輸,但是我遇到了一個問題,試圖防止貪婪的客戶端太快地下載數據,併爲所有客戶端使用流。要做到這一點,我一直在試圖創建一個Enumeratee來節制Enumerator產生數據的速度。這裏是我的Enumeratee是什麼樣子玩Iteratee節流

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 
) 

的想法是,我使用定時器任務創建一個throttlingIteratee和一對與Enumeratee.grouped功能。這似乎工作得很好,但我很難找出用於塊大小的值。我想要以與音頻播放速度相同的速度播放這些大塊音樂。我的音頻文件編碼爲82kpbs,我試圖用字節計算,但是我提出的值似乎太小了,音頻播放速度比數據流式傳輸速度快。

我的問題是兩倍。我有一個好的基本方法嗎?如果是這樣,我怎麼去設置音頻文件比特率的塊大小。

回答

0

幾件事:每秒鐘= 125字節

  • 1 kbps的= 1000個比特。所以在你的情況下,每秒鐘10,250字節。
  • 我沒有看到您的代碼有任何問題。爲了清晰起見,我假設你剝離了處理失敗的代碼。
  • 我不知道你的用例,但我會假設設置這種類型的限制可以更容易地在代理或Web服務器而不是在你的代碼中完成。
+0

謝謝,我一段時間沒有碰到這個,但是我會嘗試挖掘我的舊代碼並在本週末測試你的數字,這樣我就可以接受這個答案 – AndrewSwerlick