2

什么是加入 PCM 文件的算法?我有几个 PCM 文件,我需要像扬声器同时说话一样加入它们。

那么如何加入 PCM 文件呢?

4

2 回答 2

3

首先找到一种逐个样本处理它们的方法,然后将所有流中的样本加在一起。

你会遇到溢出的问题。如果发生这种情况,只需将结果值钳制为最大/最小样本值。

您可能还希望在钳制之前向用户提供缩放输出的选项,并且您可能还希望报告一些统计数据(每秒左右)钳制发生的频率,以便用户可以控制声音质量。

于 2010-03-28T23:38:28.240 回答
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 和 Input 2。如果 alpha =0.5,则两者都是均匀添加的。

于 2014-03-04T22:15:22.003 回答