我正在使用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,我试图用字节来计算,但我提出的值似乎太小了,音频播放的速度比数据流的速度快。
我的问题有两个问题。我的基本方法是不是很好?如果是,如何根据音频文件的比特率设置块大小。
答案 0 :(得分:0)
一些事情: