Что такое алгоритм объединения файлов PCM? - PullRequest
2 голосов
/ 29 марта 2010

Что такое алгоритм объединения файлов PCM? У меня есть несколько файлов PCM, которые мне нужны, чтобы присоединиться к ним так, как будто ораторы говорят одновременно.

Итак, как объединить файлы PCM?

Ответы [ 2 ]

3 голосов
/ 29 марта 2010

Сначала найдите способ обработать их сэмпл за сэмплом, затем просто добавьте сэмплы из всех потоков вместе.

Вы столкнетесь с проблемой переполнения. Если это произойдет, просто закрепите полученное значение до максимального / минимального значения выборки.

Вы также можете предложить опцию масштабирования выходного сигнала перед зажимом для пользователя, и вы также можете сообщить некоторую статистику о том, как часто (в секунду или около того) происходит ограничение зажима, чтобы пользователь мог контролировать качество звука. .

0 голосов
/ 05 марта 2014

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 против Input 2. если alpha = 0.5, оба добавляются равномерно.

...