文章目录
一、声道分离
#include <stdio.h>
#include <stdlib.h>
int pcm16_split(char* fileName)
{
FILE* fp = fopen(fileName,"rb+");
FILE* fp1 = fopen("outName1.pcm","wb+");
FILE* fp2 = fopen("ouName2.pcm","wb+");
//malloc = 4S是因为左声道和右声道的采样值是间隔存储的。每个采样值占用2Byte空间,一共4个字节。
unsigned char* readBuf = malloc(4);
//feof(p)用于判断文件指针p在其所指的文件中的位置,如果到文件末,函数返回1,否则返回0
while (!feof(fp))
{
fread(readBuf,1,4,fp);
//左声道
fwrite(readBuf,1,4,fp1);
//右声道
fwrite(readBuf, 1, 4, fp2);
}
free(readBuf);
fclose(fp);
fclose(fp1);
fclose(fp2);
return 0;
}
int main()
{
pcm16_split("shishi.raw");
return 0;
}
这样就可以分出两个文件来
用Adobe Audition 可以查看
带上耳机就可以感觉到不一样了。
二、对左边声道进行降半处理
#include <stdio.h>
#include <stdlib.h>
int pcm16_jiangban(char* fileName)
{
FILE* fp = fopen(fileName,"rb+");
FILE* fp1 = fopen("outName3.pcm","wb+");
unsigned char* readBuf = malloc(4);
//定义一个采集次数,每次采集4个字节,一直采集完
int cnt = 0;
while (!feof(fp))
{
short* readBuf1 = NULL;
fread(readBuf,1,4,fp);
readBuf1 = (short*)readBuf;
*readBuf1 = *readBuf1 / 2;
//左声道
fwrite(readBuf,1,2,fp1);
//右声道
fwrite(readBuf+2, 1, 2, fp1);
cnt++;
}
printf("readBuf cnt:%d\n", cnt);
free(readBuf);
fclose(fp);
fclose(fp1);
return 0;
}
int main()
{
pcm16_jiangban("shishi.raw");
return 0;
}
可以看出左边声道的声波确实是低一点。