2

PCMファイルを結合するためのアルゴリズムは何ですか?スピーカーが同時にspeacであるような方法でそれらを結合する必要があるいくつかのPCMファイルがあります。

では、PCMファイルを結合する方法は?

4

2 に答える 2

3

最初にサンプルごとにそれらを処理する方法を見つけ、次にすべてのストリームからのサンプルを一緒に追加します。

オーバーフローの問題が発生します。その場合は、結果の値を最大/最小サンプル値にクランプします。

また、ユーザーにクランプする前に出力をスケーリングするオプションを提供することもできます。また、ユーザーが音質をある程度制御できるように、クランプが行われる頻度(1秒あたりなど)を統計で報告することもできます。

于 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の間にあるかどうかは、Input1とInput2をどのように追加するかによって異なります。alpha=0.5の場合、両方が均等に追加されます。

于 2014-03-04T22:15:22.003 に答える