2011-04-24 6 views
2

현재 여러 개의 클라이언트가 서버에 음성을 보내고 나중에 서버가 해당 음성을 혼합하는 간단한 VoIP 프로젝트를 개발 중입니다.음성 오디오를 혼합하는 방법

그러나 간단한 수학적 덧셈을 사용하여 직접 섞을 수는 없습니다. 각주기마다 클라이언트는 3584 바이트의 음성 데이터를 믹서에 보냅니다. 다음은

는 수신기 버퍼에 포함 된 값의 조각입니다 : 내가 버퍼 내부의 패턴이 클라이언트 측에서 그런 식으로 생성하는 방법을 너무 잘 모르겠어요

BYTE buffer[3584]; 

    [0] 0  unsigned char 
    [1] 192 'À' unsigned char 
    [2] 176 '°' unsigned char 
    [3] 61 '=' unsigned char 
    [4] 0  unsigned char 
    [5] 80 'P' unsigned char 
    [6] 172 '¬' unsigned char 
    [7] 61 '=' unsigned char 
    [8] 0  unsigned char 
    [9] 144 '' unsigned char 
    [10] 183 '·' unsigned char 
    [11] 61 '=' unsigned char 
    . 
    . 
    . 

그러나 나는 생각하고 웨이브 패턴 일 수 있습니다. 이제 이와 비슷한 또 다른 데이터가 있다고 가정 해 봅시다. 음성을 어떻게 혼합할까요?

도와주세요. 고맙습니다.

+0

간단한 수학적 덧셈의 결과를 입력 버퍼 수 (산술 평균)로 나누어 보았습니까? – smerlin

+0

@smerlin 나는 시도했다. 그러나 내가들을 수있는 것은 단지 침묵 일 뿐이다. 시도 할 다른 방법은 없나요? –

+0

@Chicko Bueno : 비 압축 PCM 데이터에서 작동해야합니다. 오디오 데이터가 John Zwinck이 지적한대로 압축되어있을 수 있습니다. – smerlin

답변

1

데이터를 다시 보았을 때 부동 소수점 값으로 보였습니다. 이전 게시물에서 오인 한 이유는 아마도 지금 빅 엔디 언 시스템에서 잠시 동안 작업하고있는 것과 관련이 있습니다. 그러나 귀하의 데이터는 리틀 엔디안 IEEE 부동 소수점에 있습니다. 다음은 전환 후 얻은 가치입니다.

0.089630127 -> 0x0090b73d 
0.084136963 -> 0x0050ac3d 
0.086303711 -> 0x00c0b03d 

볼 수 있듯이 값은 매우 작으므로 볼륨을 적용 할 때 고려해야 할 값입니다. 일반적인 규약은 min 및 max 볼륨 각각에 대해이 데이터를 0..1 또는 -1.1 사이에 두는 것입니다.여기

참조에 대한 전체 믹서 출력을 위해 당신은 아마 서명에 데이터를 변환해야한다는 점 available here

for(int i = 0; i < a_Sample->count()/a_Sample->channels(); i++){ 
      float l_Volume = a_Sample->volume() * m_MasterVolume; 

      *l_Output++ += *l_Left * l_PanLeft * l_Volume; 
      *l_Output++ += *l_Right * l_PanRight * l_Volume; 

      l_Left += a_Sample->channels(); 
      l_Right += a_Sample->channels(); 
    } 

주의 사항은, 내가 몇 년 전에 작성한 혼합 루프의 일부입니다 정수는 믹서 나 출력 장치의 책임이라면 적절하게 통신 할 수 있습니다.

+0

감사! 이것은 정말 도움이됩니다! –

3

VoIP 시스템이 압축을 사용하는지 알아야합니다. 아마도 그렇게 할 것입니다. 먼저 스트림을 압축 해제 한 다음 혼합 한 다음 재 압축하면됩니다.

2

이것은 원시 PCM 데이터 인 경우 부동 소수점 배열 (제시된 바이트 패턴으로 인해 발생하지 않을 가능성이 높음) 또는 노래 된 정수 배열 일 수 있으므로 사용하는 것이 좋습니다. PCM 스트림으로 믹싱하는 것은 매우 간단합니다. 두 개의 채널을 더하고이를 두 개로 나눕니다 (볼륨 컨트롤을 위해 다른 가중치를 사용하십시오).

+0

2로 나누기는 오버플로를 피할 수 있습니다 (더 큰 유형을 임시 - 일반적으로 32 비트로 사용하는 경우).하지만 각 음성을 3db 낮게 만듭니다. 믹서에서는 일반적으로 음량을 줄이기를 원하지 않지만 오버플로가 발생할 수 있으므로 양호한 (또는 조잡한) 형식의 리미터 (심지어 포화 된 추가 제한)를 구현해야 할 수도 있습니다. AGC. 두 신호가 모두 -3db 지점 아래에 있으면 ** 샘플에서 오버플로 할 수 없습니다. – jesup

0

다른 사람들이 언급했듯이 버퍼가 어떤 형식인지 알고 있어야합니다. 단순히 바이트를 직접 조작 할 수는 없습니다 (물론 가능하지만 꽤 복잡해집니다). 대부분의 원시 PCM 데이터는 보통 44100 비트/초, 16 비트, 2 채널입니다. 그러나 항상 그런 것은 아닙니다. 그것들 각각은 다를 수 있습니다. 너무 많은 영향을 미치지는 않지만 예입니다. 그러나 WAV 파일조차도 IEEE Float과 같은 다른 형식이 될 수 있습니다. 버퍼를 조작하기 위해서는 올바른 데이터 유형으로 버퍼를 해석해야합니다.

등 :

물론
BYTE buffer[3584]; 
if (SampleTypeIsPcm16Bit()) 
{ 
    short *data = reinterpret_cast<short *>(buffer); 
    // Rock on 
} 
else if (SampleTypeIsFloat()) 
{ 
    float *data = reinterpret_cast<float *>(buffer); 
    // Rock on 
} 

, 당신은 템플릿이 더 일반적인 만들 수 있지만, 알고 동안 그 무시 : P를.

부동 소수점을 처리하는 경우 부동 소수점을 -1.0 및 1.0 범위로 제한해야합니다.

그래서 "재 스퍼 (Jasper)가 언급 한"두 값을 더하고 2로 나누기 "가 작동하지 않는다고 말하는 중입니까? 침묵이 들릴 때 데이터를 어떻게 연주합니까? 수학 문제가 해결된다면 침묵보다는 오디오 결함 (팝/클릭/등)이 들릴 가능성이 높기 때문에 이것이 문제인지 궁금합니다.

+0

고맙습니다 Jason. 사실, 저는 믹싱 파트 만하고 있습니다. 파트너가 음성 캡처 및 재생을하고 있습니다. 재스퍼 기법을 사용해 보았을 때, 나는 침묵의 재생이었다. 팝, 클릭 또는 오르가슴 음성 없음 : P. 음성이 PCM 형식 (원시/이진 데이터)이 아닌 경우 어떻게 혼합합니까? –

+0

글쎄, 말하기 어렵다. 그것은 모두 처리중인 오디오 스트림의 형식에 따라 다릅니다. 서로 섞기 전에 서로 다른 기술이 서로 다른 유형에 영향을 미치므로 실제로 그 사실을 알아야합니다. 이것이 모든 오디오 데이터인지 여부는 명확하지 않습니다 (모든 오디오 데이터 대신 오디오 데이터가 포함 된 독점 컨테이너 일 수 있음). –

관련 문제