2010-03-28 27 views
2

加入PCM文件的算法是什麼?我有幾個PCM文件需要以像揚聲器一樣的方式加入它們。加入PCM文件的算法是什麼?

那麼如何加入PCM文件?

+0

請參閱http://stackoverflow.com/questions/1784396/how-to-mix-audio-samples – 2010-03-28 23:36:26

回答

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 //其中alpha在0和1之間取決於你喜歡如何添加Input 1 vs Input 2.如果alpha = 0.5,均勻添加。