|
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;
}
}
|