加入PCM文件的算法是什么?我有几个PCM文件,我需要以类似扬声器同时加入它们的方式加入它们。
那么如何加入PCM文件?
答案 0 :(得分:3)
首先找到一种方法来逐个样本处理它们,然后只需将所有流中的样本一起添加。
您将遇到溢出问题。如果发生这种情况,只需将结果值钳制到最大/最小样本值。
您可能还希望在钳位给用户之前提供缩放输出的选项,并且您可能还想报告一些统计频率(每秒左右)夹紧的统计数据,因此用户可以控制声音质量
答案 1 :(得分: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文件,你需要用加权因子等来实现混合逻辑,例如。输出= alpha。 Input1 +(1- alpha)Input2 //其中alpha介于0和1之间取决于你喜欢如何添加输入1和输入2.如果alpha = 0.5两者都是均匀添加的。