Tôi đang viết một khung phát thanh web trực tuyến bằng scala và Play. Tôi đang dựa vào Iterate để thực sự phát trực tuyến, nhưng tôi đang gặp sự cố khi cố ngăn chặn một khách hàng tham lam tải xuống dữ liệu quá nhanh và tiêu thụ luồng cho tất cả khách hàng. Để làm như vậy, tôi đã cố gắng để tạo ra một Enumeratee sẽ tăng tốc độ nhanh chóng Enumerator sản xuất dữ liệu. Dưới đây là những gì Enumeratee của tôi trông giống nhưPhát Iteratee throttling
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
)
Ý tưởng là tôi sử dụng tác vụ hẹn giờ để tạo điều chỉnhTạo và ghép nối với chức năng Enumeratee.grouped. Điều này có vẻ hoạt động khá tốt, nhưng tôi đang gặp khó khăn trong việc tìm ra giá trị để sử dụng cho kích thước chunk. Tôi muốn có khối sản phẩm này với tốc độ tương tự như các lần phát âm thanh. Tệp âm thanh của tôi được mã hóa ở 82kpbs và tôi đã cố gắng tính toán theo byte, nhưng giá trị tôi đưa ra dường như quá nhỏ và âm thanh phát nhanh hơn dữ liệu được truyền trực tuyến.
Câu hỏi của tôi là hai lần. Cách tiếp cận cơ bản mà tôi có là một cách tốt nhất? Và nếu nó là, làm thế nào để tôi đi về thiết lập kích thước chunk về tỷ lệ bit của tập tin âm thanh.
Cảm ơn, tôi đã không chạm vào điều này trong một thời gian, nhưng tôi sẽ cố gắng đào mã cũ của tôi và kiểm tra số của bạn vào cuối tuần này để tôi có thể chấp nhận câu trả lời này – AndrewSwerlick