2010-03-28 1 views
2

Что такое алгоритм для присоединения файлов PCM? У меня есть несколько файлов PCM, которые мне нужны, чтобы присоединиться к ним таким же образом, как и динамики Speac в одно и то же время.Что такое алгоритм для присоединения файлов 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, зависит от того, как вам нравится добавить Input 1 vs Input 2., если альфа = 0,5 оба добавляются равномерно.