2013-09-28 10 views
6

저는 스칼라와 재생을 사용하여 스트리밍 웹 라디오 프레임 워크를 쓰고 있습니다. 실제 스트리밍을 위해 Iteratees에 의존하고 있지만 욕심 많은 클라이언트가 너무 빨리 데이터를 다운로드하지 못하도록 막으려 고하고 모든 클라이언트에 대해 스트림을 소비하는 문제에 직면하고 있습니다. 그렇게하기 위해 저는 Enumerator가 얼마나 빨리 데이터를 생성 할지를 조절할 Enumeratee를 만들려고 노력했습니다. 여기에 생각이 나는 throttlingIteratee를 작성하고 페어링 타이머 작업을 사용한다는 것입니다 반복 반복 재생

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이 모습 년대 Enumeratee.grouped 기능이. 이것은 꽤 잘 작동하는 것 같지만, 청크 크기에 어떤 값을 사용할 지 알아 내려는 데 어려움을 겪고 있습니다. 오디오 재생과 거의 같은 속도로 청크를 생성하고 싶습니다. 내 오디오 파일은 82kbps로 인코딩되어 있으며 바이트 수로 계산하려고 시도했지만 값이 너무 작아서 데이터가 스트리밍되는 것보다 오디오가 더 빨리 재생됩니다.

제 질문은 두 가지입니다. 내가 가지고있는 기본 접근 방식이 좋은 것인가? 그렇다면 어떻게하면 오디오 파일의 비트 전송률을 기준으로 청크 크기를 설정해야합니까?

답변

0

몇 가지 초당 바이트 (125) = 초 당

  • 1 = 1000 kbps의 비트. 따라서 귀하의 경우 초당 10,250 바이트입니다.
  • 코드에 어떤 문제도 나타나지 않습니다. 나는 명확성을 위해 실패를 처리하기 위해 코드를 제거했다고 가정합니다.
  • 유스 케이스에 대해서는 잘 모르겠지만 이러한 유형의 조절은 코드 대신 프록시 또는 웹 서버에서보다 쉽게 ​​수행 할 수 있다고 가정합니다.
+0

감사합니다. 잠시 동안 만지지는 않았지만,이 답변을 받아 들일 수 있도록 이전 코드를 파헤 치고 이번 주말에 전화 번호를 테스트 해 보겠습니다. – AndrewSwerlick