2009-03-06 9 views
2

Win32 파형 api를 사용하여 C# 응용 프로그램에서 voip 시스템을 만들고 있습니다. 모두 잘되고 있지만, 나는 즉시 오디오 데이터를 압축하는 방법이 필요합니다.오디오 데이터 압축/압축 해제

기본적으로 오디오 데이터는 크기가 150 바이트 인 '레코드'버퍼에 들어오고이 버퍼는 udp를 통해 전송되고 원격 끝에는 150 바이트가 수신되어 '재생'버퍼에 저장됩니다.

그래서 나는 udp-> send와 udp-> recv 직전에 압축/압축 해제하는 방법이 필요합니다. 일반 압축 알고리즘은 .NET GZip 클래스를 포함하여 오디오와 함께 작동하지 않습니다.

누군가 내가 이것을 할 수 있도록 도움을 줄 수있는 라이브러리를 알고 있습니까? 사전에

덕분에 ...

답변

0

더 코더/디코더, 또는 codec로 잘 알려져있다 찾고있는 구성 요소, 그것은 하나를 따기에 올 때 많은 옵션이 있습니다.

+0

벤처 기업에 관심이 있으십니까? –

1

150 바이트는 오디오 데이터 용으로 믿을 수 없을 정도로 작은 버퍼입니다. 예를 들어 5 밀리 초 미만입니다. 16 KHz 모노. 나는 전문가는 아니지만, 당신이 선택한 압축 방식에 관계없이 압축률은 작은 버퍼를 사용할 때 크게 어려워 질 것이라고 생각합니다. 그 외에도 보내는 각 패킷에 상당한 오버 헤드가 있습니다.

당신이 음성 데이터를 전송하는 경우, 손실 압축에 대한 Speex 살펴보고, 말했다 (I 음성 압축에서 매우 효과적인 발견,하지만 음질은 음악에 대한 끔찍한입니다.)

+0

, 16khz에서 어떤 버퍼 크기를 제안 하시겠습니까? Skype의 버퍼가 150보다 크지 만 압축 후에는 150이되고 결국 skype (udp 스니퍼로 감시)가 수행하기 때문에 150으로 설정됩니다. –

+0

+1 spex. 플래시가 현재 사용하고있는 것입니다. – spender

+0

압축 전 최소 20-30 밀리 초 또는 압축 전 최대 1KB를 제안합니다 (압축이 우수하면 압축 후 150 바이트까지 얻을 수 있지만 전문가는 아님). 블록이 클수록 대기 시간은 길어 지지만 대기 시간은 20ms 더 길지 않습니다. – Qwertie

1

내가 생각하는 것 더 나은 압축을 얻으려면 그 150 바이트 청크를 배치해야 할 것입니다.
비록 작은 버퍼 크기 일지라도 을 약간 압축하여 압축을 얻을 수 있습니다.

내장 된 GZipStream이 작동하지 않는 경우 DotNetZip에 포함 된 GZipStream을 사용해 볼 수 있습니다. 또한 코덱 패턴을 구현하는 DotNetZip에서 사용할 수있는 ZlibCodec 클래스가 있습니다. 이렇게하면 150 바이트 블록으로 압축 할 수 있습니다.

0

위에서 제안한대로 Speex를 살펴 보겠습니다. 그것은 잘 지원되고 있으며, 이제는 Flash Player의 표준이되었습니다.

버퍼 크기를 설정하면 대기 시간이 문제가된다는 가정하에 (버퍼가 클수록 대기 시간이 길어짐) 높은 압축 해제 프레임 크기를 가진 코덱을 사용하지 마십시오. 높은 대기 시간을 유발합니다. 5khz 출력 샘플 속도의 음성에 대해 (더 많은 목적을 달성하는 데 많은 도움이되지는 않을 것입니다) 최소 압축 해제 프레임 크기는 576 샘플 또는 전송하기 전에 인코딩해야하는 데이터의 ~ 100ms입니다 . 이것은 네트워크 문제를 고려하기까지 200ms가 넘는 양면 대기 시간을 의미합니다.

관련 문제