6

我正在使用 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  
)

这个想法是我使用计时器任务来创建一个 throttlingIteratee 并将其与 Enumeratee.grouped 函数配对。这似乎工作得很好,但我无法弄清楚块大小使用什么值。我想让它以与音频播放大致相同的速率产生块。我的音频文件以 82kpbs 编码,我尝试以字节为单位进行计算,但我得出的值似乎太小了,而且音频播放的速度比数据流传输的速度快。

我的问题是两方面的。我采用的基本方法是一个好的方法吗?如果是,我该如何根据音频文件的比特率设置块大小。

4

1 回答 1

0

A few things:

  • 1 kbps = 1000 bits per second = 125 bytes per second. So in your case 10,250 bytes per second.
  • I don't see any problem with your code. I assume you stripped out the code to handle failures for clarity.
  • I don't know your use case, but I would assume that setting this type of throttling can be more easily done in a proxy or a web server instead of in your code.
于 2014-05-12T13:38:55.583 回答