我正在使用 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 编码,我尝试以字节为单位进行计算,但我得出的值似乎太小了,而且音频播放的速度比数据流传输的速度快。
我的问题是两方面的。我采用的基本方法是一个好的方法吗?如果是,我该如何根据音频文件的比特率设置块大小。