C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[71415] [질문]wav파일 mixing에 대하여
하안인 [hurco] 3241 읽음    2014-06-13 15:27

wav 파일을 mix하려고 합니다.

microsoft pcm 파일(header있는파일)은 인터넷상에서 찾아서 믹싱하니 되던데요.

제가 하려는 것은 (header없는)
pcm 8bit-mu-law Compressed 입니다.

두개파일을 믹싱하니 잡음이 굉장히 많이 있어서요.

어떻게 해야 하는지.....

소스는 아래에 있습니다.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
/* 실행파일, 플레이타임이 긴 음원, 플레이타임이 긴 음원에 비해 짧은 음원, MIXING해서 새로이 나올 파일이름을 넣는다 */


/* 2개의 파일을 열고 1개의 파일을 쓸 것이므로 파일 포인터가 3개 필요하다 */

    FILE *in_pcm1_fd;
    FILE *in_pcm2_fd;
    FILE *out_pcm_fd;



/* 파일을 불러와서 저장하고 mix해서 저정할 값이 된다. */


    short *buf1;
    short *buf2;
    short *buf;

//    unsigned char *buf1,*buf2,*buf;

    int result;




/* 첫번째 인자의 파일 사이즈와, 두번째 인자의 파일 사이즈를 저장할 변수이다 */
    int pcm1_size;
    int pcm2_size;



/* 첫번째 파일을 연다 */

    in_pcm1_fd = fopen("pcm_21mulaw_8bit.wav", "r");
    if( in_pcm1_fd == NULL)
    {
        perror("input name1 ERR : ");
        exit(0);
    }



/* 두번째 파일을 연다 */
    in_pcm2_fd = fopen("pcm_22mulaw_8bit.wav", "r");
    if( in_pcm1_fd == NULL)
    {
        perror("input name2 ERR : ");
        exit(0);
    }



/* mixing 해서 저장할 파일을 생성한다 */
    out_pcm_fd = fopen("pcm_2out.wav", "wb");
    if( in_pcm1_fd == NULL)
    {
        perror("output file create ERR: ");
        exit(0);
    }



/* 첫번째 파일의 크기를 구한다. 파일 저장현식을 short형식으로 저장을 할 것이기에 저장할 형식에 따라 나누는게 필요하다. */

    fseek(in_pcm1_fd, 0, SEEK_END);
    pcm1_size = ftell(in_pcm1_fd) / sizeof(short);
    rewind(in_pcm1_fd);



/* 두번째 파일의 크기를 구한다. 방법은 위와 같다. */

    fseek(in_pcm2_fd, 0, SEEK_END);
    pcm2_size = ftell(in_pcm2_fd) / sizeof(short);
    rewind(in_pcm2_fd);



/* 오픈한 파일크기만큼 저장할 영역을 할당한다. 내가 시도하는 것은 음원의 사이즈가 작기 때문에 별 문제가 되지 않을 것 같은데, 음원이 클 경우에는 한번에 전체 사이즈를 저장하는 형식보다 나눠서 저장해서 mixing하고 다시 저장하고 mixing하는 방법이 좋지 않을까라고 생각해본다. */

    buf1 = (short *)malloc(pcm1_size * sizeof(short));
    buf2 = (short *)malloc(pcm2_size * sizeof(short));
    buf = (short *)malloc( pcm1_size * sizeof(short));

/*
    buf1 = (unsigned char*)malloc(pcm1_size * sizeof(short));
    buf2 = (unsigned char*)malloc(pcm2_size * sizeof(short));
    buf = (unsigned char*)malloc( pcm1_size * sizeof(short));
*/

/* 저장할 형식이 short 이기 때문에 한번에 short사이즈 만큼 읽어서 pcm1_size 만큼 반복하여 읽어와서 buf1에 저장한다 */
    result = fread(buf1, sizeof(short), pcm1_size, in_pcm1_fd);
    if( result < pcm1_size)
    {
        printf("Input file1 read ERR %d, %d\n", result, pcm1_size);

    }

/* 위와 같다. */

    result = fread(buf2, sizeof(short), pcm2_size, in_pcm2_fd);
    if( result != pcm2_size)
    {
        printf("Input file2 read ERR %d, %d\n", result, pcm2_size);
    }



/* 실제로 mixing해주는 함수이다. 첫번째 인자로는 플에이타임이 긴 값이 저장되어 있는 변수, 두번째 값으로는 플레이타임이 짧은거 세번째 인자로는 mixning해서 저장될 변수, 첫번째 인자의 크기, 두번째 인자의 크기를 각각 넣어준다. */
    WavMix_1(buf1, buf2, buf, pcm1_size, pcm2_size);
   
/* WavMix함수를 통하여 저장한 것을 파일에 쓴다. */

    result = fwrite(buf, sizeof(short), pcm1_size, out_pcm_fd);
    if( result < pcm1_size)
    {
        printf("Output file write ERR %d\n", result);
    }



/* fflush 함수는 굳이 없어도 작동은 되는 것 같으나,,,,, 일단은 넣어준다. ㅋㅋ */
    fflush(out_pcm_fd);



/* malloc를 통해 할당한 메모리를 반납하고,,,, */
    free(buf1);
    free(buf2);
    free(buf);



/* open시킨 파일을 닫아준다 */

    fclose(in_pcm1_fd);
    fclose(in_pcm2_fd);
    fclose(out_pcm_fd);
}

void WavMix_1(short *In1, short *In2, short *out, int nIn1Size, int nIn2Size)
{
    int i;
    for(i = 0; i < nIn1Size; i++)
    {
        if(i < nIn2Size)
          //  out[i] = ((In1[i]/2) + (In2[i]/2));
         out[i] = (short)(((long)In1[i] + In2[i]) / 2);

/* 두번째 파일 사이즈 만큼 믹싱이 끝나면 첫번째 음원을 남은 부분 만큼 넣어준다. */
        else
            out[i] = In1[i] / 2;
    }
}




+ -

관련 글 리스트
71415 [질문]wav파일 mixing에 대하여 하안인 3241 2014/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.