2010-03-28 5 views
2

PCM 파일에 가입하는 알고리즘이란 무엇입니까? 나는 여러 명의 PCM 파일을 가지고 있는데, 동시에 PCM 파일은 스피커가 동시에 발성하는 방식으로 결합해야한다.PCM 파일에 가입하기위한 알고리즘이란 무엇입니까?

그래서 PCM 파일에 가입 하시겠습니까?

+0

참조 http://stackoverflow.com/questions/1784396/how-to-mix-audio-samples –

답변

3

먼저 샘플별로 샘플을 처리 한 다음 모든 스트림의 샘플을 함께 추가하십시오.

오버플로 문제가 발생합니다. 그럴 경우 결과 값을 최대/최소 샘플 값으로 클램프하십시오.

사용자에게 클램핑하기 전에 출력 크기를 조정할 수있는 옵션을 제공하고 사용자가 소리를 어느 정도 제어 할 수 있도록 몇 가지 통계를 얼마나 자주 (초당 또는 그렇게) 클램핑하는지보고 할 수도 있습니다 품질.

0

PCM 오디오 파일에는 헤더와 오디오 데이터의 연속 샘플이 있습니다. 헤더를 읽고 합성 (혼합) 파일 헤더에서 사용할 수 있어야합니다.

FILE *fpIn; // Input file pointer 

char temp[2*FrameSize]; 

     char inFile[]="input_1.wav" ; 
char outFile[]="result.wav" ; 


if ((fpIn = fopen(inFile,"rb")) == NULL) 
    { 
     printf("Can't open input file\n"); 
     exit(0); 
    } 

    if ((fpOut = fopen(outFile,"wb")) == NULL) 
    { 
     printf("Can't open data file\n"); 
     exit(0); 
    } 


// Cut the wav headers 44 byte 
    fread(temp,sizeof(char),44,fpIn); // Remove wave header from input file 


for the writing back 
    fwrite(temp,sizeof(char),22*2,fpOut); // Add wave header from input file2 


while(fread(temp, sizeof(char),N*2,fpIn) == (unsigned short)(2*N)) 
    { 
     for (i=0;i<N;i++)    // Get PCM input data 
     { 
      input1[i] = (temp[2*i]&0xFF)|(temp[2*i+1]<<8); 
     } 

     // Mixing logic goes here 

     for (j=0, i=0;i<N;i++) 
     { 

      input[i]=0; 

      temp[j++] = input [i]&0xFF; 
      temp[j++] = (input [i]>>8)&0xFF; 
     } 
     fwrite(temp,sizeof(char),N*2,fpOut); // Save result 
    } 
    fclose(fpOut); 
    fclose(fpIn); 

위의 코드를 읽고 WAV 파일을 작성하는 방법을 보여줍니다, 당신은 예를 들어, 등등 가중 요소와 혼합 로직을 구현해야합니다. 출력 = 알파. Input1 + (1-alpha) Input2 // 알파가 0과 1 사이에있는 위치는 입력 1과 입력 2를 더하는 방법에 따라 다릅니다. 알파 = 0.5이면 둘 다 균등하게 추가됩니다.

관련 문제