玩Iteratee节流

And*_*ick 6 scala iterate playframework-2.0

我正在使用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  
)
Run Code Online (Sandbox Code Playgroud)

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

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

vpt*_*ron 0

一些东西:

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