2013-06-14 7 views
1

클라이언트 PCM 또는 ADPCM 데이터를 전달하는 서버가 있습니다.웹 오디오 Api 실시간 스트리밍 PCM ADPCM

인코딩과 디코딩을 다루고 싶지 않았기 때문에 처음에는 PCM을 사용하기로 결정했습니다.

나는 PCM 내가 글리치를 들어 오디오의 각 청크 사이 그러나 일을 얻었다.

그래서 나는 이유는 높은/지연 시간 품질의 오디오 및 모든 물건 어쩌면 생각 (정렬 클리핑처럼).

그래서 ADPCM을 사용하여 데이터 양을 줄이기로 결정했습니다. 나는 자바 스크립트에서 pcm 디코더에 adpcm을 썼다. 번거 롭다. 데이터 수가 줄어들 어서 글리치를 막을 수 있었으면 좋겠다. (데이터는 재생되는 데이터를 따라 잡을 것이다.)

하지만 나는 틀렸다. 나는 여전히 결함이있다.

TCP로도이 작업을 수행 할 수 있습니까? 아니면 잃어버린 이유입니다. 나는 웹 소켓을 통해 UDP를 가지고 있지 않다.

버퍼링 알고리즘을 구현해야합니까? 나는 그것이 실시간 오디오이기 때문에 이것을하고 싶지 않고 가능한 한 빨리 처리하려고합니다.

당신은 웹을 통해 실시간 오디오에 관해 읽을 수있는 좋은 링크를 알고 있습니다.

코드 예제를 제공 할 수 있지만 이는 높은 수준의 질문입니다.

추신 : 탭을 사용하려고했지만 버퍼링 문제가 발생하여 제어 할 수 없습니다. 또한 서버에서 흐름 제어를받지 못했습니다. Audio 초보자 또는 오디오가 우리의 일시 정지를 멈추었다 고 말하지 않습니다. 푸시 프로토콜이고 내가 얻는 것은 모두 ADPCM 및 PCM 데이터입니다.

+1

실시간 (즉 대기 시간이 짧음)이 필요한 경우 TCP는 좋은 선택이 아닙니다. –

답변

1

물론 TCP를 사용할 수 있습니다. UDP는 전화 응용 프로그램에서 자주 사용되며 오버 헤드가 낮을수록 모든 것이 빨라지므로이 응용 프로그램에서는 패킷이 떨어지거나 잘못된 순서로 도착하는지 여부는 중요하지 않습니다. 하지만 UDP는 옵션이 아니기 때문에 TCP를 사용할 수 있습니다.

의심스러운 점이 있다면, 귀하의 문제는 버퍼 언더런이라고 생각됩니다. 서버에 대한 연결 속도가 충분히 빠르지 않거나 (적어도 지속적으로 충분히 빠름) 또는 충분한 속도로 엔코더에서 데이터를 제공하지 않습니다. 이는 실시간으로 데이터를 기록하고이를 실시간으로 재생하려고 할 때 발생할 수 있습니다.

해결 방법은 데이터를 클라이언트에 보내기 전에 서버 측 버퍼링하는 것입니다. 대기 시간 요구 사항이 허용하는만큼 큰 버퍼를 확보하십시오. 인터넷 라디오의 경우 대기 시간이 중요하지 않으므로 보통 30 초의 버퍼를 선택합니다. 귀하의 목적을 위해, 당신은 아마 적어도 64KB의 버퍼를 원할 것입니다. 이것은 TCP 패킷에서 허용되는 최대 크기입니다. 이 패킷은 길을 따라 파편화 될 것이지만 괜찮습니다.

서버에서 데이터를 보내는 방법을 살펴볼 수도 있습니다. 더 많은 데이터를 보내기 전에 서버가 ACK를 기다리지 않도록 Nagle 알고리즘을 비활성화하십시오.

+0

내일 고맙습니다. 그러나 피곤한 것은 캐시를 데이터 클라이언트 측에서 시도한 것입니다. –

+0

N 초, 나는 그것이 무엇인지 기억하지 못합니다. 하지만 그것은 30 청크 (22050,16bit cpm)이었고 32 비트 부동 소수점으로 변환해야했습니다 (즉, 웹 오디오 API가 취하는 것입니다). 서버 측에서이 모든 연산을 수행하고 어떻게 작동하는지 봅니다.) http : // stackoverflow.com/questions/6593738/audio-data-streaming-in-html5/6955769 # 6955769 일부는 그렇게 생각하지만 모든 샘플에서 클릭이 발생합니다. 하지만 어쨌든 당신이 말한 것을 시도 할 것입니다. 왜냐하면 지금 저는 웹 소켓을 사용하고 있으며 단지 데이터를 푸시하고 있기 때문입니다.하지만 http (이 오디오 샘플이 누락되지 않은 채로)를 위해이 시스템을 구현해야합니다. –