6

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 つあります。私が実施している基本的なアプローチは適切ですか? そうである場合、オーディオ ファイルのビット レートに関してチャンク サイズを設定するにはどうすればよいでしょうか。

4

1 に答える 1

0

いくつかのこと:

  • 1 kbps = 1 秒あたり 1000 ビット = 1 秒あたり 125 バイト。したがって、あなたの場合、1秒あたり10,250バイトです。
  • あなたのコードに問題はありません。わかりやすくするために、エラーを処理するためにコードを削除したと思います。
  • あなたのユースケースはわかりませんが、このタイプのスロットリングの設定は、コードではなくプロキシまたは Web サーバーでより簡単に実行できると思います。
于 2014-05-12T13:38:55.583 に答える