玩Iteratee节流

时间:2013-09-28 16:13:38

标签: scala playframework-2.0 iterate

我正在使用scala和Play编写流式网络广播框架。我依靠Iteratees进行实际的流式传输,但是我遇到了一个问题,试图阻止贪婪的客户端过快地下载数据,并为所有客户端使用流。为此,我一直在尝试创建一个Enumeratee,它将限制Enumerator生成数据的速度。这是我的Enumeratee的样子

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  
)

我的想法是,我使用计时器任务创建一个限制标记,并将其与Enumeratee.grouped函数配对。这似乎工作得相当好,但我无法弄清楚用于块大小的值。我希望这个产生的块与音频播放的速率大致相同。我的音频文件编码为82kpbs,我试图用字节来计算,但我提出的值似乎太小了,音频播放的速度比数据流的速度快。

我的问题有两个问题。我的基本方法是不是很好?如果是,如何根据音频文件的比特率设置块大小。

1 个答案:

答案 0 :(得分:0)

一些事情:

  • 1 kbps =每秒1000比特=每秒125字节。所以在你的情况下每秒10,250字节。
  • 我认为您的代码没有任何问题。我假设您为了清晰起见而删除了处理失败的代码。
  • 我不知道你的用例,但我认为设置这种类型的限制可以更容易地在代理或Web服务器中而不是代码中完成。