우리는 Silverlight 위에 오디오 - 비디오 공동 작업 응용 프로그램을 구현했으며이를 조정하려고합니다. 우리가 겪고있는 문제 중 하나는 패킷이 드롭 될 때마다 스트림 대기 시간이 증가한다는 것입니다. 즉, 패킷 손실을 감지하고 요청한 다음 재전송 패킷을 다시 기다려야합니다. 물론, 이것은 우리 오디오 스트림의 일관성으로 지옥을 재생합니다. (가능한 경우 UDP로 전환하지만 Silverlight는 해당 브라우저를 지원하지 않으며 Nagle 알고리즘도 비활성화 했으므로 일반적으로 전송할 byte [] 배열을 제출하는 즉시, 그것은 하나의 패킷으로 전송되었고, TCP 패킷 크기! = 제출 된 데이터의 양을 알고 있지만 Nagle 알고리즘을 사용하지 않도록 설정 한 상태는 가까운 것입니다. 적응 형 지터 버퍼가 있으므로 수는입니다. 패킷을 잃어 버렸지 만 TCP/IP를 통해 손실 된 패킷은 버퍼링해야 할 오디오의 양을 크게 늘려 대기 시간을 증가시킵니다.TCP를 통해 전송 된 실시간 미디어 스트림에서 손실 된 패킷의 영향을 최소화하는 가장 좋은 방법은 무엇입니까?
그래서 우리는 패킷을 보내는 방법을 최적화하려고합니다. 드롭 된 패킷의 영향을 줄이십시오. 현재 구현하려는 여러 가지 경쟁 솔루션이 있습니다.
(1) 패킷을 더 크게 만들 수 있습니다. 현재 우리는 동일한 TCP 스트림을 통해 큰 (~ 1024 바이트 비디오) 패킷과 작은 (~ 70 바이트 오디오) 패킷의 혼합을 보냅니다. 그러나 오디오 및 비디오 데이터를 함께 다중화 할 수 있습니다 (예 : 여유가있을 때마다 오디오 데이터에 일부 비디오 데이터를 첨부). 이렇게하면 개별 패킷이 다소 커지지 만 총 패킷 수는 줄어 듭니다.
(2) 오디오와 비디오를 두 개의 분리 된 TCP 스트림으로 분리 할 수 있습니다. 즉, 패킷 손실로 인해 비디오 스트림이 정지 된 경우 오디오 스트림이 중단되지 않으며 반대의 경우도 마찬가지입니다. 물론 오버 헤드가 약간 증가하고 전송 된 패킷의 전체 수를 줄이지는 못합니다.
(3) 오디오를 여러 개의 별도 TCP 스트림으로 역 다중화 한 다음 먼 쪽에서 재구성 할 수 있습니다. 이것은 효과적으로 단일 UDP 스타일의 패킷 전달을 "허위"로 만들 수 있습니다. 우리가 8 개의 오디오 스트림을 가지고 있고 그 중 하나가 패킷 손실로 인해 정지 되었다면, 다른 스트림은 여전히 제 시간에 데이터를 전달할 수 있습니다. 우리가해야 할 일은 오디오 패킷의 1/8을 처리하는 것입니다 스톨 된 하천이 다시 잡힐 때까지는 사용할 수 없습니다. 물론 이상적은 아니지만, 스트림 전체가 멈추고 손실 된 패킷이 다시 전송 될 때까지 패킷을 재생할 수없는 것보다 더 좋은 경험이 될 수 있습니다.
이러한 가능성에 대한 의견이 있으십니까? 다른 제안? 아니면 우리는 세 가지 모두를 코딩하고 테스트해야합니까?
MTU는 옵션 1에 영향을 미칩니다. 클라이언트와 서버 간의 가장 작은 MTU만큼 빠릅니다. –
동의 함 - 패킷을 너무 크게 만들 수 없습니다. 현재 페이로드를 1024 바이트로 제한하고 있지만 MTU 문제없이 최대 1500 바이트까지 올라갈 수 있다고 생각합니다. –