scala と Play を使用して、ストリーミング Web ラジオ フレームワークを作成しています。私は実際のストリーミングを Iteratees に依存していますが、貪欲なクライアントがデータをあまりにも速くダウンロードするのを防ぎ、すべてのクライアントのストリームを消費するという問題に直面しています。そのために、列挙子がデータを生成する速度を調整する列挙子を作成しようとしました。これが私の列挙型の外観です
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 でエンコードされており、それをバイト単位で計算しようとしましたが、得られた値が小さすぎるようで、オーディオはデータがストリーミングされるよりも速く再生されます。
私の質問は 2 つあります。私が実施している基本的なアプローチは適切ですか? そうである場合、オーディオ ファイルのビット レートに関してチャンク サイズを設定するにはどうすればよいでしょうか。