본문 바로가기
놀기/VoIP

PCM to G.711 A-law, G.711 μ-law(u-law) 변환 (Source Code)

by Hi~ 2021. 7. 9.

 

PCM to G.711 A-law, G.711 μ-law 변환 코드를 찾아보니 하나의 소스코드를 바탕으로 일부 수정한 것이었다. 이럴 때는 예제가 가장 잘되어 있는 소스코드를 선택하는 것이 진리!!

 

나는 main 함수가 있어 확인이 용이한 아래 코드를 선택했다. Fast Conversion이라고 되어 있는데 특별한 것은 아니고 변환 테이블을 미리 만들고 PCM 값에 해당하는 압축 값을 선택하는 방법이다.

 

https://github.com/escrichov/G711

 

escrichov/G711

PCM to G711 Fast Conversions. Contribute to escrichov/G711 development by creating an account on GitHub.

github.com

 

PC 또는 저장공간(Flash 등)이 넉넉한 상황이라면 충분히 좋은 선택이지만, Flash에 여유가 없을 경우, 변환 테이블을 유지하기는 현실적으로 불가능하다.

 

gitbub의 소스코드를 기반으로 변환 테이블을 사용하지 않는 main() 함수만 만들어 추가 테스트한 후에 작업 중인 환경을 옮기도록 하자.

 

간략히 수정해보면 g711_table.c 의 pcm16_to_ulaw() 함수를 아래와 같이 수정한 후 실행하면 동일한 결과를 확인할 수 있다. 자신의 프로젝트에 맞게 다듬는 것은 각자의 과제!!

void pcm16_to_ulaw(int src_length, const char *src_samples, char *dst_samples)
{
    int i;
    const unsigned short *s_samples;

    s_samples = (const unsigned short *)src_samples;

    for (i=0; i < src_length / 2; i++) {
        dst_samples[i] = linear2ulaw((short) s_samples[i]);
    }
}

 

 

 

 

 

댓글